次のように環境を構成しています。
インベントリ.yml
all:
children:
production:
1.2.3.4
staging:
1.2.3.5
group_vars/all.yml で、プレイブックに追加されるユーザーのハッシュを設定しています。group_vars/staging.yml にユーザーを具体的に追加し、group_vars/all.yml の同じ設定とマージできるようにしたいと思います。
この場合、ハッシュをマージしたり継承を宣言したりする適切な方法はありますか?
答え1
見るデフォルトのハッシュ動作引用
「この設定は、Ansible で変数をマージする方法を制御します。デフォルトでは、Ansible は、変数で説明されているように、特定の優先順位で変数をオーバーライドします。優先順位の高い変数が優先されると、他の値が置き換えられます。ハッシュ (Python 用語では「辞書」とも呼ばれます) である変数をマージすることを希望するユーザーもいます。この設定は「マージ」と呼ばれます。...」
例えば、在庫とグループ変数
shell> cat hosts
all:
children:
production:
hosts:
1.2.3.4
staging:
hosts:
1.2.3.5
shell> cat group_vars/all.yml
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
shell> cat group_vars/production/users.yml
users:
dealer:
shell: /usr/sbin/nologin
shell> cat group_vars/staging/users.yml
users:
tester:
shell: /bin/bash
プレイブック
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users
デフォルトでは辞書を上書きします。(要約)
shell> ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users:
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users:
tester:
shell: /bin/bash
いつANSIBLE_HASH_BEHAVIOURプレイブックが提供する辞書をマージするように設定されています(要約)
shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
tester:
shell: /bin/bash
この設定は非推奨2.13 で。
引用:非推奨の詳細
「この機能は脆弱で移植性がなく、継続的な混乱と誤用につながります」
引用:非推奨の代替
「結合フィルタを明示的に」
たとえば、共通ユーザー辞書の名前を次のように変更します。ユーザー全員
shell> cat group_vars/all.yml
users_all:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
次にフィルター組み合わせる辞書を統合する
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users_all|combine(users)
与える(要約)
shell> ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users_all|combine(users):
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users_all|combine(users):
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
tester:
shell: /bin/bash
注: リストを結合するには、解決。