Ansible の変数をロールとマージする

Ansible の変数をロールとマージする

次のように環境を構成しています。

インベントリ.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

注: リストを結合するには、解決

関連情報