Ansible - Zabbix - 清点主机hostname ipaddress - 错误
Ansible - Zabbix - Inventory host hostname ipaddress - error
Ansible 1.9.2 / 1.9.4
CentOS 6.7
我正在尝试查找存储在清单文件中的给定主机名的 IP 地址。如果你看到我的剧本,我得到了我试图找到的主机名的 IP(请参阅第一个 -debug 部分)但那是我使用 "with_items" 并传递 "{{ groups['zabbix_server'] }}”作为一个项目。
但现在我试图在不使用主机名[item]的情况下找到IP...方式,即直接使用groups['zabbix_server']方式。如何直接zabbix_server下的主机清单文件中列出主机的IP地址?即不在 Ansible 中使用 "with_items" line/feature。
我在这里缺少什么来得到这些错误。我在网上尝试了一些类似的 blogs/posts 但这些都没有帮助。使用 [].[] 或 ['something].['somethingelse'] 方式也无济于事,为此我得到:
无法模板消息="IP is= {{ hostvars[groups['zabbix_server']].[ansible_default_ipv4.address] }}":模板化字符串时出现模板错误:预期名称或编号
或
如果我这样使用:
IP is= {{ hostvars[groups['zabbix_server']]['ansible_default_ipv4']['address'] }}"
我收到这个错误:
... => One or more undefined variables: 'HostVars' object has no element ['zabbix.dev-white.projectname.jenkins]
清单文件 hosts 包含:
[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 地址,即 不使用 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
如果我 comment 中间的 -debug 部分和 un-comment 最后的 -debug 语句,那么我接近什么我正在寻找 "IP address" 但它仍然出错。
这次错误/输出为:
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
Ansible 加油!! ——我需要更仔细地观察这些。
我想下面的错误帮助了我提示。 hostvars[item] 变量中的值(当通过 with_items: "{{ groups['zabbix_server'] }}" 作为一种 LIST 变量出现时。
'HostVars'对象没有元素['zabbix.dev-white.projectname.jenkins']
我的主要目的是为两个变量更改 zabbix_agent 的配置文件:Server=x.x.x.x 和 ServerActive=zabbix.server.with.fqdn without硬编码zabbix服务器并且没有在角色的default/main.yml文件中创建额外的变量来存储zabbix服务器的主机名(fqdn)及其IP地址。
我想使用库存文件(根据我的 post)并选择其中包含的任何 [zabbix_server] 组。
解决方案是使用 [0] 告诉 Ansible hostvars 从返回的 LIST 变量中选择第一个元素,同时使用 hostvars[item] 或使用 直接 方式(即组 ['zabbix_server'])。
以下部分使用 with_items。
在第一部分中,我使用了 hostvars[[=53=][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
或
简单地说,你可以说:以下将起作用。
- debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
tags:
- lilupandut
我不清楚您为什么不想使用所用列表的 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']
是一个列表。您不能将列表用作哈希键,这就是为什么会出现这样的错误:
I get this error: ... => One or more undefined variables: 'HostVars' object has no element ['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']
Ansible 1.9.2 / 1.9.4
CentOS 6.7
我正在尝试查找存储在清单文件中的给定主机名的 IP 地址。如果你看到我的剧本,我得到了我试图找到的主机名的 IP(请参阅第一个 -debug 部分)但那是我使用 "with_items" 并传递 "{{ groups['zabbix_server'] }}”作为一个项目。
但现在我试图在不使用主机名[item]的情况下找到IP...方式,即直接使用groups['zabbix_server']方式。如何直接zabbix_server下的主机清单文件中列出主机的IP地址?即不在 Ansible 中使用 "with_items" line/feature。
我在这里缺少什么来得到这些错误。我在网上尝试了一些类似的 blogs/posts 但这些都没有帮助。使用 [].[] 或 ['something].['somethingelse'] 方式也无济于事,为此我得到:
无法模板消息="IP is= {{ hostvars[groups['zabbix_server']].[ansible_default_ipv4.address] }}":模板化字符串时出现模板错误:预期名称或编号
或 如果我这样使用:
IP is= {{ hostvars[groups['zabbix_server']]['ansible_default_ipv4']['address'] }}"
我收到这个错误:
... => One or more undefined variables: 'HostVars' object has no element ['zabbix.dev-white.projectname.jenkins]
清单文件 hosts 包含:
[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 地址,即 不使用 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
如果我 comment 中间的 -debug 部分和 un-comment 最后的 -debug 语句,那么我接近什么我正在寻找 "IP address" 但它仍然出错。
这次错误/输出为:
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
Ansible 加油!! ——我需要更仔细地观察这些。
我想下面的错误帮助了我提示。 hostvars[item] 变量中的值(当通过 with_items: "{{ groups['zabbix_server'] }}" 作为一种 LIST 变量出现时。
'HostVars'对象没有元素['zabbix.dev-white.projectname.jenkins']
我的主要目的是为两个变量更改 zabbix_agent 的配置文件:Server=x.x.x.x 和 ServerActive=zabbix.server.with.fqdn without硬编码zabbix服务器并且没有在角色的default/main.yml文件中创建额外的变量来存储zabbix服务器的主机名(fqdn)及其IP地址。
我想使用库存文件(根据我的 post)并选择其中包含的任何 [zabbix_server] 组。
解决方案是使用 [0] 告诉 Ansible hostvars 从返回的 LIST 变量中选择第一个元素,同时使用 hostvars[item] 或使用 直接 方式(即组 ['zabbix_server'])。
以下部分使用 with_items。
在第一部分中,我使用了 hostvars[[=53=][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
或 简单地说,你可以说:以下将起作用。
- debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
tags:
- lilupandut
我不清楚您为什么不想使用所用列表的 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']
是一个列表。您不能将列表用作哈希键,这就是为什么会出现这样的错误:
I get this error: ... => One or more undefined variables: 'HostVars' object has no element ['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']