Host_vars で辞書の特定のキーをオーバーライドします。

Host_vars で辞書の特定のキーをオーバーライドします。

私は次の定義を持っていますgroups_vars/all.yml

users:
  johndoe:
    name: John Doe
    username: john
  janedoe:
    name: Jane Doe
    username: jane

特定のホストの場合は、次のように扱いたいと思いますhosts_vars

users.johndoe.username: johnd

次のようにフィルタを組み合わせてみると機能しません。

users: "{{ users | combine({'johndoe': users.johndoe | combine({'username': 'johnd'}) })}}"

Ansibleで再帰ループが発生します。

私はこれをAnsible方法で実行しないようです。変数構造を「平面化」してそのように簡単に上書きすることはできますが、これにより、タスク内の変数構造を簡単に繰り返すことができません。この問題を解決するために推奨される方法は何ですか?

答え1

置くDEFAULT_HASH_BEHAVIOUR到着マージ。たとえば、所与の在庫

shell> cat hosts
test_11
test_12
test_13

スクリプト

shell> cat pb.yml 
- hosts: all
  tasks:
    - debug:
        var: users

そしてグループ変数

shell> cat group_vars/all.yml 
users:
  johndoe:
    name: John Doe
    username: john
  janedoe:
    name: Jane Doe
    username: jane

ホスト別の更新の追加ユーザー到着ホスト変数

shell> cat host_vars/test_12.yml
users:
  johndoe:
    username: johnd

その後、次のコマンドは辞書をマージします。

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook -i hosts pb.yml

PLAY [all] *********************************************************

TASK [debug] *******************************************************
ok: [test_11] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: john
ok: [test_12] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: johnd
ok: [test_13] => 
  users:
    janedoe:
      name: Jane Doe
      username: jane
    johndoe:
      name: John Doe
      username: john

関連情報