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"