首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >抗- Zabbix -库存主机主机名ipaddress地址.错误

抗- Zabbix -库存主机主机名ipaddress地址.错误
EN

Stack Overflow用户
提问于 2016-02-29 05:18:40
回答 2查看 1.9K关注 0票数 0

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=}}“失败:模板字符串时模板错误:预期名称或编号

或者如果我用这种方式

代码语言:javascript
运行
复制
IP is= {{ hostvars[groups['zabbix_server']]['ansible_default_ipv4']['address'] }}"

我知道这个错误:

. =>一个或多个未定义的变量:'HostVars‘对象没有元素'zabbix.dev-white.projectname.jenkins

库存文件主机包含:

代码语言:javascript
运行
复制
[zabbix_server]
zabbix.dev-white.projectname.jenkins

我的剧本文件包含:

代码语言:javascript
运行
复制
- 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)。

代码语言:javascript
运行
复制
$ 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地址“,但它仍然出错。

这一次的错误/输出如下:

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-29 07:20:33

我不清楚您为什么不想使用您使用的列表的item。所有示例都有with_items循环,所以您也可以在所有示例中使用item -

让我们来看看你的任务:

代码语言:javascript
运行
复制
- 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将是获得循环的正确元素的方法。

代码语言:javascript
运行
复制
hostvars[item]

因为item保存了值zabbix.dev-white.projectname.jenkins

如果根本不涉及循环,那么可以使用zabbix_server组的第一个主机,如下所示:

代码语言:javascript
运行
复制
hostvars[groups['zabbix_server'][0]]

再说一遍:groups['zabbix_server']是一个列表,[0]访问该列表的第一项。但是,如果你是在循环中,实际上是没有意义的这样做。

代码语言:javascript
运行
复制
hostvars[groups['zabbix_server'][0]]['ansible_default_ipv4']['address']

是相同的

代码语言:javascript
运行
复制
hostvars[item]['ansible_default_ipv4']['address']
票数 1
EN

Stack Overflow用户

发布于 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[.].这条路(直接)也起作用了。

好好享受吧。

代码语言:javascript
运行
复制
- 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

或者简单地说,你可以说:以下将有效。

代码语言:javascript
运行
复制
- debug: msg="3 -- Zabbix server= {{ inventory_hostname }} and its IP is= {{ hostvars[groups['zabbix_server'][0]].ansible_default_ipv4.address }}"
  tags:
    - lilupandut
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35692438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档