Я пытаюсь использовать Ansible для автоматизации процесса установки новых экземпляров сервера. Одна из задач установки изменяет порт SSH по умолчанию, поэтому мне необходимо обновить список хостов.
Можно ли автоматизировать это, используя Ansible откат к указанному порту, если не удалось установить соединение с портом SSH по умолчанию?
Вы можете попробовать local_action на хостах, чтобы посмотреть, сможете ли вы подключиться к соответствующим портам и зарегистрировать тот, который будет успешным, и установить это как факт. Вы хотите отключить сбор фактов, потому что в противном случае модуль установки потерпит неудачу, когда он попытается соединиться с уже перенастроенными узлами. Как только вы закончите эту игру, просто добавьте другие ниже с collect_facts и все остальное.
- name: determine ssh port
hosts: all
gather_facts: false
vars:
custom_ssh_port: 222
tasks:
- name: test default ssh port
local_action: wait_for port=22 timeout=5 host={{inventory_hostname}}
register: default_ssh
ignore_errors: true
- name: set ansible_ssh_port to default
set_fact: ansible_ssh_port=22
when: default_ssh.elapsed < 5
- name: test ssh on high port
local_action: wait_for port={{custom_ssh_port}} timeout=5 host={{inventory_hostname}}
register: high_ssh
when: default_ssh.elapsed >= 5
ignore_errors: true
- name: set ansible_ssh_port high
set_fact: ansible_ssh_port={{custom_ssh_port}}
when: default_ssh.elapsed >= 5 and high_ssh.elapsed < 5
Мне было указано, что это унесет время для playbooks, где вы используете это. Вы также можете установить ansible_ssh_port в разделе игр vars, который должен запускаться только на хостах с перенастроенным портом ssh. например
Ваша стратегия тестирования портов в сочетании с установкой фактов кажется идеальным подходом для этих случаев. Благодарность!!!
Джей Тейлор
10
@RichardSalts спасибо, что помогли мне начать с этим. Я использовал nc для проверки портов, которые должны быть намного быстрее. Это мой bootstrap.xml:
Протестировано с использованием ansible 1.5 (devel 3b8fd62ff9) последнее обновление 2014/01/28 20:26:03
---
# Be sure to set the following variables for all hosts:
# vars:
# oldsshport: 22
# sshport: 555
# Might fail without setting remote_tmp = /tmp/ansible/$USER in your ansible.cfg. Also fix for directly below.
# Once host is setup most of the checks are skipped and works very quickly.
# Also, be sure to set non-standard shells in a different playbook later. Stick with /bin/bash until you can run apt install.
# Assumes root user has sshkey setup already. Not sure how to utilize the --ask-pass option. For now, use ssh-copy-id prior to running playbook on new host for root user (if needed).
# Test new ssh port
- name: ssh test nc {{ sshport }}
local_action: shell nc -z -w5 {{ inventory_hostname }} {{ sshport }}
register: nc_ssh_port
failed_when: nc_ssh_port.stdout.find('failed') != -1
changed_when: nc_ssh_port.stdout == ""
ignore_errors: yes
# Set port to new port if connection success
- name: set ansible_ssh_port
set_fact: ansible_ssh_port={{ sshport }}
when: nc_ssh_port|success
# Fail back to old port if new ssh port fails
- name: ssh test nc port {{ oldsshport }}
local_action: shell nc -z -w5 {{ inventory_hostname }} {{ oldsshport }}
register: nc_ssh_default
changed_when: nc_ssh_default.stdout == ""
ignore_errors: yes
when: nc_ssh_port|changed
# Set ansible to old port since new failed
- name: set ansible_ssh_port to {{ oldsshport }}
set_fact: ansible_ssh_port={{ oldsshport }}
when: nc_ssh_default|success and nc_ssh_port|changed
# Check if root user can ssh
- name: find user
local_action: shell ssh -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=5 -p {{ ansible_ssh_port }} root@{{ inventory_hostname }} exit
register: ssh_as_root
failed_when: ssh_as_root.stdout.find('failed') != -1
changed_when: ssh_as_root.stderr.find('Permission denied') == -1
# If root user success, set this up to change later
- name: first user
set_fact: first_user={{ ansible_ssh_user }}
when: ssh_as_root|changed
# Set ssh user to root
- name: root user
set_fact: ansible_ssh_user=root
when: ssh_as_root|changed
# ANSIBLE FIX: /tmp/ansible isn't world-writable for setting remote_tmp = /tmp/ansible/$USER in ansible.cfg
- name: /tmp/ansible/ directory exists with 0777 permission
file: path=/tmp/ansible/ owner=root group=root mode=0777 recurse=no state=directory
changed_when: False
sudo: yes
# Setup user accounts
- include: users.yml
# Set ssh user back to default user (that was setup in users.yml)
- name: ansible_ssh_user back to default
set_fact: ansible_ssh_user={{ first_user }}
when: ssh_as_root|changed
# Reconfigure ssh with new port (also disables non-ssh key logins and disable root logins)
- name: sshd.conf
template: src=sshd_config.j2 dest=/etc/ssh/sshd_config owner=root group=root mode=0644
register: sshd_config
sudo: yes
# Force changes immediately to ssh
- name: restart ssh
service: name=ssh state=restarted
when: sshd_config|changed
sudo: yes
# Use updated ssh port
- name: set ansible_ssh_port
set_fact: ansible_ssh_port={{ sshport }}
when: nc_ssh_port|changed
Поскольку вы, вероятно, развертываете свою конфигурацию ssh на ранних этапах, вам действительно следует сохранять это простым Просто настройте ваш инвентарь с целью ansible_ssh_portи используйте -eпри первом развертывании конфигурации ssh:
Можно ли автоматизировать это, используя Ansible откат к указанному порту, если не удалось установить соединение с портом SSH по умолчанию?
Мне также требовались аналогичные функции, поэтому я разработал и исправил плагин Ansible ssh, надеясь, что Ansible Inc. примет его; они не Он проверяет спецификации не-std ssh-портов, чтобы увидеть, открыты ли они, и возвращается к ssh-порту по умолчанию, если нет. Это очень маленький патч, доступный по адресу https://github.com/crlb/ansible .
Если у вас есть список портов, и вы хотите проверить их все и использовать тот, который работает, вы можете использовать это в своей книге игр:
- name: just test
hosts: server
gather_facts: false
vars:
list_of_ssh_ports: [22, 222, 234]
tasks:
- name: test ssh on port
sudo: no
local_action: wait_for port={{item}} timeout=5 host={{inventory_hostname}}
register: ssh_checks
with_items: "{{list_of_ssh_ports}}"
ignore_errors: true
- debug: msg = "{{item}}"
with_items: "{{ssh_checks.results}}"
- name: set available ansible_ssh_port
sudo: no
set_fact: ansible_ssh_port={{item.item}}
when: ssh_checks is defined and {{item.elapsed}} < 5
with_items: "{{ssh_checks.results}}"
Я придумал надежный список идемпотентных задач, чтобы изменить роль порта SSH и управлять подключением к нужному порту без необходимости изменения файла инвентаризации. Я разместил подробности в своем блоге: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
@RichardSalts спасибо, что помогли мне начать с этим. Я использовал nc для проверки портов, которые должны быть намного быстрее. Это мой bootstrap.xml:
Протестировано с использованием ansible 1.5 (devel 3b8fd62ff9) последнее обновление 2014/01/28 20:26:03
источник
Поскольку вы, вероятно, развертываете свою конфигурацию ssh на ранних этапах, вам действительно следует сохранять это простым Просто настройте ваш инвентарь с целью
ansible_ssh_port
и используйте-e
при первом развертывании конфигурации ssh:Обратите внимание, что
ansible_ssh_port
устарела в 2.0 (замененоansible_port
)источник
Мне также требовались аналогичные функции, поэтому я разработал и исправил плагин Ansible ssh, надеясь, что Ansible Inc. примет его; они не Он проверяет спецификации не-std ssh-портов, чтобы увидеть, открыты ли они, и возвращается к ssh-порту по умолчанию, если нет. Это очень маленький патч, доступный по адресу https://github.com/crlb/ansible .
источник
Если у вас есть список портов, и вы хотите проверить их все и использовать тот, который работает, вы можете использовать это в своей книге игр:
источник
Я придумал надежный список идемпотентных задач, чтобы изменить роль порта SSH и управлять подключением к нужному порту без необходимости изменения файла инвентаризации. Я разместил подробности в своем блоге: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
источник
'dict object' has no attribute 'state'