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

时间:2016-04-16 16:58:21

标签: ansible yaml ansible-facts

当我们检查hostvars时:

  - 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"列表的第一个元素?

3 个答案:

答案 0 :(得分:13)

使用点符号

"{{ ansible_all_ipv4_addresses.0 }}"

答案 1 :(得分:7)

这应该像在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

答案 2 :(得分: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 playbook 中的 result 寄存器中。

我是这样做的

由于结果是散列数组的散列,即 state 位于 0 数组的索引 (instances) 散列中,因此我将剧本修改为这样:

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

仅此而已。

我希望这会有所帮助