Ansible:如何使用 yaml 指定数组或列表元素事实?

Ansible: How to specify an array or list element fact with yaml?

当我们检查主机变量时:

  - name: Display all variables/facts known for a host
    debug: var=hostvars[inventory_hostname]

我们得到:

ok: [default] => {
    "hostvars[inventory_hostname]": {
        "admin_email": "admin@surfer190.com", 
        "admin_user": "root", 
        "ansible_all_ipv4_addresses": [
            "192.168.35.19", 
            "10.0.2.15"
        ],...

如何指定 "ansible_all_ipv4_addresses" 列表的第一个元素?

这应该像在 Python 中一样工作。这意味着您可以访问带引号的键和带整数的索引。

  - set_fact:
      ip_address_1: "{{ hostvars[inventory_hostname]['ansible_all_ipv4_addresses'][0] }}"
      ip_address_2: "{{ hostvars[inventory_hostname]['ansible_all_ipv4_addresses'][1] }}"

  - name: Display 1st ipaddress
    debug:
      var: ip_address_1
  - name: Display 2nd ipaddress
    debug:
      var: ip_address_2

使用点符号

"{{ ansible_all_ipv4_addresses.0 }}"

我在尝试解析 Ansible.

中的命令结果时遇到了同样的挑战

所以结果是:

{
  "changed": true,
  "instance_ids": [
    "i-0a243240353e84829"
  ],
  "instances": [
    {
      "id": "i-0a243240353e84829",
      "state": "running",
      "hypervisor": "xen",
      "tags": {
        "Backup": "FES",
        "Department": "Research"
      },
      "tenancy": "default"
    }
    ],
    "tagged_instances": [],
  "_ansible_no_log": false
}

我想将 state 的值解析到 ansible 剧本中的 result 寄存器中。

我是这样做的:

由于结果是哈希数组的哈希,即 stateinstances 数组的索引 (0) 哈希中,我修改了剧本以查看这样:

---
- name: Manage AWS EC2 instance
  hosts: localhost
  connection: local
  # gather_facts: false
  tasks:
  - name: AWS EC2 Instance Restart
    ec2:
      instance_ids: '{{ instance_id }}'
      region: '{{ aws_region }}'
      state: restarted
      wait: True
    register: result

  - name: Show result of task
    debug:
      var: result.instances.0.state

我使用 register 将命令的值保存在名为 result 的变量中,然后使用以下变量在变量中获取 state 的值:

result.instances.0.state

这次当命令运行时,我得到的结果是:

TASK [Show result of task] *****************************************************
ok: [localhost] => {
    "result.instances.0.state": "running"
}

就这些了。

希望对您有所帮助