매핑 값을 기반으로 Ansible 역할에 대한 호스트를 지정할 수 있습니까?

매핑 값을 기반으로 Ansible 역할에 대한 호스트를 지정할 수 있습니까?

단일 노드 아키텍처 또는 분산 아키텍처에 애플리케이션을 설정할 수 있는 호스트가 있습니다.

그래서 재고가 있어요.

[STG]
node1

[LIVE]
app_node
db_node
gateway_node

따라서 기본값이 로 설정된 변수를 singleCLI에서 로 변경할 수 있습니다 distributed.

역할 정의가 있습니다.

- hosts:
  gather_facts: no
  roles:
      - {role: setup, tags: ['setup', 'orchestra']}

그래서 호스트 라인이 지도 값에 따라 동적으로 나타나기를 원합니다.

- hosts: 'if single then host == STG else LIVE'

답변1

더 많은 옵션이 있습니다:

  1. 논리를 표현식으로 대체주인:
shell> cat pb.yml
- hosts: "{{ (map_value == 'single')|ternary('STG', 'LIVE') }}"
  tasks:
    - debug:
        var: ansible_play_hosts
      run_once: true

당신이 원하는 것을 줄

shell> ansible-playbook pb.yml -e map_value=single

PLAY [single] ********************************************************************************

TASK [debug] *********************************************************************************
ok: [node1] => 
  ansible_play_hosts:
  - node1

PLAY RECAP ***********************************************************************************
node1: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
shell> ansible-playbook pb.yml -e map_value=distributed

PLAY [distributed] ***************************************************************************

TASK [debug] *********************************************************************************
ok: [app_node] => 
  ansible_play_hosts:
  - app_node
  - db_node
  - gateway_node

PLAY RECAP ***********************************************************************************
app_node: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


  1. 만들다어린이들(그룹 별칭)
shell> cat hosts 
[STG]
node1

[single:children]
STG

[LIVE]
app_node
db_node
gateway_node

[distributed:children]
LIVE

그러면 스크립트는 동일한 결과를 제공합니다.

shell> cat pb.yml
- hosts: "{{ map_value }}"
  tasks:
    - debug:
        var: ansible_play_hosts
      run_once: true

인벤토리 파일을 변경할 수 없는 경우 별칭을 별도의 파일에 넣으세요. 예를 들어,

shell> tree inventory/
inventory/
├── 01-hosts
└── 02-aliases
shell> cat inventory/01-hosts 
[STG]
node1

[LIVE]
app_node
db_node
gateway_node
shell> cat inventory/02-aliases 
[single:children]
STG

[distributed:children]
LIVE

그러면 스크립트는 동일한 결과를 제공합니다.

shell> ansible-playbook -i inventory pb.yml -e map_value=single
...
shell> ansible-playbook -i inventory pb.yml -e map_value=distributed
...

  1. 인벤토리 플러그인 사용설립하다. 바라보다
shell> ansible-doc -t inventory constructed

예를 들어 재고

shell> tree inventory
inventory
├── 01-hosts
└── 02-constructed.yml
shell> cat inventory/01-hosts 
[STG]
node1

[STG:vars]
map_group_value=single

[LIVE]
app_node
db_node
gateway_node

[LIVE:vars]
map_group_value=distributed
shell> cat inventory/02-constructed.yml 
plugin: constructed
use_extra_vars: true
compose:
  map_group: map_value
groups:
  map_group: map_group == map_group_value

그런 다음 스크립트

- hosts: map_group
  tasks:
    - debug:
        var: ansible_play_hosts
      run_once: true

동일한 결과를 제공합니다

shell> ansible-playbook -i inventory pb.yml -e map_value=single
...
shell> ansible-playbook -i inventory pb.yml -e map_value=distributed
...

역할 테스트 케이스 사용을 고집한다면 역할을 생성하세요.

shell> cat roles/setup/tasks/main.yml 
- debug:
    var: ansible_play_hosts
  run_once: true

플레이북에서 원하는 태그와 함께 사용하세요.

shell> cat pb.yml
- hosts: map_group
  roles:
    - role: setup

관련 정보