А АMonday, 9 November 2020

Ускоряем Ansible #2.

Всем привет.

Продолжим наши гонки с 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

А что вы думаете по этому поводу?

Версия на печать

Популярное