1.9.2 / 1.9.4
CentOS 6.7
我正在试图找到存储在库存文件中的给定主机名的IP地址。如果您看到了我的剧本,我得到了我想要找到的主机名的IP (参见第一个-debug部分),但那时我使用了"with_items“并将”{groups‘’zabbix_server‘}“作为一个项传递。
但现在我想在不使用hostnameitem....的情况下找到IP方法,即直接使用组‘’zabbix_server‘的方式。如何获得zabbix_server 直接下主机库存文件中列出的主机IP地址?也就是说,在Ansible中不使用"with_items“行/特性。
我在这里遗漏了什么才能得到这些错误。我尝试过一些类似的在线博客/帖子,但这些都没有帮助。用[].[]或“某物”的其他方式也没有帮助,因此我得到:
模板msg="IP is= {{ msg=}}“失败:模板字符串时模板错误:预期名称或编号
或者如果我用这种方式
IP is= {{ hostvars[groups['zabbix_server']]['ansible_default_ipv4']['address'] }}"
我知道这个错误:
. =>一个或多个未定义的变量:'HostVars‘对象没有元素'zabbix.dev-white.projectname.jenkins
库存文件主机包含:
[zabbix_server]
zabbix.dev-white.projectname.jenkins
我的剧本文件包含:
- 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
如果我运行上面的剧本,我会得到以下输出(来自第一个-debug部分的有效输出)和一个错误(对于第二个-debug部分,我试图使用直接的方式到达IP地址,即不使用hostvarsitem)。
$ 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部分和un-注释最后一条-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
发布于 2016-02-29 07:20:33
我不清楚您为什么不想使用您使用的列表的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']
发布于 2016-02-29 07:17:39
别这样!-我需要更仔细地观察这些。
我想下面的错误对我的暗示有所帮助。hostvarsitem变量中的值(当通过with_items传递时:“{group‘’zabbix_server‘}}”作为列表变量的类型出现。
没有元素'zabbix.dev-white.projectname.jenkins'的'HostVars‘对象
我的主要目的是将zabbix _agent的conf文件更改为两个变量:Server=x.x和ServerActive=zabbix.server.with.fqdn ,而不需要硬编码zabbix服务器,也不需要在角色的默认/main.yml文件中创建额外的变量,用于存储zabbix服务器的主机名(Fqdn)和它的IP地址。
我想使用库存文件(根据我的帖子),并选择包含在其中的任何zabbix_server组。
解决方案是使用告诉Ansible主机从返回的列表变量中选择第一个元素,同时使用hostvarsitem或使用直接方法(即组‘’zabbix_server‘)。
以下部分使用with_items。
在第一部分,我使用主机[item.three].它可以显示扎比x服务器的IP地址。
第二部分,尽管我使用的是with_items,但我没有使用item.three变量...as,我使用的是hostvars[group[.].这条路(直接)也起作用了。
好好享受吧。
- 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
或者简单地说,你可以说:以下将有效。
- debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
tags:
- lilupandut
https://stackoverflow.com/questions/35692438
复制相似问题