1. ホーム
  2. ansible

Ansibleのset_factを使用して、レジスタの結果から辞書を作成する

2023-08-30 16:26:56

質問

Ansibleで、私は register という変数にタスクの結果を保存します。 people . いらないものを省くと、こんな構造になっている。

{
    "results": [
        {
            "item": {
                "name": "Bob"
            },
            "stdout": "male"
        },
        {
            "item": {
                "name": "Thelma"
            },
            "stdout": "female"
        }
    ]
}

に続く set_fact タスクで、このような辞書を持つ新しい変数を生成します。

{
    "Bob": "male",
    "Thelma": "female"
}

これは可能かもしれませんが、今のところうまくいかずに堂々巡りをしています。

どのように解決するのですか?

最終的にたどり着いたと思います。

タスクはこんな感じです。

- name: Populate genders
  set_fact:
    genders: "{{ genders|default({}) | combine( {item.item.name: item.stdout} ) }}"
  with_items: "{{ people.results }}"

これは、各ダイコンをループして ( item ) をループします。 people.results のような新しいディクショナリーを作成します。 {Bob: "male"} のような新しいディクショナリーを作成し、さらに combine() は、その新しいディクショ ンを genders のような配列で終わります。

{
    "Bob": "male",
    "Thelma": "female"
}

キーを想定している( name は一意であると仮定しています。


を使ってループさせるのがずっと簡単なので、私は実際に辞書のリストが欲しいことに気づきました。 with_items :

- name: Populate genders
  set_fact:
    genders: "{{ genders|default([]) + [ {'name': item.item.name, 'gender': item.stdout} ] }}"
  with_items: "{{ people.results }}"

これは、既存のリストと単一のdictを含むリストとを結合し続けています。最終的には genders のような配列になります。

[
    {'name': 'Bob', 'gender': 'male'},
    {'name': 'Thelma', 'gender': 'female'}
]