【问题标题】:Ansible - Zabbix - Inventory host hostname ipaddress - errorAnsible - Zabbix - 库存主机主机名 ipaddress - 错误
【发布时间】:2016-06-12 01:44:02
【问题描述】:

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下hosts清单文件中列出的主机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]

库存文件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 部分的有效输出)和一个错误(对于我试图使用直接获取 IP 地址的第二个 -debug 部分即不使用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 部分并 un-comment 最后一个 -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

【问题讨论】:

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


    【解决方案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']
    

    【讨论】:

    • 就我而言,最初我认为我必须将 with_items 与 with_dict 一起使用,但后来我认为只能使用 with_items。在我的回答中,我发现使用 [0] 是您提到的方式,并同意您的解释更好:)。谢谢。另一件事,我正在尝试使用 ansible_domain 或 facter_domain 查找我的服务器的域,但它们都不起作用。运行 ansible -m setup localhost 会显示它们的值。有什么想法吗?
    • ansible_domain 应该可以工作,如果您的主机使用其主机名正确配置。它基本上通过. 读取主机拆分的fqdn 并删除第一个元素。所以zabbix.dev-white.projectname.jenkins 将在域dev-white.projectname.jenkins 中。这不是您想要的还是对您不起作用?
    • 当我运行 ansible -m setup -i hosts zabbix_server 时,它会给我输出,其中 ansible_domain 和 facter_domain 都具有服务器域的有效值,即 dev-white.projectname.jenkins。但是,然后我正在运行 -debug: msg="My server is = {{ hostvars[groups['zabbix_server'][0]].inventory_hostname }} ---and--- domain is = {{ hostvars[groups ['zabbix_server'][0]].ansible_domain }}",它可以正确显示服务器名称(fqdn),但 .ansible_domain 或 .facter_domain 的值是 ' '(空白),它没有被填充。
    • 顺便说一句,主机清单文件没有设置 ansible_ssh_host=x.x.x.x (因为我发现这很快就会被弃用)。我的清单只使用 [zabbix_server] 和下一行 zabbix.dev-white.projectname.jenkins (如帖子中所述)。
    • 试试{{ hostvars[groups['zabbix_server'][0]]['inventory_hostname'] }}
    【解决方案2】:

    来吧 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 从返回的 LIST 变量中选择第一个元素,同时使用 hostvars[item] 或使用 直接方式(即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
    

    或 简单地说,您可以说:以下将起作用。

    - debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
      tags:
        - lilupandut
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2015-05-07
      • 1970-01-01
      • 2019-06-09
      相关资源
      最近更新 更多