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


11

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

このようなタスクをパラメーター化されたフォームに統合するには、後で使用するために、項目ごとに1つの変数を登録ますか?したがって、目標は、後のタスクで使用できるグループ名に基づいた変数を持つことです。

私が使用しているintにフィルタをgid_syslog.stdoutしてgid_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

回答:


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の強みの1つです。そのため、この問題を回避すると、私に噛み付くようになります:)
0xC0000022L

1

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

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.