我透過以下方式配置我的環境:
庫存.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
注意:若要合併列表,請參閱解決方案。