將 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

DEFAULT_HASH_BEHAVIOUR。引用

「此設定控制變數在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

注意:若要合併列表,請參閱解決方案

相關內容