使用 Ansible 格式化列表时结果不一致

Inconsistent results while formatting a list with Ansible

我正在使用 Ansible 根据几个参数动态构建库存。

我从我们的 CMDB API 获取原始信息,然后使用 set_fact 格式化 FQDN 列表。

那些 FQDN 总是遵循相同的公式,所以看起来很简单,但 Ansible 似乎只将模板应用于第一项。

代码:

  - name: populate list of all hosts
    set_fact:
      all_hosts: '{{ all_hosts + [ "{{item.value.fields.friendlyname | lower}}" "." "{{item.value.fields.friendlyname[:3]|lower}}" ".sncoia.lan" ] }}'
    loop: "{{ hostname.json.objects | dict2items }}"
    when: 
    - item.value.fields.friendlyname | length == 12

  - debug: var=all_hosts

结果(为简洁起见进行了删减):

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "all_hosts": [
        "devlappaps03.dev.sncoia.lan",
        "{{item.value.fields.friendlyname | lower}}.{{item.value.fields.friendlyname[:3]|lower}}.sncoia.lan",
        "{{item.value.fields.friendlyname | lower}}.{{item.value.fields.friendlyname[:3]|lower}}.sncoia.lan",

给定数据进行测试

    hostname:
      json:
        objects:
          foo:
            fields:
              friendlyname: devlappaps03
          bar:
            fields:
              friendlyname: devlappaps02
          baz:
            fields:
              friendlyname: devlappaps01

正确连接 FQDN。例如

    - set_fact:
        all_hosts: "{{ all_hosts|d([]) + [_fqdn] }}"
      loop: "{{ hostname.json.objects|dict2items }}"
      when: item.value.fields.friendlyname|length == 12
      vars:
        _fqdn_list:
          - "{{ item.value.fields.friendlyname|lower }}"
          - "{{ item.value.fields.friendlyname[:3]|lower }}"
          - "sncoia.lan"
        _fqdn: "{{ _fqdn_list|join('.') }}"

给予

all_hosts:
  - devlappaps03.dev.sncoia.lan
  - devlappaps02.dev.sncoia.lan
  - devlappaps01.dev.sncoia.lan