Ansible: встановити змінну для вмісту файлу


93

Я використовую модуль ec2 з тим, ansible-playbookщо хочу встановити змінну для вмісту файлу. Ось як я зараз це роблю.

  1. Var з назвою файлу
  2. завдання оболонки до catфайлу
  3. використовувати результат catпереходу до модуля ec2.

Приклад змісту моєї книги ігор.

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

Я припускаю, що це набагато простіший спосіб зробити це, але я не зміг його знайти під час пошуку документів Ansible.


Цей працював у мене. Я не знайшов, як вставляти змінні в команду пошуку (pipe).
ericson.cepeda

Відповіді:


91

Ви можете використовувати пошук в Ansible, щоб отримати вміст файлу, наприклад

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

Увага: Цей пошук буде працювати з локальними файлами, а не з віддаленими файлами.

Ось повний приклад із документів :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"

90
Зверніть увагу, що пошук виконується локально, тоді як catкоманда у прикладі @ TesterJeff працює на віддаленій машині.
Alex Dupuy

8
Для віддаленого пошуку перевірте модулі вилучення та вибору
Марко Феррарі

15

Ви можете використовувати модуль slurp для отримання файлу з віддаленого хосту: (Дякую @mlissner за пропозицію)

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

8

Ви можете використовувати модуль вибірки для копіювання файлів із віддалених хостів на локальний, а модуль пошуку для читання вмісту отриманих файлів.


6
Я абсолютно новачок у Ansible, але чому б не використовувати для цього функцію slurp? Здається, на пульті працює втягування вмісту файлу.
mlissner

0

пошук працює лише на localhost. Якщо ви хочете отримати змінні з змінного файл , який ви зробили віддалено використовувати include_vars: {{ varfile }}. Зміст {{ varfile }}повинен складати словник форми {"key":"value"}, і ви побачите, що ansible створює проблеми, якщо ви додаєте пробіл після двокрапки.


7
Це нонсенс. include_varsпрацює локально на контрольній машині, а не з файлами на цілі.
techraf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.