web-dev-qa-db-fra.com

Changement de port ssh dans playbook

Voici le fichier d'inventaire

---
[de-servers]
192.26.32.32

[uk-servers]
172.21.1.23
172.32.2.11

et mon cahier est comme ça:

- 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

Dans le rôle rôle de-server-setup, le port ssh est passé de 22 à 8888; ainsi, lorsque la dernière tâche est appelée, elle échoue car elle ne peut pas se connecter à l'hôte via le port 22. Comment surmonter ce changement de port ssh?

11
Nasr

Dans le rôle de-server-setup, ajoutez une tâche pour modifier la variable hôte ansible_port.

- name: Change ssh port to 8888
  set_fact:
    ansible_port: 8888
17
chrism

La seule chose à laquelle je peux penser qui pourrait fonctionner serait de créer des alias ssh pour vos hôtes. Dans votre .ssh/config:

Host de.1.before
  HostName 192.26.32.32
  Port 22

Host de.1.after
  HostName 192.26.32.32
  Port 8888

Ensuite, utilisez ces alias dans votre inventaire Ansible:

[de-servers-before]
de.1.before

[de-servers-after]
de.1.after

Et les groupes définis puis respectivement dans vos jeux:

- 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
7
udondan

Je dois changer les ports ssh sur les hôtes que je gère et que je veux utiliser Ansible pour le faire. Ansible utilise essentiellement la logique suivante pour gérer Ce sont des connexions SSH:

    if self.port is not None:
        ssh -p {{ self.port }} ...
    else:
        ssh ...

où "self.port" est la spécification de port de l'inventaire de l'hôte, .__ ou un remplacement via le paramètre "-e", ou une déclaration explicite de les variables "ansible_port" et/ou "ansible_ssh_port". La solution recommandée par Pour changer de ports consiste à utiliser les modules "Wait_for" et "when" dans "pre_tasks", mais il existe de nombreuses insuffisances Dans cette approche, en particulier lorsque de nombreux hôtes Sont impliqués et surtout lorsque vous souhaitez utiliser différents ports sur différents hôtes.

J'ai cloné et corrigé le plug-in ssh (versions 1 et 2) pour changer la logique comme suit:

if self.port is not None and self.port is OPEN:
    ssh -p {{ self.port }} ...
else:
    ssh ...

Le correctif, par lui-même, n'apporte aucune modification aux nœuds cibles, mais permet aux connexions de réussir, même si les ports des nœuds .__ n'ont pas encore changé. Avec le correctif, il est maintenant très facile d’écrire Rôles/tâches pour changer les ports ssh en ce qui est dans l’inventaire de l’hôte

Si cela vous intéresse, vous pouvez trouver le correctif et des exemples Comment l'utiliser: https://github.com/crlb/ansible ; theREADME.md contient des informations supplémentaires.

3
crlb

Ma solution complète à ce problème consistait à créer un livre de lecture commun importé en haut de tous les autres livres de lecture afin de vérifier l'état du ansible_port non standard défini dans l'inventaire. Si le port est ouvert, continuez normalement. S'il n'est pas ouvert, vérifiez le port 22 et définissez le fait ansible_port sur le cas échéant. 

Plus tard, lorsque le serveur SSH est configuré pour la première fois et que le port par défaut est remplacé par mon port non standard, je mets à jour le fait ansible_port manuellement dans mon livre de jeu afin que toute autre connexion Ansible de l'exécution en cours fonctionne comme prévu.

Mon inventaire ressemble à ceci:

[webservers]
web01.somedomain.com ansible_port=1234

Mon playbook ressemble à ceci:

- 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

Enfin, juste après la configuration du serveur SSH et le changement de port, voici ce que j'ai:

- name: Set SSH port to 1234
  set_fact:
    ansible_port: "1234"
2
Genesis

Facile, éditez/etc/ansible/hosts:

[my_server]
ssdnodes:54321

et vous pouvez le tester en émettant un ping:

ansible ssdnodes -m ping

et la réponse serait:

ssdnodes | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
0
mzalazar