Ecrire une variable dans un fichier dans Ansible

101

Je tire JSON via le module URI et je souhaite écrire le contenu reçu dans un fichier. Je suis capable d'obtenir le contenu et de le sortir vers le débogueur, donc je sais que le contenu a été reçu, mais je ne connais pas les meilleures pratiques pour écrire des fichiers.

Keith Adler
la source

Réponses:

200

Vous pouvez utiliser le copymodule, avec le contentparamètre:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

La documentation ici: module de copie

Ramon de la Fuente
la source
5
content = "{{your_json_feed}}" traite des espaces et des retours à la ligne. Les citations sont importantes.
m.kocikowski
@RamondelaFuente Si je souhaite ajouter plusieurs contenus vars au fichier, je dois utiliser le module "copier" plusieurs fois ou y a-t-il un autre moyen?
KishoreReddy
1
@KishoreReddy J'imagine que vous pouvez utiliser la syntaxe jinja2 pour ajouter des variables. Quelque chose comme "{{variable ~ another_variable}}". Pas joli, mais si les choses se compliquent, vous pouvez utiliser le template:module et le remplir avec les variables enregistrées lors de l'exécution.
Ramon de la Fuente
Cela fonctionne mieux lorsque vous souhaitez générer un fichier de somme sha256 sous la forme shahash /path/to/file(notez 2 espaces entre les deux), puis valider à partir de la ligne de commande (via sha256sum -c shafile) ce que vous avez généré via Ansible.
Daniel Andrei Mincă
11

À moins que vous n'écriviez de très petits fichiers, vous devriez probablement utiliser des modèles .

Exemple:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
la source
2
Alors que la réponse de Ramon répond exactement à ce qui a été demandé, cette réponse est la meilleure approche en général. Par exemple, si vous disposez d'un playbook qui crée des VM dans le cloud et que vous souhaitez générer un inventaire d'hôtes pour un autre playbook, un modèle est la solution.
Luis Artola
Pouvez-vous expliquer pourquoi c'est mieux?
Vorticity le
@Vorticity mieux que quoi?
Janus Troelsen le
@JanusTroelsen Désolé, pouvez-vous expliquer pourquoi c'est mieux que la réponse acceptée lors de l'écriture de gros fichiers?
Vorticity le
1
@Vorticity car il devient difficile à manier lorsqu'un fichier est intégré dans un autre fichier. vous avez besoin d'un échappement et la coloration syntaxique ne fonctionnera pas. le mécanisme de création de modèles permet d'insérer des éléments au milieu si vous en avez besoin.
Janus Troelsen le
10

Sur la base de la réponse de Ramon, je rencontre une erreur. Le problème des espaces dans le JSON que j'ai essayé d'écrire, je l'ai résolu en modifiant la tâche dans le playbook pour qu'elle ressemble à:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

À partir de maintenant, je ne sais pas pourquoi cela était nécessaire. Ma meilleure hypothèse est que cela a quelque chose à voir avec la façon dont les variables sont remplacées dans Ansible et le fichier résultant est analysé.

Tobias Kremer
la source
0

Nous pouvons spécifier directement le fichier de destination avec l' destoption maintenant. Dans l'exemple ci-dessous, le json de sortie est stocké dans le/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
venkata
la source