web-dev-qa-db-fra.com

Comment boucler sur chaque ligne d'un fichier avec ansible?

Je cherche quelque chose qui serait similaire à with_items: mais cela obtiendrait la liste des éléments d'un fichier au lieu de devoir l'inclure dans le fichier playbook.

Comment puis-je faire cela en ansible?

14
sorin

J'ai réussi à trouver une alternative simple:

- debug: msg="{{item}}"
  with_lines: cat files/branches.txt
23
sorin

Disons que vous avez un fichier comme

item 1
item 2
item 3

Et vous souhaitez installer ces éléments. Obtenez simplement le contenu du fichier dans une variable à l'aide de register.Et utilisez cette variable pour with_items. Assurez-vous que votre fichier contient un élément par ligne.

---
- hosts: your-Host
  remote_user: your-remote_user
  tasks:
  - name: get the file contents
    command: cat /path/to/your/file
    register: my_items
  - name: install these items
    pip: name:{{item}}
    with_items: my_items.stdout_lines
11
lenin

Je suis surpris que personne n'ait mentionné la recherche ansible , je pense que c'est exactement ce que vous voulez.

Il lit le contenu que vous souhaitez utiliser dans votre playbook mais ne souhaitez pas inclure dans le playbook à partir des fichiers , pipe , csv , redis etc depuis votre machine de contrôle locale (pas depuis une machine distante, c'est important, car dans la plupart des cas, ces contenus sont à côté de votre playbook sur votre machine locale) , et il fonctionne avec des boucles ansibles.

---
- hosts: localhost
  gather_facts: no
  tasks:
    - name: Loop over lines in a file
      debug:
        var: item
      with_lines: cat "./files/lines"

with_lines ici est en fait une boucle avec recherche de lignes, pour voir comment fonctionne la recherche lines, voir le code ici , il exécute simplement toutes les commandes que vous lui donnez (donc vous pouvez lui donner n'importe quelle chose comme echo, cat etc), puis diviser la sortie en lignes et les renvoyer.

Il existe de nombreuses recherches puissantes, pour obtenir la liste complète, consultez le dossier plugins de recherche .

7
Minghao Ni

Dernière Ansible recommande loop au lieu de with_something. Il peut être utilisé en combinaison avec lookup et splitlines(), comme Ikar Pohorský l'a souligné:

- debug: msg="{{item}}"
  loop: "{{ lookup('file', 'files/branches.txt').splitlines() }}"

files/branches.txt Doit être relatif au playbook

2
Cristian