it-swarm.com.ru

Переопределить переменную hosts в Ansible playbook из командной строки

Это фрагмент книги, которую я использую (server.yml):

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

В моем файле hosts есть разные группы серверов, например.

[web]
x.x.x.x

[droplets]
x.x.x.x

Теперь я хочу выполнить ansible-playbook -i hosts/<env> server.yml и переопределить hosts: web из server.yml, чтобы запустить этот playbook для [droplets].

Могу ли я просто переопределить одноразовое время без непосредственного редактирования server.yml?

Благодарю.

59
luqo33

Я не думаю, что Ansible предоставляет эту функцию, которая должна. Вот что вы можете сделать:

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

и вы можете передать variable_Host из командной строки или из файла vars, например:

ansible-playbook server.yml --extra-vars "variable_Host=newtarget(s)"
75
wallydrag

Для тех, кто может прийти в поисках решения. 
Play Book

- 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

40
Mrunal Gosar

Это немного поздно, но я думаю, что вы можете использовать команду --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, чтобы увидеть, на каких хостах будет применена эта конфигурация.

7
Jonathan Hamel

Я изменил свой по умолчанию на нет хоста и есть проверка, чтобы поймать его. Таким образом, пользователь или cron вынужден предоставить один хост или группу и т.д. Мне нравится логика из комментария @wallydrag. empty_group не содержит хостов в инвентаре.

- hosts: "{{variable_Host | default ('empty_group')}}" 

Затем добавьте проверку в задачах:

 задачи:
 - name: Сбой сценария, если обязательный параметр variable_Host отсутствует 
 потерпеть поражение:
 msg: "Вы должны добавить --extra-vars = 'variable_Host ='" 
 когда: (variable_Host не определен) или (variable_Host == "") 
5
Tony-Caffe

Я использую другой подход, который не нуждается в инвентаре и работает с этой простой командой:

ansible-playbook site.yml -e working_Host=myhost

Для этого вам нужна книга с двумя пьесами:

  • сначала игра запускается на локальном хосте и добавляется хост (из заданной переменной) в известную группу в инвентаре памяти.
  • вторая игра проходит на этой известной группе

Рабочий пример (скопируйте его и запустите предыдущей командой):

- 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

4
Nelson G.

Я использую ansible 2.5 (точно 2.5.3), и кажется, что файл vars загружается до выполнения параметра hosts. Таким образом, вы можете установить Host в vars.yml file и просто написать hosts: {{ Host_var }} в вашей книге игр

Например, в моем playbook.yml:

---
- hosts: "{{ Host_name }}"
  become: yes
  vars_files:
    - vars/project.yml
  tasks:
    ... 

И внутри vars/project.yml:

---

# general
Host_name: your-fancy-Host-name
2
LightMan

Если вы хотите запустить задачу, которая связана с Хостом, но на другом Хосте, вы должны попробовать Delegate_to .

В вашем случае вы должны делегировать свой localhost (ansible master) и вызвать команду ansible-playbook

2
nghnam

Просто наткнулся на эту поисковую систему для решения проблемы. На самом деле, есть один в Ansible 2.5. Вы можете указать свой файл инвентаризации с помощью --inventory, например так: ansible --inventory configs/hosts --list-hosts all

1
Bebef