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

发布于 2025-01-11 20:07:18 字数 1158 浏览 5 评论 0原文

我正在使用 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",

I'm using Ansible to build inventories dynamically according to several parameters.

I get raw info from our CMDB's API, then use set_fact to format a list of FQDNs.

Those FQDNs always follow the same formula, so it looks easy, but Ansible only seems to apply the templating to the first item.

The code:

  - 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

The result (abridged for brevity):

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失与倦" 2025-01-18 20:07:18

给定测试数据

    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

Given the data for testing

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

Properly concatenate the FQDN. For example

    - 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('.') }}"

gives

all_hosts:
  - devlappaps03.dev.sncoia.lan
  - devlappaps02.dev.sncoia.lan
  - devlappaps01.dev.sncoia.lan
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文