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?
J'ai réussi à trouver une alternative simple:
- debug: msg="{{item}}"
with_lines: cat files/branches.txt
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
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 .
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