Wie gehe ich mit Ansible mit SSH-Portänderungen um?
27
Ich versuche, Ansible für die Automatisierung des Installationsprozesses neuer Serverinstanzen zu verwenden. Eine der Setup-Aufgaben ändert den Standard-SSH-Port, weshalb ich die Hosts-Liste aktualisieren muss.
Ist es möglich, dies zu automatisieren, indem Ansible auf einen bestimmten Port zurückgreift, wenn die Verbindung zum Standard-SSH-Port nicht hergestellt werden konnte?
Sie können eine local_action auf den Hosts ausführen, um festzustellen, ob Sie eine Verbindung zu den entsprechenden Ports herstellen und den erfolgreichen Port registrieren und als Fakt festlegen können. Sie möchten das Sammeln von Fakten deaktivieren, da das Setup-Modul andernfalls fehlschlägt, wenn es versucht, eine Verbindung zu den Hosts herzustellen, die bereits neu konfiguriert wurden. Sobald Sie dieses Spiel beendet haben, fügen Sie einfach andere unten mit gather_facts und dem Rest hinzu.
- 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
Mir wurde darauf hingewiesen, dass dies die Zeit für Spielbücher sprengen wird, in denen Sie dies verwenden. Sie können ansible_ssh_port auch im Abschnitt vars von Spielen festlegen, die nur auf Hosts mit neu konfiguriertem ssh-Port ausgeführt werden sollen. z.B
Ihre Strategie des Hafentests in Verbindung mit der Festlegung von Fakten scheint für diese Fälle ein idealer Ansatz zu sein. Vielen Dank!!!
Jay Taylor
10
@RichardSalts danke, dass du mich dazu gebracht hast. Ich habe nc verwendet, um Ports zu überprüfen, die viel schneller sein sollten. Das ist meine bootstrap.xml:
Getestet mit ansible 1.5 (devel 3b8fd62ff9) zuletzt aktualisiert am 28.01.2014 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
Da Sie Ihre ssh-Konfiguration wahrscheinlich frühzeitig bereitstellen, sollten Sie dies wirklich einfach halten. Konfigurieren Sie einfach Ihr Inventar mit dem Ziel ansible_ssh_portund verwenden Sie es, -ewenn Sie Ihre ssh-Konfiguration zum ersten Mal bereitstellen:
Ist es möglich, dies zu automatisieren, indem Ansible auf einen bestimmten Port zurückgreift, wenn die Verbindung zum Standard-SSH-Port nicht hergestellt werden konnte?
Ich brauchte auch ähnliche Funktionen, also habe ich das Ansible-ssh-Plugin gabeled und gepatcht, in der Hoffnung, dass Ansible Inc. es übernehmen würde. sie haben nicht. Es testet nicht-standardmäßige SSH-Portspezifikationen, um festzustellen, ob sie geöffnet sind, und kehrt andernfalls zum Standard-SSH-Port zurück. Es ist ein sehr kleiner Patch, der unter https://github.com/crlb/ansible verfügbar ist .
Wenn Sie eine Liste von Ports haben und diese alle überprüfen und einen funktionierenden Port verwenden möchten, können Sie dies in Ihrem Playbook verwenden:
- 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}}"
Ich habe eine robuste, idempotente Aufgabenliste erstellt, mit der ich den SSH-Port ändern und die Verbindung zum richtigen Port herstellen kann, ohne die Inventardatei ändern zu müssen. Ich habe die Details in meinem Blog veröffentlicht: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
@RichardSalts danke, dass du mich dazu gebracht hast. Ich habe nc verwendet, um Ports zu überprüfen, die viel schneller sein sollten. Das ist meine bootstrap.xml:
Getestet mit ansible 1.5 (devel 3b8fd62ff9) zuletzt aktualisiert am 28.01.2014 20:26:03
quelle
Da Sie Ihre ssh-Konfiguration wahrscheinlich frühzeitig bereitstellen, sollten Sie dies wirklich einfach halten. Konfigurieren Sie einfach Ihr Inventar mit dem Ziel
ansible_ssh_port
und verwenden Sie es,-e
wenn Sie Ihre ssh-Konfiguration zum ersten Mal bereitstellen:Beachten Sie, dass
ansible_ssh_port
in 2.0 veraltet ist (ersetzt durchansible_port
)quelle
Ich brauchte auch ähnliche Funktionen, also habe ich das Ansible-ssh-Plugin gabeled und gepatcht, in der Hoffnung, dass Ansible Inc. es übernehmen würde. sie haben nicht. Es testet nicht-standardmäßige SSH-Portspezifikationen, um festzustellen, ob sie geöffnet sind, und kehrt andernfalls zum Standard-SSH-Port zurück. Es ist ein sehr kleiner Patch, der unter https://github.com/crlb/ansible verfügbar ist .
quelle
Wenn Sie eine Liste von Ports haben und diese alle überprüfen und einen funktionierenden Port verwenden möchten, können Sie dies in Ihrem Playbook verwenden:
quelle
Ich habe eine robuste, idempotente Aufgabenliste erstellt, mit der ich den SSH-Port ändern und die Verbindung zum richtigen Port herstellen kann, ohne die Inventardatei ändern zu müssen. Ich habe die Details in meinem Blog veröffentlicht: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/
quelle
'dict object' has no attribute 'state'