Ansible: установить переменную в содержимое файла
Я использую модуль ec2 с ansible-playbook
Я хочу установить переменную содержимое файла. Вот как я сейчас это делаю.
- Var с именем файла
- shell задача
cat
файл - использовать результат
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 доктора.
4 ответов
можно использовать поиска в Ansible, чтобы получить содержимое файла, например
user_data: "{{ lookup('file', user_data_file) }}"
здесь полный пример из docs:
- 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 }}"