Ansible 1.9.2 / 1.9.4
CentOS 6.7
我正在尝试查找存储在库存文件中的给定主机名的IP地址。如果你看到我的剧本,我得到了我想要找到的主机名的IP(参见第一个-debug部分)但是当我使用“with_items”并传递“{{groups ['zabbix_server']}}时“作为一个项目。
但是现在我试图找到IP而不使用主机名[ item ] ....方式,即直接使用groups ['zabbix_server']方式。如何在zabbix_server 下直接下获取主机清单文件中列出的主机的IP地址?即在Ansible中不使用“with_items”行/功能。
我在这里错过了这些错误。我尝试了一些在线类似的博客/帖子,但那些没有帮助。使用[]。[]或['something]。['somethingelse']方式也无济于事,我得到了:
模板失败msg =“IP is = {{hostvars [groups ['zabbix_server']]。[ansible_default_ipv4.address]}}”:模板错误,模板字符串:预期名称或数字
或 如果我这样使用:
IP is= {{ hostvars[groups['zabbix_server']]['ansible_default_ipv4']['address'] }}"
我收到此错误:
... =>一个或多个未定义的变量:'HostVars'对象没有元素['zabbix.dev-white.projectname.jenkins]
广告资源文件主机包含:
[zabbix_server]
zabbix.dev-white.projectname.jenkins
我的playbook文件包含:
- debug: msg="Zabbix server= {{ item }} and its IP is= {{ hostvars[item].ansible_default_ipv4.address }}"
with_items:
- "{{ groups['zabbix_server'] }}"
tags:
- lilupandut
- debug: msg="Zabbix server= {{ item }} and its IP is= {{ hostvars[groups['zabbix_server']][ansible_default_ipv4.address] }}"
with_items:
- "{{ groups['zabbix_server'] }}"
tags:
- lilupandut
#- debug: msg="Zabbix server= {{ item }} and its IP is= {{ groups['zabbix_server'][ansible_default_ipv4.address] }}"
# with_items:
# - "{{ groups['zabbix_server'] }}"
# tags:
# - lilupandut
如果我运行上面的playbook,我得到以下输出(第一个-debug部分的有效输出)和一个错误(对于第二个-debug部分,我试图使用直接获取IP地址的方式即不使用hostvars [item] )。
$ ansible-playbook zabbix-setup.yml -i hosts -u koba --private-key ${DEPLOYER_KEY_FILE} -t lilupandut
PLAY [zabbix_server] **********************************************************
GATHERING FACTS ***************************************************************
ok: [zabbix.dev-white.projectname.jenkins]
TASK: [zabbix_install | debug msg="Zabbix server= {{ item }} and its IP is= {{ hostvars[item].ansible_default_ipv4.address }}"] ***
ok: [zabbix.dev-white.projectname.jenkins] => (item=zabbix.dev-white.projectname.jenkins) => {
"item": "zabbix.dev-white.projectname.jenkins",
"msg": "Zabbix server= zabbix.dev-white.projectname.jenkins and its IP is= 10.130.64.18"
}
TASK: [zabbix_install | debug msg="Zabbix server= {{ item }} and its IP is= {{ groups['zabbix_server'][ansible_default_ipv4.address] }}"] ***
fatal: [zabbix.dev-white.projectname.jenkins] => One or more undefined variables: 'HostVars' object has no element [zabbix.dev-white.projectname.jenkins]
FATAL: all hosts have already failed -- aborting
如果我评论中间-debug部分和取消评论最后一个-debug语句,那么我接近我正在寻找的“IP地址“但它仍然出错。
这次错误/输出如下:
projectname: [zabbix_install | debug msg="Zabbix server= {{ item }} and its IP is= {{ groups['zabbix_server'][ansible_default_ipv4.address] }}"] ***
fatal: [zabbix.dev-white.projectname.jenkins] => One or more undefined variables: 'list' object has no attribute '10.130.64.18'
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/confman/zabbix-setup.retry
zabbix.dev-white.projectname.jenkins : ok=2 changed=0 unreachable=1 failed=0
答案 0 :(得分:1)
我不清楚为什么你不想使用你使用的列表的item
。您的所有示例都有with_items
循环,因此您也可以在所有示例中使用item
-
让我们来看看你的这个任务:
- debug: msg="Zabbix server= {{ item }} and its IP is= {{ hostvars[groups['zabbix_server']][ansible_default_ipv4.address] }}"
with_items:
- "{{ groups['zabbix_server'] }}"
tags:
- lilupandut
所以你循环遍历groups['zabbix_server']
这是一个主机列表。 item
然后会引用该列表中的每个项目。那么在这种情况下不使用item
的重点是什么,你在列表中循环?
在您的任务中,您尝试使用hostvars[groups['zabbix_server']][ansible_default_ipv4.address]
。 hostvars
是哈希,groups['zabbix_server']
是列表。您不能将列表用作哈希键,这就是您收到如下错误的原因:
我收到此错误:... =>一个或多个未定义的变量:'HostVars'对象没有元素['zabbix.dev-white.projectname.jenkins]
当错误消息尝试解释时,它正在尝试使用键['zabbix.dev-white.projectname.jenkins']
查找哈希元素。
如上所述,我不太清楚您尝试存档的内容。使用item
将是获取循环的正确元素的方法。
hostvars[item]
因为item
包含值zabbix.dev-white.projectname.jenkins
。
如果你没有涉及任何循环,你可以使用zabbix_server
组的第一个主机:
hostvars[groups['zabbix_server'][0]]
再次使用单词:groups['zabbix_server']
是一个列表[0]
访问该列表的第一项。但无论如何,如果你处于循环中,实际上没有必要这样做。
hostvars[groups['zabbix_server'][0]]['ansible_default_ipv4']['address']
与
相同hostvars[item]['ansible_default_ipv4']['address']
答案 1 :(得分:0)
来吧Ansible! - 我需要更仔细地观察这些。
我猜以下错误帮助了我提示。 hostvars [item]变量中的值(通过with_items传递:“{{groups ['zabbix_server']}}”作为一种LIST变量出现。
'HostVars'对象没有元素['zabbix.dev-white.projectname.jenkins']
我的主要目的是为两个变量更改zabbix_agent的conf文件:Server = xxxx和ServerActive = zabbix.server.with.fqdn 没有硬编码zabbix服务器且没有在角色的default / main.yml文件中创建额外的变量,用于存储zabbix服务器的主机名(fqdn)及其IP地址。
我想使用库存文件(根据我的帖子)并选择其中包含的任何[zabbix_server]组。
解决方案是使用 [0] 告诉Ansible hostvars在使用 hostvars [item] 或使用<时从返回的LIST变量中选择第一个元素strong> direct 方式(即groups ['zabbix_server'])。
以下部分使用with_items。
在第一部分中,我使用的是hostvars [item.three [0]] .....并且它可以显示zabbix服务器的IP地址。
第二部分,即使我使用with_items,我也没有使用item.three变量......因为我正在使用hostvars [groups [.... [0]] ....方式(直接),它也有效。
享受。
- debug: msg="1 -- Zabbix server= {{ item.three }} and its IP is= {{ hostvars[item.three[0]].ansible_default_ipv4.address }}"
with_items:
- { one: "1", two: "two 22", three: "{{ groups['zabbix_server'] }}" }
tags:
- lilupandut
- debug: msg="2 -- Zabbix server= {{ item.three }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
with_items:
- { one: "1", two: "two 22", three: "{{ groups['zabbix_server'] }}" }
tags:
- lilupandut
OR 简单来说,你可以说:以下内容可行。
- debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
tags:
- lilupandut