如何在 Ansible 任务中注册动态命名变量?

如何在 Ansible 任务中注册动态命名变量?

我正在尝试使用 Ansible 任务按名称检索两个组 (syslog和) 的组 ID。utmp出于测试目的,我创建了一个剧本来从 Ansible 主机本身检索信息。

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gid_{{item}}
      failed_when: gid_{{item}}.rc != 0
      changed_when: false
      with_items:
        - syslog
        - utmp

不幸的是,我在运行剧本时收到以下错误:

fatal: [hostname] => error while evaluating conditional: gid_syslog.rc != 0

如何在注册时将这样的任务合并为参数化形式分离变量,一每件,以供以后使用?所以目标是拥有基于组名称的变量,然后可以在以后的任务中使用这些变量。

我在后面的任务中使用int过滤器gid_syslog.stdoutgid_utmp.stdout根据 GID 进行一些计算。


我也尝试使用gid.{{item}}andgid[item]而不是gid_{{item}}无济于事。


与上面的相比,以下效果很好:

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine syslog GID
      shell: "getent group syslog | cut -d : -f 3"
      register: gid_syslog
      failed_when: gid_syslog.rc != 0
      changed_when: false
    - name: Determine utmp GID
      shell: "getent group utmp | cut -d : -f 3"
      register: gid_utmp
      failed_when: gid_utmp.rc != 0
      changed_when: false

答案1

Setfact支持变量,与之前解决方案的声明相反

- set_fact:
    "{{ item.name }}": "{{ item.val }}"
  when: item.name not in vars           # this is optional. prevents overwriting vars
  with_items:
    - { name: test, val: myalue }
    - { name: notest, val: novalue }

答案2

我想没有简单的方法可以做到这一点。而registerwithwith_items循环只是将它们的所有结果放入一个数组中variable.results。尝试执行以下任务:

  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gids
      changed_when: false
      with_items:
        - syslog
        - utmp
    - debug:
        var: gids
    - assert:
        that:
          - item.rc == 0
      with_items: gids.results
    - set_fact:
        gid_syslog: "{{gids.results[0]}}"
        gid_utmp: "{{gids.results[1]}}"
    - debug:
        msg: "{{gid_syslog.stdout}} {{gid_utmp.stdout}}"

但是,您可以在set_fact键中使用变量扩展,如下所示:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results

相关内容