web-dev-qa-db-fra.com

Remplacer les variables hôtes du livre de lecture Ansible à partir de la ligne de commande

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.

59
luqo33

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

40
Mrunal Gosar

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.

7
Jonathan Hamel

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 == "") 
5
Tony-Caffe

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:

  • la première lecture est exécutée sur localhost et ajoute un hôte (à partir de la variable donnée) dans un groupe connu de l'inventaire par mémoire
  • deuxième jeu tourne 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

4
Nelson G.

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
2
LightMan

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

2
nghnam

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
1
TmTron

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

1
Bebef

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}}"
0
sudo soul