Ansible: установить переменную для содержимого файла

94

Я использую модуль 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.

Тестер Джефф
источник
Этот сработал для меня. Я не нашел, как вставлять переменные в команду поиска (конвейера).
ericson.cepeda 06

Ответы:

93

Вы можете использовать поиск в 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 }}"
jabclab
источник
91
Обратите внимание, что поиск выполняется локально, тогда как catкоманда в примере @ TesterJeff выполняется на удаленном компьютере.
Alex Dupuy
8
Для удаленного поиска проверьте модули slurp и fetch
Марко Феррари
16

Вы можете использовать модуль 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
Я совершенно не знаком с анзиблем, но почему бы не использовать для этого slurp? Кажется, работает на пульте, чтобы вытащить содержимое файла.
mlissner
0

поиск работает только на localhost. Если вы хотите получить переменные из переменного файл , который вы сделали удаленно использовать include_vars: {{ varfile }}. Содержимое {{ varfile }}должно быть словарём в форме {"key":"value"}, вы обнаружите, что анзибль вызывает у вас проблемы, если вы добавляете пробел после двоеточия.

DR1979
источник
7
Это нонсенс. include_varsработает локально на управляющей машине, а не с файлами на целевой машине.
techraf