Ansible: Tetapkan variabel ke konten file

94

Saya menggunakan modul ec2 dengan ansible-playbooksaya ingin mengatur variabel ke konten file. Begini cara saya melakukannya.

  1. Var dengan nama file
  2. tugas shell ke catfile
  3. gunakan hasil dari catuntuk lolos ke modul ec2.

Contoh isi playbook saya.

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 }}"

Saya berasumsi ada cara yang lebih mudah untuk melakukan ini, tetapi saya tidak dapat menemukannya saat mencari dokumen Ansible.

TesterJeff
sumber
Yang ini berhasil untuk saya. Saya tidak menemukan cara menanamkan variabel dalam perintah pencarian (pipa).
ericson.cepeda

Jawaban:

93

Anda dapat menggunakan pencarian di Ansible untuk mendapatkan konten file, mis

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

Peringatan: Pencarian ini akan bekerja dengan file lokal, bukan file jarak jauh.

Berikut contoh lengkap dari dokumen :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab.dll
sumber
91
Perhatikan bahwa pencarian berjalan secara lokal, sedangkan catperintah dalam contoh @ TesterJeff dijalankan pada mesin jarak jauh.
Alex Dupuy
8
Untuk pencarian jarak jauh, periksa modul slurp and fetch
Marco Ferrari
16

Anda dapat menggunakan modul slurp untuk mengambil file dari host jarak jauh: (Terima kasih kepada @mlissner karena telah menyarankannya)

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
sumber
8

Anda dapat menggunakan modul fetch untuk menyalin file dari host jarak jauh ke lokal, dan modul lookup untuk membaca konten file yang diambil.

Taha Jahangir
sumber
6
Saya benar-benar baru mengenal ansible, tetapi mengapa tidak menggunakan slurp untuk ini? Tampaknya berfungsi pada remote untuk menarik konten file.
mlissner
0

pencarian hanya berfungsi di localhost. Jika Anda ingin mengambil variabel dari variabel file yang dibuat dari jarak jauh menggunakan include_vars: {{ varfile }}. Isi {{ varfile }}harus kamus bentuk {"key":"value"}, Anda akan menemukan kemungkinan memberi Anda masalah jika Anda memasukkan spasi setelah titik dua.

DR1979
sumber
7
Ini tidak masuk akal. include_varsbekerja secara lokal di mesin kontrol, bukan dengan file pada target.
techraf