Как я могу сделать доступным повторное использование сеансов SSH вместо создания нового сеанса для каждой задачи?
Моя корпоративная политика брандмауэра разрешает только 20 подключений в минуту 60 секунд между одним и тем же источником и получателями.
Из-за этого через некоторое время зависает анзибл.
Я хотел бы, чтобы несколько задач использовали один и тот же сеанс ssh, а не создавали новые сеансы. Для этого я установил ниже
pipelining = True
в локальной папке
ansible.cfg
а также в командной строке.
cat /opt/automation/startservices/ansible.cfg
[defaults]
host_key_checking = False
gathering = smart
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s
control_path = %(directory)s/%%h-%%r
pipelining = True
ANSIBLE_SSH_PIPELINING=0 ansible-playbook -i /opt/automation/startservices/finalallmw.hosts /opt/automation/startservices/va_action.yml -e '{ dest_host: myremotehost7 }' -e dest_user=oracle
Плейбук слишком велик, чтобы публиковать его здесь, но именно эта задача зацикливается, и именно здесь она зависает из-за более чем 20 ssh-соединений за 60 секунд.
- name: Copying from "{{ inventory_hostname }}" to this ansible server.
synchronize:
src: "{{ item.path }}"
dest: "{{ playbook_dir }}/homedirbackup/{{ inventory_hostname }}/{{ dtime }}/"
mode: pull
copy_links: yes
with_items:
- "{{ to_copy.files }}"
С установленными настройками конвейера моя игра все еще зависает после 20 подключений.
Ниже приведены настройки playbook:
hosts: "{{ groups['dest_nodes'] | default(groups['all']) }}"
user: "{{ USER | default(dest_user) }}"
any_errors_fatal: True
gather_facts: false
tags: always
vars:
ansible_host_key_checking: false
ansible_ssh_extra_args: -o StrictHostKeyChecking=no -o ConnectionAttempts=5
Опубликуйте предложения в этой теме, проблема не устранена. Ниже мой локальный каталог ansible.cfg
$ cat /opt/automation/startservices/ansible.cfg
# config file for ansible -- http://ansible.com/
# ==============================================
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
[defaults]
host_key_checking = False
roles_path = roles/
gathering = smart
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200s -o ControlPath=~/.ansible/cp/%r@%h:%p
[persistent_connection]
control_path_dir = ~/.ansible/cp
$
Не могли бы вы предложить какое-либо решение проблемы на доступной стороне, когда все задачи используют один и тот же сеанс ssh и конвейерная обработка здесь не работает?
2 ответа
Проблема не в том, что контроллер ansible запускает модуль (модули) (т.е. копирует необходимые временные файлы AnsibleZ на вашу цель и выполняет их - у вас уже есть правильные параметры для этого в
ansible.cfg
для использования основных сеансов), но с самим модулем, который должен создавать свои собственные ssh-соединения для передачи файлов между соответствующими серверами во время его работы на целевом сервере.
Последний Версия synchronize
модуля теперь является частью коллекции и недавно получила 2 варианта, которые помогут вам обойти вашу проблему, чтобы применить использование основных сеансов к самому модулю при использовании rsync.
Хотя можно установить эту коллекцию в ansible 2.9, чтобы переопределить старую версию стандартного модуля (в которой нет этих параметров), я настоятельно рекомендую вам использовать версию ansible 2.10 или 2.11. Мой личный предпочтительный метод установки ansible - через
pip
так как это позволит вам установить любую доступную версию на любой ОС для любого пользователя в любом количестве (виртуальных) сред.
Что касается pip, управление версиями изменилось (и это довольно беспорядок, IMO...)
- теперь является метапакетом с собственным независимым управлением версиями.
- обычные доступные двоичные файлы (,
ansible-playbook
, ....) упакованы вansible-core
который имеет версию, соответствующую тому, что вы получаете при запускеansible -v
- мета
ansible
пакет по умолчанию устанавливает набор коллекций (включаяansible.posix
один, если я не ошибаюсь)
=> Получить
ansible -v => 2.10
вы хотите установить пакет ansible pip 3.x
=> Получить
ansible -v => 2.11
вы хотите установить доступный пакет pip 4.x
Вам нужно будет удалить любую предыдущую версию, установленную через pip в вашей текущей среде, прежде чем продолжить.
Первый:
pipelining = True
не делает то, что вы ищете. Это уменьшает количество сетевых операций, но не количество ssh-соединений. Дополнительную информацию можно найти в документации .
Имхо, это все еще хорошая вещь в использовании, поскольку она ускорит ваши плейбуки.
Что вы хотите использовать, так это «постоянный режим управления», который является функцией OpenSSH, чтобы поддерживать соединение открытым.
Вы можете, например, сделать это в своем
ansible.cfg
:
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200
Это сохранит соединение открытым в течение 1200 секунд.