다음은 내가 사용중인 플레이 북의 일부입니다 ( 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