web-dev-qa-db-ja.com

Ansibleタスクで動的に名前が付けられた変数をどのように登録しますか?

Ansibleタスクを使用して、2つのグループ(syslogおよびutmp)のグループ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

separate変数を登録しながら、このようなタスクをパラメーター化された形式にどのように統合できますか、アイテムごとに1つ、後で使用するために?したがってgoalは、後のタスクで使用できるグループ名に基づいた変数を持つことです。

gid_syslog.stdoutおよびgid_utmp.stdoutintフィルターを使用して、後のタスクで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
11
0xC0000022L

簡単な方法はないと思います。そしてregister with 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
8
yaegashi

前のソリューションのステートメントとは対照的に、ファクトを設定すると変数がサポートされます

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