Продолжим наши гонки с Ansible. Рассмотрим конвейерный режим выполнения задач.
#2 Конвейерный режим.
Вспомним, как Ansible выполняет задачу:
1.Генерирует сценарий на Python, основанный на вызываемом модуле.
2.Копирует его на хост.
3.И запускает его там.
Ansible поддерживает прием оптимизации - конвейерный режим, - объединяя открытие сеанса SSH с запуском сценария на Python. Экономия достигается за счет того, что в этом случае требуется открыть только один сеанс SSH вместо двух. По умолчанию конвейерный режим не используется, потому что требует настройки удаленных хостов, но мне нравится использовать его, поскольку он ускоряет процесс. Чтобы включить этот режим, внесите изменения в файл ansible.cfg, как показано в примере 3.
Пример 3 ansible.cfg, включение конвейерного режима
[defaults]
pipelining = True
1) Настройка хостов для поддержки конвейерного режима
Для поддержки конвейерного режима необходимо убедиться, что на хостах в файле /etc/sudoers выключен параметр requiretty. Иначе при выполнении сценария вы будете получать ошибки, как показано в примере 4.
Пример 4 Ошибка при включенном параметре requiretty
failed: [vagrantl] => {"failed": true, "parsed": false}
invalid output was: sudo: sorry, you oust have a tty to run sudo
Если утилита sudo на хостах настроена на чтение файлов из каталога /etc/sudoers.d, тогда самое простое решение - добавить файл конфигурации sudoers, выключающий ограничение requiretty для пользователя, с именем которого вы устанавливаете SSH-соединения. Если каталог /etc/sudoers.d существует, хосты должны поддерживать добавление файлов конфигурации sudoers. Проверить наличие каталога можно с помощью утилиты ansible:
$ ansible vagrant *а "file /etc/sudoers.d"
Если каталог имеется, вы увидите примерно такие строки:
vagrant1 | success | rс=0 >»
/etc/sudoers.d: directory
vagrant3 | success | rc=0 >»
/etc/sudoers.d: directory
vagrant2 | success | rc=0 >»
/etc/sudoers.d: directory
Если каталог отсутствует, вы увидите:
vagrant3 | FAILED | rc=l »
/etc/sudoers.d: ERROR: cannot open '/etc/sudoers.d' (No such file or directory)
vagrant2 | FAILED | rc=l »
/etc/sudoers.d: ERROR: cannot open '/etc/sudoers.d' (No such file or directory)
vagrantl | FAILED | rc=1 >»
/etc/sudoers.d: ERROR: cannot open /etc/sudoers.d' (No such file or directory)
Если каталог имеется, создайте шаблон файла, как показано в примере 5:
Пример 5 templates/disable-requiretty.j2
Defaults:{{ ansible_user }} !requiretty
Затем запустите сценарий, приведенный в примере 6, заменив nyhosts именами ваших хостов.
Не забудьте выключить конвейерный режим, прежде чем сделать это, иначе сценарий завершится с ошибкой.
Пример 6 disable-requiretty.yml
-name: do not require tty for ssh-ing user
hosts: myhosts
sudo: True
tasks:
- name: Set a sudoers file to disable tty
template: >
src=templates/disable-requiretty.j2
dest=/etc/sudoers.d/disable-requiretty
owner=root group=root node=0440
validate="visudo -cf %s"
Обратите внимание на использование validate="visudo -cf %s".
Продолжение следует.
No comments:
Post a Comment
А что вы думаете по этому поводу?