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

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"}, вы обнаружите, что анзибль вызывает у вас проблемы, если вы добавляете пробел после двоеточия.


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