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



Я использую модуль ec2 с ansible-playbook Я хочу задать переменную для содержимого файла. Вот как я сейчас это делаю.




  1. Var с именем файла

  2. shell task to cat файл

  3. использовать результат cat для перехода к модулю ec2.


пример содержимого моего playbook.



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 доктора.

904   4  

4 ответов:

можно использовать поиска в 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 }}"

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

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

вы можете использовать модуль 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 }}"

Comments

    Ничего не найдено.