Ceci est un fragment d'un playbook que j'utilise ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Mon fichier hosts a différents groupes de serveurs, par exemple
[web]
x.x.x.x
[droplets]
x.x.x.x
Maintenant , je veux exécuter ansible-playbook -i hosts/<env> server.yml
et passer outre hosts: web
de server.yml
faire fonctionner ce livre de jeux pour [droplets]
.
Puis-je simplement remplacer en une seule fois, sans modifier server.yml
directement?
Merci.
ansible
ansible-playbook
luqo33
la source
la source
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
semblent être analysées après lahosts:
ligne du playbook. Cependant, les variables dansvars:
et les variables dansvars_files:
sont analysées avant lahosts:
ligne? REMARQUE Je ne demande pas la préséance.-e
place de--extra-vars
.Pour tous ceux qui pourraient chercher la solution.
Livre de jeu
Inventaire
Commande:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
vous pouvez donc spécifier le nom du groupe dans les extra-varsla source
play_hosts
et n'obtenais pas les résultats escomptés car j'avais oublié qu'il s'agissait d'play_hosts
une variable Ansible interne pour tous les hôtes de la lecture actuelle.C'est un peu tard, mais je pense que vous pourriez utiliser le
--limit or -l
commande pour limiter le modèle à des hôtes plus spécifiques. (version 2.3.2.0)Tu aurais pu
- hosts: all (or group) tasks: - some_task
puis
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
et utilisez l'--list-hosts
indicateur pour voir sur quels hôtes cette configuration serait appliquée.la source
limit
la liste des hôtes concernés, le playbook peut causer beaucoup de dégâts.--extra-vars "variable_host=newtarget(s)"
comme la solution acceptée est aussi dangereux et une solution plus compliquée. Il utilise un hôte par défautweb
qui pourrait également être appliqué ici à la place deall
. Vous pouvez utiliser un groupe d'hôtes strict par défaut pour éviter de faire une erreur et utiliser l'--list-hosts
indicateur pour avoir une compréhension claire des hôtes que vous affectez.--limit
(sinon cela affectera tous les hôtes possibles, ce qui peut ne pas être le comportement que vous souhaitez)Nous utilisons une tâche d' échec simple pour forcer l'utilisateur à spécifier l' option de limite Ansible , afin de ne pas s'exécuter sur tous les hôtes par défaut / accident.
Le moyen le plus simple que j'ai trouvé est le suivant:
Maintenant, nous devons utiliser l' option
-l
(=--limit
) lorsque nous exécutons le playbook, par exempleDocuments sur les options de limite :
la source
J'utilise une autre approche qui ne nécessite aucun inventaire et fonctionne avec cette commande simple:
Pour ce faire, vous avez besoin d'un playbook avec deux pièces:
Un exemple de travail (copiez-le et exécutez-le avec la commande précédente):
la source
J'ai changé le mien par défaut en aucun hôte et j'ai un chèque pour l'attraper. De cette façon, l'utilisateur ou cron est obligé de fournir un seul hôte ou groupe, etc. J'aime la logique du commentaire de @wallydrag. Le
empty_group
ne contient aucun hôte dans l'inventaire.Ajoutez ensuite les tâches d'archivage:
la source
Je viens de trouver une solution sur Google. En fait, il y en a un dans Ansible 2.5. Vous pouvez spécifier votre fichier d'inventaire avec
--inventory
, comme ceci:ansible --inventory configs/hosts --list-hosts all
la source
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Si vous souhaitez exécuter une tâche associée à un hôte, mais sur un hôte différent, vous devez essayer delegate_to .
Dans votre cas, vous devez déléguer à votre hôte local (maître ansible) et appeler la
ansible-playbook
commandela source
J'utilise ansible 2.5 (2.5.3 exactement), et il semble que le fichier vars soit chargé avant l'exécution du paramètre hosts. Vous pouvez donc définir l'hôte dans un fichier vars.yml et écrire simplement
hosts: {{ host_var }}
dans votre playbookPar exemple, dans mon playbook.yml:
Et dans vars / project.yml:
la source
Voici une solution intéressante que j'ai proposée pour spécifier en toute sécurité les hôtes via l'
--limit
option. Dans cet exemple, la lecture se terminera si le playbook a été exécuté sans aucun hôte spécifié via le--limit
option.Cela a été testé sur la version 2.7.10 d'Ansible
la source
Une autre solution consiste à utiliser la variable spéciale
ansible_limit
qui est le contenu de l'--limit
option CLI pour l'exécution en cours d'Ansible.Si l'
--limit
option est omise, Ansible émet un avertissement, mais ne fait rien car aucun hôte ne correspond.la source