Ceci est un fragment d'un livre de lecture que j'utilise (server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Le fichier Mes hôtes contient 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 livre de lecture pour [droplets]
.
Puis-je simplement remplacer comme une seule fois, sans modifier server.yml
directement?
Merci.
Pour tous ceux qui pourraient venir chercher la solution.
Livre de lecture
- 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"
Vous pouvez donc spécifier le nom du groupe dans l'extra
C'est un peu tard, mais je pense que vous pourriez utiliser la commande --limit or -l
pour limiter le modèle à des hôtes plus spécifiques. (version 2.3.2.0)
Vous pourriez avoir
- 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'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 hôte ou un groupe unique, etc. J'aime la logique du commentaire de @wallydrag. Le empty_group
ne contient aucun hôte dans l'inventaire.
- hôtes: "{{variable_host | default ('empty_group')}}"
Ajoutez ensuite les tâches d’archivage:
les tâches: - name: script d'échec si nécessaire Le paramètre variable_Host est manquant échouer: msg: "Vous devez ajouter le --extra-vars = 'variable_Host ='" quand: (variable_Host n'est pas défini) ou (variable_Host == "")
J'utilise une autre approche qui ne nécessite aucun inventaire et fonctionne avec cette commande simple:
ansible-playbook site.yml -e working_Host=myhost
Pour ce faire, vous avez besoin d'un livre de jeu avec deux jeux:
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
J'utilise ansible 2.5 (2.5.3 exactement), et il semble que le fichier vars soit chargé avant que le paramètre hosts ne soit exécuté. Vous pouvez donc définir l’hôte dans un fichier vars.yml et écrire simplement 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
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 devriez déléguer à votre localhost (ansible master) et appeler la commande ansible-playbook
Je pense que l'argument de limite est déjà excellent - je veux simplement obliger l'utilisateur à spécifier la limite, afin que nous n'exécutions pas tous les hôtes par accident.
Le moyen le plus simple que j'ai trouvé est le suivant:
---
- name: Force limit
# all is okay, because we must anyway specify a limit
hosts: 'all'
tasks:
- name: checking limit arg
fail:
msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
when: ansible_limit is not defined
run_once: true
Je viens de trouver cette solution sur Google. En fait, il en existe un dans Ansible 2.5. Vous pouvez spécifier votre fichier d'inventaire avec --inventory
, comme ceci: ansible --inventory configs/hosts --list-hosts all
Voici une solution intéressante que je suis venu pour spécifier en toute sécurité des hôtes via l'option --limit
. Dans cet exemple, la lecture se terminera si le playbook a été exécuté sans aucun hôte spécifié via l'option --limit
.
Ceci a été testé sur Ansible version 2.7.10
---
- name: Playbook will fail if hosts not specified via --limit option.
# Hosts must be set via limit.
hosts: "{{ play_hosts }}"
connection: local
gather_facts: false
tasks:
- set_fact:
inventory_hosts: []
- set_fact:
inventory_hosts: "{{inventory_hosts + [item]}}"
with_items: "{{hostvars.keys()|list}}"
- meta: end_play
when: "(play_hosts|length) == (inventory_hosts|length)"
- debug:
msg: "About to execute tasks/roles for {{inventory_hostname}}"