Как я могу сделать доступным повторное использование сеансов 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 секунд.

Другие вопросы по тегам