Это фрагмент плейбука, который я использую ( 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
запустить этот сборник пьес для [droplets]
.
Могу ли я просто переопределить как одноразовый перерыв, не редактируя server.yml
напрямую?
Спасибо.
ansible
ansible-playbook
luqo33
источник
источник
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
представляется , быть разобран после поhosts:
линии пьес. Однако переменные вvars:
и переменные вvars_files:
разбираются передhosts:
строкой? ПРИМЕЧАНИЕ. Я не спрашиваю о приоритете.-e
вместо--extra-vars
.Для всех, кто может прийти в поисках решения.
Играть в книгу
Инвентарь
Команда:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
Таким образом, вы можете указать имя группы в дополнительных переменныхисточник
play_hosts
и не получая ожидаемых результатов, потому что я забыл, чтоplay_hosts
это внутренняя Ansible var для всех хостов в текущей игре.Это немного поздно, но я думаю, вы могли бы использовать эту
--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
флаг, чтобы увидеть, на каких хостах будет применяться эта конфигурация.источник
limit
список затронутых хостов, playbook может нанести большой ущерб.--extra-vars "variable_host=newtarget(s)"
же принятого решения является опасным и более сложным решением. Он использует хосты по умолчанию,web
которые могут быть применены здесь вместоall
. Вы можете использовать строгую группу хостов по умолчанию, чтобы избежать ошибки, и использовать--list-hosts
флаг, чтобы иметь четкое представление о том, какие хосты вы затрагиваете.--limit
(в противном случае это повлияет на все возможные хосты, что может быть не тем поведением, которое вы хотите)Мы используем простую задачу сбоя, чтобы заставить пользователя указать параметр Ansible limit , чтобы мы не выполнялись на всех хостах по умолчанию / случайно.
Самый простой способ, который я нашел, - это:
Теперь мы должны использовать параметр
-l
(=--limit
), когда запускаем playbook, напримерОграничить варианты документов :
источник
Я использую другой подход, который не требует инвентаризации и работает с этой простой командой:
Для этого вам понадобится сборник с двумя пьесами:
Рабочий пример (скопируйте и запустите предыдущей командой):
источник
Я изменил свое значение по умолчанию на отсутствие хоста и должен проверить его. Таким образом, пользователь или cron вынуждены предоставлять один хост или группу и т. Д. Мне нравится логика комментария от @wallydrag. В
empty_group
инвентаре нет хостов.Затем добавьте задачи проверки:
источник
Просто наткнулся на этот поиск в Google для решения. Собственно, в Ansible 2.5 он есть. Вы можете указать свой файл инвентаря
--inventory
следующим образом:ansible --inventory configs/hosts --list-hosts all
источник
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Если вы хотите запустить задачу, связанную с хостом, но на другом хосте, вам следует попробовать delegate_to .
В вашем случае вы должны делегировать свой localhost (ansible master) и вызывающую
ansible-playbook
командуисточник
Я использую ansible 2.5 (точно 2.5.3), и кажется, что файл vars загружается до выполнения параметра hosts. Таким образом, вы можете установить хост в файле vars.yml и просто написать
hosts: {{ host_var }}
в своей книге воспроизведенияНапример, в моем playbook.yml:
И внутри vars / project.yml:
источник
Другое решение - использовать специальную переменную,
ansible_limit
которая является содержимым параметра--limit
CLI для текущего выполнения Ansible.Если
--limit
опция не указана, Ansible выдает предупреждение, но ничего не делает, поскольку ни один хост не найден.источник
Вот классное решение, которое я придумал, чтобы безопасно указывать хосты с помощью
--limit
опции. В этом примере воспроизведение закончится, если playbook был выполнен без каких-либо хостов, указанных с помощью--limit
опции.Это было протестировано на Ansible версии 2.7.10.
источник