Ansible의 변수를 역할과 병합

Ansible의 변수를 역할과 병합

다음을 통해 환경을 구성하고 있습니다.

Inventory.yml

all:
  children:
    production:
      1.2.3.4
    staging:
      1.2.3.5

group_vars/all.yml에서 플레이북에 추가될 사용자 해시를 설정하고 있습니다. 내 group_vars/all.yml의 동일한 설정과 병합될 group_vars/staging.yml에 사용자를 구체적으로 추가할 수 있기를 원합니다.

이 경우 해시를 병합하거나 상속을 선언하는 적절한 방법이 있습니까?

답변1

보다DEFAULT_HASH_BEHAVIOUR. 인용

"이 설정은 Ansible에서 변수가 병합되는 방식을 제어합니다. 기본적으로 Ansible은 변수에 설명된 대로 특정 우선 순위로 변수를 재정의합니다. 우선 순위가 높은 변수가 승리하면 다른 값을 대체합니다. 일부 사용자는 해시 변수를 선호합니다. (파이썬 용어로 '사전'이라고도 함) 이 설정을 '병합'이라고 합니다.

예를 들어, 인벤토리와group_vars

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

참고: 목록을 병합하려면해결책.

관련 정보