Host_vars에서 사전의 특정 키를 재정의합니다.

Host_vars에서 사전의 특정 키를 재정의합니다.

나는 다음과 같은 정의를 가지고 있습니다 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

관련 정보