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


11

我正在尝试使用Ansible任务按名称检索两个组(syslogutmp)的组ID 。为了进行测试,我创建了一个剧本来从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}}gid[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

Answers:


8

我想这没有简单的方法。并且registerwith with_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

谢谢,我会尝试一下,但是我不太可能提出该解决方案,因为它比我复制所有内容(在我的问题的底部)更长,更复杂。可读性是Ansible的强项之一,因此,解决该问题将再次咬住我:)
0xC0000022L15年

设置事实支持变量,而不是先前解决方案的声明,请参见下面的答案
Vano

2

集合事实支持变量,与先前解决方案的陈述相反

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }

1
如果可以的话,我会给它+10!:)
Vano
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.