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?
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
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
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.
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"
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"
}