Ansible изменение ssh порт в playbook

вот файл инвентаризации

---
[de-servers]
192.26.32.32

[uk-servers]
172.21.1.23
172.32.2.11

и мой playbook выглядит так:

- name: Install de-servers configurations
  hosts: de-servers  
  roles:
    - de-server-setup

- name: Install uk-servers configurations
  hosts: uk-servers  
  roles:
    - uk-server-setup

- name: Do some other job on de-servers (cannot be done until uk-servers is installed)
  hosts: de-servers
  roles:
    - de-servers-rest-of-jobs

в роли de-servers-setup роль ssh порт изменяется с 22 на 8888, поэтому при вызове последней задачи он терпит неудачу, потому что он не может подключиться к хосту через 22 порта. как преодолеть это изменение порта ssh?

4 ответов


в роли de-server-setup добавить задачу для изменения ansible_port хост-переменной.

- name: Change ssh port to 8888
  set_fact:
    ansible_port: 8888

единственное, что я могу придумать, это создать псевдонимы ssh для ваших хостов. В .ssh/config:

Host de.1.before
  HostName 192.26.32.32
  Port 22

Host de.1.after
  HostName 192.26.32.32
  Port 8888

затем используйте эти псевдонимы в вашем Ansible инвентаре:

[de-servers-before]
de.1.before

[de-servers-after]
de.1.after

и определенные группы затем соответственно в ваших пьесах:

- name: Install de-servers configurations
  hosts: de-servers-before
  roles:
    - de-server-setup

- name: Install uk-servers configurations
  hosts: uk-servers  
  roles:
    - uk-server-setup

- name: Do some other job on de-servers (cannot be done until uk-servers is installed)
  hosts: de-servers-after
  roles:
    - de-servers-rest-of-jobs

мне нужно изменить порты ssh на хостах, которыми я управляю, и я хочу использовать Ansible, чтобы сделать это. По сути, Ansible использует следующую логику для управления это SSH соединения:

    if self.port is not None:
        ssh -p {{ self.port }} ...
    else:
        ssh ...

где " self.порт " - спецификация порта из инвентаризации хоста, или переопределение с помощью параметра "- e" или явное объявление переменные " ansible_port "и/или"ansible_ssh_port". Этот рекомендуемое решение для изменения портов-использовать модули" wait_for "и" when " в "pre_tasks", но их много недостатки этого подхода, особенно когда много хозяев и особенно, когда вы хотите использовать разные порты на разных хостах.

я клонировал и исправил плагин ssh (версии 1 и 2), чтобы изменить логика такова:

if self.port is not None and self.port is OPEN:
    ssh -p {{ self.port }} ...
else:
    ssh ...

патч сам по себе не вносит изменений в целевые узлы, но позволяет соединениям успешно выполняться, даже если порты на узлах еще не изменился. С патчем теперь очень легко писать роли/задачи изменить СШ порты все в хозяина инвентаризация.

Если вы заинтересованы, то вы можете найти заплата и образцы о том, как использовать его при https://github.com/crlb/ansible; Читай.md содержит дополнительную информацию.


моим полным решением было создать общий playbook импортированный в верхней части всех других playbooks, который проверяет статус нестандартного ansible_port определена в инвентаре. Если порт открыт, продолжайте как обычно. Если он не открыт, проверьте порт 22 и установите ansible_port факт, что если это так.

позже, когда сервер SSH настроен в первый раз и порт по умолчанию изменен на мой нестандартный порт, я затем обновляю ansible_port факт вручную в моем playbook так что любые дальнейшие Ansible соединения в текущем запуске будут работать, как ожидалось.

мой инвентарь выглядит так:

[webservers]
web01.somedomain.com ansible_port=1234

мой playbook выглядит так:

- name: Determine SSH port
  hosts: all
  gather_facts: no
  remote_user: root
  tasks:
    - name: "Check port {{ ansible_port }}"
      wait_for:
        port: "{{ ansible_port }}"
        state: "started"
        host: "{{ inventory_hostname }}"
        connect_timeout: "5"
        timeout: "5"
      delegate_to: "localhost"
      ignore_errors: "yes"
      register: ssh_port

    - name: "Check port 22"
      wait_for:
        port: "22"
        state: "started"
        host: "{{ inventory_hostname }}"
        connect_timeout: "5"
        timeout: "5"
      delegate_to: "localhost"
      ignore_errors: "yes"
      register: ssh_port_default
      when: 
        - ssh_port is defined 
        - ssh_port.state is undefined

    - name: Set SSH port to 22
      set_fact:
        ansible_port: "22"
      when: ssh_port_default.state is defined

наконец, сразу после того, как сервер SSH настроен и порт был изменен, у меня есть это:

- name: Set SSH port to 1234
  set_fact:
    ansible_port: "1234"