无法在 playbook 中安装 ansible 代码

Unable to fit the ansible code in playbook

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

我的工作是找出属于主机类 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'

我从一些朋友那里得到了一个解决方案,但我无法适应我的 ansible 剧本。

- 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 }}"

您使用 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

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

(在查询之上,vars_files 也有问题)

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

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

查询中的最后一个过滤器returns单个字符串,如果有多个hostclass等于ess的主机,则需要更改它,它会生成一个列表.