私は次の定義を持っています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