Я использую Ansible для некоторых простых задач управления пользователями с небольшой группой компьютеров. В настоящее время мои playbooks настроены на, hosts: all
и мой файл hosts - это просто одна группа со всеми перечисленными машинами:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Мне часто приходилось ориентироваться на одну машину. Команда ansible-playbook
может ограничить игры следующим образом:
ansible-playbook --limit imac-2.local user.yml
Но это кажется довольно хрупким, особенно для потенциально разрушительной пьесы. Если оставить limit
флаг, значит, повсюду будет плейбук. Поскольку эти инструменты используются только изредка, кажется, что стоит предпринять шаги для надежного воспроизведения, чтобы мы случайно не взломали что-нибудь через несколько месяцев.
Есть ли лучшая практика для ограничения прогонов playbook на одной машине? В идеале, книги должны быть безвредными, если не учитывать некоторые важные детали.
источник
--limit office[0]
'{{ target }}'
- в соответствии с docs.ansible.com/…run_once
может быть разрушительной, так что это не очень хорошая идея.-e
это эквивалент--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Есть также симпатичный маленький трюк, который позволяет вам указать один хост в командной строке (или несколько хостов, я думаю), без промежуточного инвентаря:
Обратите внимание на запятую ( , ) в конце; это говорит о том, что это список, а не файл.
Теперь, это не защитит вас, если вы случайно передадите настоящий файл инвентаря, так что это может быть не лучшим решением этой конкретной проблемы. Но это удобный трюк, чтобы знать!
источник
skipping: no hosts matched
. Возможно, этот трюк больше не работает, так как--limit
работает?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Смотри ответ Марвана.all
в пьесу (ы) - мне потребовалось некоторое время, чтобы понять ...Этот подход завершится, если для проверки переменной play_hosts предусмотрено более одного хоста . Модуль сбоя используется для выхода, если условие одного хоста не выполняется. В приведенных ниже примерах используется файл hosts с двумя хостами alice и bob.
user.yml (playbook)
Запустите playbook без фильтров хоста
Запустите playbook на одном хосте
источник
--limit
это путьplay_hosts
устарела в Ansible 2.2 и заменена наansible_play_hosts
. Для запуска на одном хосте без необходимости--limit
вы можете использоватьwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
на Ansible 2.8.4.Там ИМХО более удобный способ. Вы действительно можете в интерактивном режиме запросить у пользователя машину (-ы), к которой он хочет применить игровую книгу, благодаря
vars_prompt
:источник
--extra-vars
и обычная переменная в твоей пьесе…{{ hosts }}
, оценивается перед вводом значения - или есть специальный трюк?Чтобы расширить ответ joemailer, если вы хотите иметь возможность сопоставления с образцом для сопоставления с любым подмножеством удаленных машин (так же, как это
ansible
делает команда), но все же хотите сделать очень трудным случайный запуск playbook на всех машинах, это что я придумал:Тот же playbook, что и в другом ответе:
Давайте иметь следующие хосты:
Теперь, чтобы запустить команду на всех устройствах, вам нужно явно установить для целевой переменной значение «all».
И чтобы ограничить его конкретным шаблоном, вы можете установить
target=pattern_here
или, альтернативно, вы можете оставить
target=all
и добавить--limit
аргумент, например:то есть.
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
что приводит к:
источник
Я действительно не понимаю, как все ответы настолько сложны, способ сделать это просто:
check
Режим позволяет работать в режиме сухого хода, без внесения каких - либо изменений.источник
--check
, так что я думаю, что это все еще полезно с точки зрения документации, так как этот вопрос может быть очень googlableПользователи AWS, использующие сценарий внешней инвентаризации EC2, могут просто фильтровать по идентификатору экземпляра:
Это работает, потому что скрипт инвентаризации создает группы по умолчанию .
источник
У нас есть несколько общих сборников, которые могут использовать многие команды. У нас также есть файлы инвентаризации, зависящие от среды, которые содержат несколько групповых объявлений.
Чтобы заставить кого-то, вызывающего playbook, указать группу, с которой нужно работать, мы вводим пустую запись в верхней части playbook:
Затем мы включаем следующую проверку в качестве первого шага в общую книгу воспроизведения:
Если фиктивный сервер отображается в списке хостов, с которыми запланировано выполнение этой книги воспроизведения (ansible_play_batch), то вызывающая сторона не указала группу, и выполнение книги воспроизведения завершится неудачно.
источник
ansible_play_batch
перечисляет только текущую партию, поэтому при использовании дозирования это все еще небезопасно. Лучше использоватьansible_play_hosts
вместо этого.Начиная с версии 1.7, ansible имеет опцию run_once . Раздел также содержит некоторые обсуждения различных других методов.
источник
Это показывает, как запустить playbooks на целевом сервере.
Это немного сложнее, если вы хотите использовать локальное соединение. Но это должно быть нормально, если вы используете переменную для параметра hosts и в файле hosts создайте специальную запись для localhost.
Во всех плейбуках линия hosts: установлена в:
В файле инвентаризации хостов добавьте запись для localhost, которая устанавливает соединение как локальное:
Затем в командной строке выполните команды, явно задающие цель - например:
Это также будет работать при использовании ansible-pull:
Если вы забудете установить переменную в командной строке, команда безопасно выдаст ошибку (если вы не создали группу хостов с именем 'no_hosts'!) С предупреждением:
И, как упоминалось выше, вы можете настроить таргетинг на одну машину (если она есть в вашем файле hosts) с помощью:
или группа с чем-то вроде:
источник
У меня есть скрипт-обертка, называемая Provision, заставляет вас выбирать цель, поэтому мне не нужно обрабатывать ее где-либо еще.
Для любопытных я использую переменные ENV для опций, которые использует мой vagrantfile (добавляя соответствующий аргумент arible для облачных систем), и позволяю пройти остальным аргументам. Там, где я создаю и инициализирую более 10 серверов одновременно, я включаю автоматическую повторную попытку на неисправных серверах (при условии, что достигнут прогресс - я обнаружил, что при создании примерно 100 серверов одновременно часто некоторые из них отказывают в первый раз) ).
источник
Немного другое решение состоит в том, чтобы использовать специальную переменную,
ansible_limit
которая является содержимым--limit
опции CLI для текущего выполнения Ansible.Нет необходимости определять дополнительную переменную здесь, просто запустите playbook с
--limit
флагом.источник