Ansible: Variable auf Dateiinhalt setzen

93

Ich verwende das ec2-Modul ansible-playbook, um eine Variable für den Inhalt einer Datei festzulegen . Hier ist, wie ich es gerade mache.

  1. Var mit dem Dateinamen
  2. Shell-Aufgabe in catdie Datei
  3. Verwenden Sie das Ergebnis von cat, um an das ec2-Modul zu übergeben.

Beispielinhalt meines Spielbuchs.

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: user_data_contents
  shell: cat {{ user_data_file }}
  register: user_data_action
- name: launch ec2-instance
  local_action:
...
  user_data: "{{ user_data_action.stdout }}"

Ich gehe davon aus, dass es einen viel einfacheren Weg gibt, dies zu tun, aber ich konnte ihn beim Durchsuchen von Ansible-Dokumenten nicht finden.

TesterJeff
quelle
Dieser hat für mich gearbeitet. Ich habe nicht gefunden, wie Variablen in einen Lookup-Befehl (Pipe-Befehl) eingebettet werden können.
ericson.cepeda

Antworten:

90

Sie können mit Lookups in ansible , um den Inhalt einer Datei, zB bekommen

user_data: "{{ lookup('file', user_data_file) }}"

Vorsichtsmaßnahme: Diese Suche funktioniert mit lokalen Dateien, nicht mit Remote-Dateien.

Hier ist ein vollständiges Beispiel aus den Dokumenten :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab
quelle
90
Beachten Sie, dass die Suche lokal ausgeführt wird, während der catBefehl im Beispiel von @ TesterJeff auf dem Remotecomputer ausgeführt wird.
Alex Dupuy
8
Für Remote-Lookups überprüfen Sie die Slurp- und Fetch-Module
Marco Ferrari
14

Sie können das Slurp-Modul verwenden: (Vielen Dank an @mlissner für den Vorschlag)

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: Load data
  slurp:
    src: "{{ user_data_file }}"
  register: slurped_user_data
- name: Decode data and store as fact # You can skip this if you want to use the right hand side directly...
  set_fact:
    user_data: "{{ slurped_user_data.content | b64decode }}"
Gert van den Berg
quelle
8

Sie können das Abrufmodul verwenden, um Dateien von Remote-Hosts auf lokale zu kopieren, und das Suchmodul , um den Inhalt der abgerufenen Dateien zu lesen.

Taha Jahangir
quelle
6
Ich bin völlig neu in Ansible, aber warum nicht Slurp dafür verwenden? Es scheint auf der Fernbedienung zu funktionieren, um den Inhalt einer Datei abzurufen.
mlissner
0

Die Suche funktioniert nur auf localhost. Wenn Sie Variablen aus einer Variablendatei abrufen möchten, die Sie remote verwendet haben, verwenden Sie include_vars : {{ varfile }}. Der Inhalt von {{ varfile }}sollte ein Wörterbuch des Formulars sein {"key":"value"}. Sie werden feststellen, dass ansible Ihnen Probleme bereitet, wenn Sie ein Leerzeichen nach dem Doppelpunkt einfügen.

DR1979
quelle
7
Das ist schwachsinn. include_varsFunktioniert lokal auf dem Steuercomputer, nicht mit Dateien auf dem Ziel.
Techraf