Ansible - Zabbix - 库存主机主机名ipaddress - 错误

时间:2016-02-29 05:18:41

标签: ip-address ansible ansible-playbook hostname inventory

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

2 个答案:

答案 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