Remplacer la variable hosts D'Ansible playbook à partir de la ligne de commande
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 remplacer hosts: web
à partir de server.yml
pour exécuter ce playbook pour [droplets]
.
Puis-je simplement remplacer en une seule fois, sans modifier server.yml
directement?
Merci.
7 réponses
Je ne pense pas Qu'Ansible fournisse cette fonctionnalité, ce qui devrait être le cas. Voici quelque chose que vous pouvez faire:
hosts: "{{ variable_host | default('web') }}"
Et vous pouvez passer variable_host
à partir de la ligne de commande ou d'un fichier vars, par exemple:
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
Pour tous ceux qui pourraient venir chercher la solution.
Jouer Livre
- hosts: '{{ host }}'
tasks:
- debug: msg="Host is {{ ansible_fqdn }}"
Inventaire
[web]
x.x.x.x
[droplets]
x.x.x.x
Commande: ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
Ainsi, vous pouvez spécifier le nom du groupe dans les extra-vars
C'est un peu tard, mais je pense que vous pouvez utiliser la commande --limit or -l
pour limiter le modèle à des hôtes plus spécifiques. (version 2.3.2.0)
Vous auriez pu
- hosts: all (or group)
tasks:
- some_task
, puis ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
et utilisez l'indicateur --list-hosts
pour voir sur quels hôtes cette configuration serait appliquée.
J'utilise une autre approche qui n'a pas besoin d'inventaire et fonctionne avec cette commande simple:
ansible-playbook site.yml -e working_host=myhost
Pour effectuer cela, vous avez besoin d'un playbook avec deux pièces:
- la première lecture s'exécute sur localhost et ajoute un hôte (à partir d'une variable donnée) dans un groupe connu dans l'inventaire inmemory
- deuxième jeu fonctionne sur ce groupe connu
Un exemple de travail (Copiez-le et exécutez-le avec la commande précédente):
- hosts: localhost
connection: local
tasks:
- add_host:
name: "{{ working_host }}"
groups: working_group
changed_when: false
- hosts: working_group
gather_facts: false
tasks:
- debug:
msg: "I'm on {{ ansible_host }}"
J'utilise ansible 2.4.3 et 2.3.3
Si vous voulez exécuter une tâche associée à un hôte, mais sur un hôte différent, vous devriez essayer delegate_to .
Dans votre cas, vous devez déléguer à votre localhost (maître ansible) et appeler ansible-playbook
commande
J'utilise ansible 2.5 (2.5.3 exactement), et il semble que le fichier vars est chargé avant l'exécution du paramètre hosts. Ainsi, vous pouvez définir l'hôte dans un var.YML fichier et juste écrire hosts: {{ host_var }}
dans votre playbook
Par exemple, dans mon playbook.yml:
---
- hosts: "{{ host_name }}"
become: yes
vars_files:
- vars/project.yml
tasks:
...
Et à l'intérieur de Vars / project.yml:
---
# general
host_name: your-fancy-host-name
Juste tombé sur ce googling pour une solution. 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