Ansible获取清单主机组的主机名和IP

Ansible获取清单主机组的主机名和IP,ansible,ansible-2.x,ansible-inventory,ansible-facts,Ansible,Ansible 2.x,Ansible Inventory,Ansible Facts,我正在尝试获取主机名和主机的IP地址,并将它们保存到一个文件中 我有这个解决办法 -名称:使用主机和IP地址创建文件。 时间:组中的资源清册\u主机名['local'] 线条填充: dest:{store_files_path}/{{ansible_date_time.date}/{{ansible_date_time.time}}/hosts.txt” 创建:是 行:“{{hostvars[inventory\u hostname].ansible\u hostname}:{{{hostvar

我正在尝试获取主机名和主机的IP地址,并将它们保存到一个文件中

我有这个解决办法

-名称:使用主机和IP地址创建文件。
时间:组中的资源清册\u主机名['local']
线条填充:
dest:{store_files_path}/{{ansible_date_time.date}/{{ansible_date_time.time}}/hosts.txt”
创建:是
行:“{{hostvars[inventory\u hostname].ansible\u hostname}:{{{hostvars[inventory\u hostname].ansible\u default\u ipv4.address}”
但问题是在我的hosts文件中,我有两个组,
local
Servers
。我只想获取
服务器
,而不是
本地
组,该组仅为
本地主机

我试过下面这一行,但它不起作用,它给了我一个错误

行:{{{hostvars[groups['Servers'][0]].ansible_hostname}:{{{hostvars[groups['Servers'][0]].ansible_default_ipv4.address}”

我已经到处搜索过了,这就是我发现的,我应该怎么做呢?

我会使用jinja模板来实现这一点:

#hosts_file.j2
{%用于组['Servers']%中的服务器}
{{hostvars[server]['ansible\u facts']['hostname']}:{{{hostvars[server]['ansible\u facts']['default\u ipv4']['address']}
{%endfor%}
-hosts:localhost
任务:
-名称:从模板创建主机文件
模板:
src:hosts_file.j2
dest:{store_files_path}/{{ansible_date_time.date}/{{ansible_date_time.time}}/hosts.txt

你把这件事弄得非常复杂

  • 您不必通过
    hostvars
    来实现您想要的功能,它们主要是为您提供Ansible当前正在运行的主机的信息。Ansible为主持人收集的事实也是如此
  • 对于手头的问题,您可以使用另一个,它将允许您以列表的形式获取您当前操作的主机所在的组。因此,获取作为组一部分的主机非常简单,只需执行以下操作:“‘对组名称感兴趣的组’”
  • 因此,考虑到库存:

    全部:
    变量:
    ansible_python_解释器:/usr/bin/python3
    儿童:
    本地:
    主持人:
    本地主机:
    服务器:
    主持人:
    foo.example.org:
    ansible_主机:172.17.0.2
    
    还有剧本:

    -主机:所有
    收集事实:是的
    任务:
    -调试:
    msg:{{ansible_hostname}}:{{{ansible_default_ipv4.address}
    当:“‘服务器’在组_名称中”
    
    这就产生了重述:

    播放[全部]**********************************************************************************************************
    任务[收集事实]**********************************************************************************************
    确定:[本地主机]
    ok:[foo.example.org]
    任务[调试]********************************************************************************************************
    正在跳过:[localhost]
    确定:[foo.example.org]=>{
    “msg”:“8088bc73d8cf:172.17.0.2”
    }
    重演**********************************************************************************************************
    foo.example.org:ok=2 changed=0 unreachable=0 failed=0 skipped=0 Saved=0 ignored=0
    localhost:ok=1已更改=0不可访问=0失败=0已跳过=1已获救=0已忽略=0
    

    现在,如果你在自己的剧本中改编了这一点,你应该很乐意:

    -名称:使用主机和IP地址创建文件。
    线条填充:
    dest:{store_files_path}/{{ansible_date_time.date}/{{ansible_date_time.time}}/hosts.txt”
    创建:是
    行:“{ansible\u hostname}:{{{ansible\u default\u ipv4.address}”
    当:“‘服务器’在组_名称中”
    委托给:localhost
    
    嘿,我不知道templates/jinja templates,因此请您详细说明您的解决方案并将其作为一项任务。我是否应该将hosts_file.j2放在templates文件夹中?我在下面添加了任务调用。基本上,将第一个bloc粘贴到名为hosts_file.j2的文件中,该文件是您的模板。然后将第二组(任务)添加到您的剧本中。就这些。第二个块调用“模板”模块,该模块将把hosts_file.j2模板呈现到目标文件中。是的,templates文件夹是存储模板的好地方,ansible将在那里查找。好的,让我试试。面临一些问题。。错误:致命:[localhost]:失败!=>{“changed”:false,“msg”:“AnsibleUndefinedVariable:'ansible.vars.hostvars.HostVarsVars对象'没有属性'ansible_host'”}致命:[192.168.1.14]:失败!=>{“changed”:false,“msg”:“AnsibleUndefinedVariable:'ansible.vars.hostvars.HostVarsVars对象'没有属性'ansible_host'”}错误是什么?错误如下:“该任务包含一个带有未定义变量的选项。错误是:“ansible.vars.hostvars.HostVarsVars对象”没有属性“ansible\u hostname我猜您将
    hosts:all
    更改为
    hosts:local
    。这是正确的吗?我没有使用这样的,我使用的是:inventory\u hostname in groups['local']我有。您如何使用主机?写下你的整个剧本。但我想得到服务器的主机名。。。不是您在主机文件中分配的主机名。在我的hosts文件中,我刚刚放置了[group name],然后就是IP。这样看来也太复杂了。你试过了吗?你看过我回答中的摘要了吗
    foo.example.org
    是我的主机文件中的名称,
    “msg”:“8088bc73d8cf:172.17.0.2”
    是Ansible recap输出
    inventory\u hostname
    确实会让我产生
    foo.example.org
    ,但这里我使用的是
    ansible\u hostname
    ,对于我的主机,
    8088bc73d8cf
    。我尝试过了,但它会将输出保存到服务器,而不是本地主机,因为时间的原因……但这也是一种很好的方法,那么我该如何制作d