8 votes

Exécuter la tâche ansible incluse comme une tâche autonome

J'ai de nombreux playbooks Ansible qui seront inclus dans des playbooks beaucoup plus importants. Par exemple :

---
- name: Add user me
  user: name=me comment="Me" uid=9999 groups=somegroup
- name: Add my ssh public key
  authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}"

Existe-t-il un moyen de passer un nom d'hôte et de l'exécuter comme une tâche autonome à partir de la ligne de commande, ou dois-je créer un autre playbook pour exécuter ces deux tâches par elles-mêmes ?

6voto

Oleg Bondar' Points 11

Il y a deux conditions à remplir pour y parvenir

  1. l'hôte que vous essayez de cibler doit être dans un fichier d'inventaire
  2. vous devez étiqueter les tâches dans le rôle que vous voulez exécuter

    - name: Add user me
      user: name=me comment="Me" uid=9999 groups=somegroup
      tags: this_role
    - name: Add my ssh public key
      authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}"
      tags: this_role

Alors vous pouvez :-

ansible-playbook foo.yml -i hosts -t this_role --limit host.example.com

Non pas que cela exécute toujours le playbook qui contient le jeu complet, mais cela limite les tâches qui s'exécutent à celles qui correspondent à la balise. Les autres tâches seront ignorées.

0 votes

Les documents et les messages du forum donnent l'impression que l'exécution d'une petite partie d'un ensemble plus vaste est la solution (par opposition à l'exécution de parties individuelles et autonomes).

1voto

JesseTG Points 235

Beide utilisateur y clé_autorisée sont des modules. Vous pouvez donc les appeler avec ansible -m à partir de n'importe quel script.

ansible all -i host.example.com, -m user -a 'name=me comment="Me" uid=9999 groups=somegroup'
ansible all -i host.example.com, -m authorized_key -a "user=me key=\"{{ lookup('file', 'id_rsa.pub') }}\""

Notez la virgule de fin après le nom d'hôte.


Une autre approche serait d'utiliser include o include_tasks dans le cas de

ansible all -i host.example.com, -m include_tasks -a /path/to/some/taskfile.yml

Et en utilisant inclure_rôle pourrait ressembler à

ansible all -i localhost, -c local --playbook-dir /path/to/roles -m include_role -a name=test

Bien que include pourrait être déprécié à l'avenir (au profit de l'option include_tasks o include_role )

Note

  • ...
  • Ce module sera encore supporté pendant un certain temps, mais nous envisageons de le déprécier dans un avenir proche.

0voto

Samat Jain Points 165

Bien sûr, vous devriez être capable de faire quelque chose comme :

$ ansible-playbook foo.yml -i hosts -u user --limit host.example.com

0 votes

Lorsque je lance le playbook ci-dessus comme ceci, j'obtiens ERROR: hosts declaration is required

0voto

Leo Ufimtsev Points 111

J'ai également rencontré ce problème.

J'ai contourné le problème en créant un petit playbook runner, que j'appelle ensuite avec un paramètre.

> tree
.
 ansible.cfg
 inventory
 taskrunner.yml
 tasks
 hello.yml

> cat taskrunner.yml:
  ---
  - hosts: all
    tasks:
    - name: "Runner will try to run task: {{ task }}"
      include: "{{ task }}"

> cat tasks/hello
  - name: print hello
    shell: echo hello world

> ansible-playbook taskrunner.yml -e task=tasks/hello.yml

0voto

etcshad0vv Points 61

Vous pouvez créer un inventaire et assigner des variables à un sous-ensemble d'un groupe spécifique d'hôtes, puis utiliser des conditions sous des tâches que vous exécuteriez lorsque cette condition est remplie en fonction des variables définies.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X