[ansible] 명령 줄에서 Ansible 플레이 북의 호스트 변수 재정의

다음은 내가 사용중인 플레이 북의 일부입니다 ( server.yml).

- name: Determine Remote User
  hosts: web
  gather_facts: false
  roles:
    - { role: remote-user, tags: [remote-user, always] }

내 호스트 파일에는 다른 서버 그룹이 있습니다. 예 :

[web]
x.x.x.x

[droplets]
x.x.x.x

지금은 실행할 ansible-playbook -i hosts/<env> server.yml및 오버라이드 (override) hosts: web에서 server.yml이 작전을 실행합니다 [droplets].

server.yml직접 편집하지 않고 일회성으로 재정의 할 수 있습니까 ?

감사.



답변

Ansible이이 기능을 제공한다고 생각하지 않습니다. 수행 할 수있는 작업은 다음과 같습니다.

hosts: "{{ variable_host | default('web') }}"

variable_host명령 줄 또는 vars 파일에서 전달할 수 있습니다 . 예 :

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"


답변

솔루션을 찾고 계신 분들께.
플레이 북

- hosts: '{{ host }}'
  tasks:
  - debug: msg="Host is {{ ansible_fqdn }}"

목록

[web]
x.x.x.x

[droplets]
x.x.x.x

명령 : ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
따라서 extra-vars에 그룹 이름을 지정할 수 있습니다.


답변

조금 늦었지만 --limit or -l 명령을 하여 패턴을보다 구체적인 호스트로 제한 합니다. (버전 2.3.2.0)

당신은 가질 수 있습니다

- hosts: all (or group)
tasks:
- some_task

그런 다음 플래그를 ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
사용 --list-hosts하여이 구성이 적용되는 호스트를 확인합니다.


답변

간단한 실패 작업을 사용하여 사용자가 Ansible 제한 옵션 을 지정하도록 강제 하므로 모든 호스트에서 기본 / 사고로 실행되지 않습니다.

내가 찾은 가장 쉬운 방법은 다음과 같습니다.

---
- name: Force limit
  # 'all' is okay here, because the fail task will force the user to specify a limit on the command line, using -l or --limit
  hosts: 'all'

  tasks:
  - name: checking limit arg
    fail:
      msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
    when: ansible_limit is not defined
    run_once: true

이제 플레이 북을 실행할 때 -l(= --limit옵션)을 사용해야합니다.

ansible-playbook playbook.yml -l www.example.com

제한 옵션 문서 :

하나 이상의 호스트로 제한 호스트 그룹에 대해 플레이 북을 실행하려는 경우 필요하지만 해당 그룹의 하나 이상의 구성원에 대해서만 필요합니다.

하나의 호스트로 제한

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1"

여러 호스트로 제한

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit "host1,host2"

제한이 무효화되었습니다.
참고 : bash 보간을 방지하려면 작은 따옴표를 사용해야합니다.

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'all:!host1'

호스트 그룹으로 제한

ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'group1'


답변

인벤토리가 필요하지 않고 다음과 같은 간단한 명령으로 작동하는 다른 접근 방식을 사용하고 있습니다.

ansible-playbook site.yml -e working_host=myhost

이를 수행하려면 두 가지 연극이있는 플레이 북이 필요합니다.

  • 첫 번째 재생은 localhost에서 실행되고 메모리 인벤토리의 알려진 그룹에 호스트 (주어진 변수에서)를 추가합니다.
  • 이 알려진 그룹에서 두 번째 플레이가 실행됩니다.

작업 예제 (복사하고 이전 명령으로 실행) :

- hosts: localhost
  connection: local
  tasks:
  - add_host:
      name: "{{ working_host }}"
      groups: working_group
    changed_when: false

- hosts: working_group
  gather_facts: false
  tasks:
  - debug:
      msg: "I'm on {{ ansible_host }}"

ansible 2.4.3 및 2.3.3을 사용하고 있습니다.


답변

나는 기본적으로 호스트 없음으로 변경했고 그것을 잡기 위해 수표를 받았습니다. 이렇게하면 사용자 나 크론이 단일 호스트 또는 그룹 등을 제공하도록 강요받습니다. @wallydrag의 의견에 나오는 논리가 마음에 듭니다. 은 empty_group재고에는 호스트가 포함되어 있지 않습니다.

-호스트 : "{{variable_host | default ( 'empty_group')}}"

그런 다음 체크인 작업을 추가합니다.

   작업 :
   -이름 : 필요한 variable_host 매개 변수가 누락 된 경우 실패 스크립트
     불합격:
       msg : "--extra-vars = 'variable_host ='를 추가해야합니다."
     언제 : (variable_host가 정의되지 않음) 또는 (variable_host == "")


답변

해결책을 찾기 위해이 인터넷 검색을 발견했습니다. 실제로 Ansible 2.5에는 하나가 있습니다. 다음과 --inventory같이를 사용하여 인벤토리 파일을 지정할 수 있습니다 .ansible --inventory configs/hosts --list-hosts all