Frage Wie man SSH Port Änderungen mit Ansible behandelt?


Ich versuche, Ansible für die Automatisierung des Setup-Prozesses neuer Server-Instanzen 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 ein Ansible-Fallback auf einen bestimmten Port ausgeführt wird, wenn die Verbindung zum Standard-SSH-Port nicht hergestellt werden konnte?


24
2017-10-14 21:47


Ursprung




Antworten:


Sie könnten eine local_action auf den Hosts versuchen, um zu sehen, ob Sie eine Verbindung zu den entsprechenden Ports herstellen können, und den erfolgreichen Eintrag registrieren und als Tatsache festlegen. Sie möchten die Erfassung von Fakten deaktivieren, da andernfalls das Setup-Modul fehlschlägt, wenn es versucht, eine Verbindung mit den Hosts herzustellen, die bereits neu konfiguriert wurden. Sobald du dieses Spiel gemacht hast, füge 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

Es wurde darauf hingewiesen, dass dies die Zeit für Playbooks, in denen Sie diese verwenden, ausblasen wird. Sie könnten ansible_ssh_port auch im vars-Bereich von Spielen setzen, die nur auf Hosts mit neu konfiguriertem ssh-Port ausgeführt werden sollen. z.B.

- name: change ssh ports
  tasks:
    - name: edit sshd_config
      lineinfile ..
      notify: restart ssh
   handlers:
     - name: restart ssh
       service: sshd state=restarted
- name: continue setup
  vars:
    - ansible_ssh_port : 5422
  tasks:
    ...

15
2017-10-18 06:11



Ihre Strategie des Port-Tests in Verbindung mit dem Setzen von Fakten scheint für diese Fälle ein idealer Ansatz zu sein. Vielen Dank!!! - Jay Taylor


@RichardSalts danke, dass du mich damit angefangen 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

10
2018-01-29 16:25





Da Sie Ihre ssh-Konfiguration wahrscheinlich zu einem frühen Zeitpunkt bereitstellen, sollten Sie dies wirklich einfach halten. Konfigurieren Sie Ihr Inventar einfach mit dem Ziel ansible_ssh_port und benutzen -e Wenn Sie Ihre ssh-Konfiguration zum ersten Mal bereitstellen:

ansible-playbook bootstrap_ssh.yml -e 'ansible_ssh_port=22'

Beachten Sie, dass ansible_ssh_port ist in 2.0 veraltet (ersetzt durch ansible_port)


4
2018-01-13 11:21






Is it possible to automate this by having Ansible fallback to a specified   port if the connection could not be established to the default SSH port?

Ich benötigte auch ähnliche Funktionen, also gab ich das Ansible ssh plugin ab und flickte es in der Hoffnung, dass Ansible Inc. es übernehmen würde; sie taten es nicht. Es testet Nicht-Std-SSH-Port-Spezifikationen, um festzustellen, ob sie offen sind, und kehrt andernfalls zum Standard-SSH-Port zurück. Es ist ein sehr kleiner Patch, erhältlich bei https://github.com/crlb/ansible.


3
2018-02-04 22:59





Wenn Sie eine Liste von Ports haben und diese alle überprüfen möchten und eine solche verwenden möchten, können Sie diese 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}}"

0
2018-05-10 13:24





Ich habe eine robuste idempotente Task-Liste erstellt, die den SSH-Port ändert und die Verbindung zum richtigen Port herstellt, ohne die Inventar-Datei ändern zu müssen. Ich habe die Details in meinem Blog gepostet: https://dmsimard.com/2016/03/15/changing-the-ssh-port-with-ansible/


-1
2018-03-16 14:00



Wir bevorzugen wirklich Antworten, die Inhalt enthalten, keine Hinweise auf Inhalte, die leicht verloren gehen können. - Iain