Ansible: установка переменной в файл
Я использую модуль ec2 с ansible-playbook
Я хочу установить переменную в содержимое файла. Вот как я сейчас это делаю.
- Вар с именем файла
- Задача оболочки для
cat
файла
- используйте результат
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.
Ответы
Ответ 1
Вы можете использовать поиски в 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 }}"
Ответ 2
Вы можете использовать модуль fetch для копирования файлов с удаленных хостов на локальный, а модуль lookup - для чтения содержимого извлеченных файлов.
Ответ 3
поиск работает только на localhost. Если вы хотите получить переменные из файла переменных, которые вы использовали удаленно, используйте include_vars: {{ varfile }}
. Содержание {{ varfile }}
должно быть словарем формы {"key":"value"}
, вы обнаружите, что проблема может возникнуть, если вы включите пробел после двоеточия.
Ответ 4
Вы можете использовать модуль 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 }}"