J'utilise Ansible pour certaines tâches simples de gestion des utilisateurs avec un petit groupe d'ordinateurs. Actuellement, mes playbooks sont définis sur hosts: all
et mon fichier d'hôtes n'est qu'un seul groupe avec toutes les machines répertoriées:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Je me suis souvent retrouvé à devoir cibler une seule machine. La ansible-playbook
commande peut limiter les jeux comme celui-ci:
ansible-playbook --limit imac-2.local user.yml
Mais cela semble plutôt fragile, en particulier pour un livre de jeu potentiellement destructeur. Oublier le limit
drapeau signifie que le livre de jeu serait exécuté partout. Étant donné que ces outils ne sont utilisés qu'occasionnellement, il semble utile de prendre des mesures pour une lecture à toute épreuve afin de ne pas nuke accidentellement quelque chose dans quelques mois.
Existe-t-il une meilleure pratique pour limiter les exécutions de playbooks à une seule machine? Idéalement, les livres de jeu devraient être inoffensifs si certains détails importants étaient omis.
la source
--limit office[0]
'{{ target }}'
- selon docs.ansible.com/…run_once
pourrait encore être destructrice, ce n'est donc pas une si bonne idée.-e
est l'équivalent de--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Il y a aussi une petite astuce mignonne qui vous permet de spécifier un seul hôte sur la ligne de commande (ou plusieurs hôtes, je suppose), sans inventaire intermédiaire:
Notez la virgule ( , ) à la fin; cela signale que c'est une liste, pas un fichier.
Maintenant, cela ne vous protégera pas si vous passez accidentellement un vrai fichier d'inventaire, donc ce n'est peut-être pas une bonne solution à ce problème spécifique. Mais c'est une astuce pratique à savoir!
la source
skipping: no hosts matched
. Peut-être que cette astuce ne fonctionne plus depuis les--limit
travaux?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Voir la réponse de Marwan.all
dans la ou les pièces - cela m'a pris du temps à comprendre ...Cette approche se terminera si plusieurs hôtes sont fournis en vérifiant la variable play_hosts . Le module d'échec est utilisé pour quitter si la condition d'hôte unique n'est pas remplie. Les exemples ci-dessous utilisent un fichier hosts avec deux hôtes alice et bob.
user.yml (playbook)
Exécuter le playbook sans filtres d'hôte
Exécuter le playbook sur un seul hôte
la source
--limit
c'est le chemin à parcourirplay_hosts
est déconseillé dans Ansible 2.2 et remplacé paransible_play_hosts
. Pour exécuter sur un hôte sans nécessiter--limit
, vous pouvez utiliserwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
sur Ansible 2.8.4.Il y a à mon humble avis un moyen plus pratique. Vous pouvez en effet demander de manière interactive à l'utilisateur la ou les machines auxquelles il souhaite appliquer le playbook grâce à
vars_prompt
:la source
--extra-vars
et un var normal dans votre playbook…{{ hosts }}
soit évalué avant que la valeur ne soit entrée - ou y a-t-il une astuce spéciale?Pour développer la réponse de joemailer, si vous voulez avoir la capacité de correspondance de motifs pour correspondre à n'importe quel sous-ensemble de machines distantes (tout comme la
ansible
commande), mais que vous voulez toujours rendre très difficile l'exécution accidentelle du playbook sur toutes les machines, c'est ce que j'ai trouvé:Même playbook que dans l'autre réponse:
Ayons les hôtes suivants:
Maintenant, pour exécuter la commande sur tous les appareils, vous devez définir explicitement la variable cible sur "all"
Et pour le limiter à un modèle spécifique, vous pouvez définir
target=pattern_here
ou, alternativement, vous pouvez laisser
target=all
et ajouter l'--limit
argument, par exemple:c'est à dire.
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
ce qui se traduit par:
la source
Je ne comprends vraiment pas comment toutes les réponses sont si compliquées, la façon de le faire est simplement:
Le
check
mode vous permet de fonctionner en mode marche à sec, sans effectuer de changement.la source
--check
, donc je suppose que cela est toujours utile sur le plan de la documentation, comme cette question peut être très googlableLes utilisateurs AWS utilisant le script d'inventaire externe EC2 peuvent simplement filtrer par ID d'instance:
Cela fonctionne car le script d'inventaire crée des groupes par défaut .
la source
Nous avons des playbooks génériques utilisables par un grand nombre d'équipes. Nous avons également des fichiers d'inventaire spécifiques à l'environnement, qui contiennent plusieurs déclarations de groupe.
Pour forcer quelqu'un qui appelle un playbook à spécifier un groupe contre lequel exécuter, nous introduisons une entrée fictive en haut du playbook:
Nous incluons ensuite la vérification suivante comme première étape dans le playbook partagé:
Si le serveur factice apparaît dans la liste des hôtes contre lesquels ce playbook est programmé (ansible_play_batch), alors l'appelant n'a pas spécifié de groupe et l'exécution du playbook échouera.
la source
ansible_play_batch
répertorie uniquement le lot en cours, donc lors de l'utilisation du traitement par lots, cela n'est toujours pas sûr. Il vaut mieux utiliser à laansible_play_hosts
place.Depuis la version 1.7 ansible a l' option run_once . La section contient également une discussion sur diverses autres techniques.
la source
Cela montre comment exécuter les playbooks sur le serveur cible lui-même.
C'est un peu plus compliqué si vous souhaitez utiliser une connexion locale. Mais cela devrait être OK si vous utilisez une variable pour le paramètre hosts et créez dans le fichier hosts une entrée spéciale pour localhost.
Dans (tous) les playbooks, la ligne hosts: est définie sur:
Dans le fichier des hôtes d'inventaire, ajoutez une entrée pour l'hôte local qui définit la connexion comme locale:
Ensuite, sur la ligne de commande, exécutez des commandes définissant explicitement la cible - par exemple:
Cela fonctionnera également lors de l'utilisation de ansible-pull:
Si vous oubliez de définir la variable sur la ligne de commande, la commande produira une erreur en toute sécurité (tant que vous n'avez pas créé un groupe d'hôtes appelé 'no_hosts'!) Avec un avertissement de:
Et comme mentionné ci-dessus, vous pouvez cibler une seule machine (tant qu'elle se trouve dans votre fichier hosts) avec:
ou un groupe avec quelque chose comme:
la source
J'ai un script wrapper appelé provision vous oblige à choisir la cible, donc je n'ai pas à le gérer ailleurs.
Pour ceux qui sont curieux, j'utilise les vars ENV pour les options que mon fichier vagrant utilise (en ajoutant l'argument ansible correspondant pour les systèmes cloud) et laisse le reste des arguments ansible passer. Lorsque je crée et provisionne plus de 10 serveurs à la fois, j'inclut une nouvelle tentative automatique sur les serveurs défaillants (tant que des progrès sont réalisés - j'ai constaté que lors de la création d'une centaine de serveurs à la fois, souvent quelques-uns échouaient la première fois) ).
la source
Une solution légèrement différente consiste à utiliser la variable spéciale
ansible_limit
qui est le contenu de l'--limit
option CLI pour l'exécution actuelle d'Ansible.Pas besoin de définir une variable supplémentaire ici, il suffit d'exécuter le playbook avec le
--limit
drapeau.la source