Сильный 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?

Ответ 1

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

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

Ответ 2

Единственное, что я могу думать о том, что может работать, это создать 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

Ответ 3

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

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

где "self.port" - это спецификация порта из инвентаря хоста, или переопределение через параметр -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 ...

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

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

Ответ 4

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

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

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

[webservers]
web01.somedomain.com ansible_port=1234

Моя пьеса выглядит так:

- 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"

Ответ 5

Простой способ, отредактируйте /etc/ansible/hosts:

[my_server]
ssdnodes:54321

и вы можете проверить это, выполнив команду ping:

ansible ssdnodes -m ping

и ответ будет:

ssdnodes | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ответ 6

Ниже приведен пример подключения к другому порту ssh с использованием ansible-playbook.
---
- hosts: test-server
вары:
ansible_ssh_user: 'mohan'
ansible_password: '123456'
ansible_port: '2222'
задачи:
- имя: "печать простой команды"
команда: cat/usr/bin/myscript.sh