Ответ 1
В роли de-server-setup
добавьте задачу для изменения переменной хоста ansible_port
.
- name: Change ssh port to 8888
set_fact:
ansible_port: 8888
Вот файл инвентаризации
---
[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?
В роли 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 использует следующую логику для управления это 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 содержит дополнительную информацию.
Мое полное решение этой проблемы состояло в том, чтобы создать общую пьесу, импортированную в верхней части всех других пьес, которая проверяет состояние нестандартного 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"
Простой способ, отредактируйте /etc/ansible/hosts:
[my_server]
ssdnodes:54321
и вы можете проверить это, выполнив команду ping:
ansible ssdnodes -m ping
и ответ будет:
ssdnodes | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ниже приведен пример подключения к другому порту ssh с использованием ansible-playbook.
---
- hosts: test-server
вары:
ansible_ssh_user: 'mohan'
ansible_password: '123456'
ansible_port: '2222'
задачи:
- имя: "печать простой команды"
команда: cat/usr/bin/myscript.sh