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.

47
demandé sur luqo33 2015-10-19 22:45:50

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)"
63
répondu wallydrag 2017-09-14 08:43:42

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

36
répondu Mrunal Gosar 2016-11-29 13:17:49

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.

7
répondu Jonathan Hamel 2017-08-29 14:52:23

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

3
répondu Nelson G. 2018-04-12 07:14:39

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

2
répondu nghnam 2015-10-20 08:39:20

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
1
répondu LightMan 2018-05-31 09:03:44

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

0
répondu Bebef 2018-05-09 09:39:44