无法在playbook中使用ansible代码

时间:2018-04-12 07:53:30

标签: ansible ansible-2.x ansible-facts ansible-template

这是以Yaml格式存储的日志文件。

我的工作是找出属于hostclass ess的主机名,在这种情况下答案是host002。

hostinfo:
  'host001':
    ip: 192.168.43.10
    hostclass: 'puppet'
  'host002':
    ip: 192.168.43.11
    hostclass: 'ess'
  'host003':
    ip: 192.168.43.21
    hostclass: 'mdb'

我从一位朋友那里得到了一个解决方案,但我无法将其与我的安全手册相符。

- debug:
    msg: "{{ hostinfo|dictsort|selectattr('1.hostclass', 'equalto', 'ess')|first|first }}"

我正在写剧本,这是错的,但我无法弄清楚如何在我的剧本中使用该代码。任何人都可以帮我修改我的代码。

---

- hosts: somehost
  gather_facts: no
  vars_files:
    file: sometext.yaml
    name: sometext

  - debug:
        msg: "{{ hostinfo|dictsort|selectattr('1.hostclass', 'equalto', 'ess')|first|first }}"

2 个答案:

答案 0 :(得分:1)

您正在以错误的方式使用Ansible。可以编写一个复杂的查询(你可以使用json_query过滤器),但是阅读和维护起来非常困难。

您需要做什么:不使用hostclass: something,而是使用群组。 小组就是为此而设计的。

您的广告资源应如下所示:

[puppet]
host001 ip=192.168.43.10
[ess]
host002 ip=192.168.43.11
[mdb]
host003 ip=192.168.43.21

[hostinfo:children]
puppet
ess
mdb

之后,如果您需要它们(例如groups.puppet),查询组是微不足道的,并且可以轻松访问其变量:(hostvars[groups.puppet][0]).ip

答案 1 :(得分:0)

这是您一直在寻找的代码:

(在查询顶部,您还遇到vars_files问题)

tasks:
  - include_vars:
      file: ./sometext.yaml
      name: sometext

  - debug:
      msg: "{{ sometext.hostinfo | dict2items | json_query('[?value.hostclass==`ess`] | [0].key') }}"

查询中的最后一个过滤器返回一个字符串,如果有多个hostclass等于ess的主机,则需要对其进行更改并生成一个列表。