Ansible: Set variable to file content

AnsibleAnsible Playbook

Ansible Problem Overview


I'm using the ec2 module with ansible-playbook I want to set a variable to the contents of a file. Here's how I'm currently doing it.

  1. Var with the filename
  2. shell task to cat the file
  3. use the result of the cat to pass to the ec2 module.

Example contents of my 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 }}"

I assume there's a much easier way to do this, but I couldn't find it while searching Ansible docs.

Ansible Solutions


Solution 1 - Ansible

You can use lookups in Ansible in order to get the contents of a file, e.g.

user_data: "{{ lookup('file', user_data_file) }}"

Caveat: This lookup will work with local files, not remote files.

Here's a complete example from the docs:

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"

Solution 2 - Ansible

You can use the slurp module to fetch a file from the remote host: (Thanks to @mlissner for suggesting it)

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

Solution 3 - Ansible

You can use fetch module to copy files from remote hosts to local, and lookup module to read the content of fetched files.

Solution 4 - Ansible

lookup only works on localhost. If you want to retrieve variables from a variables file you made remotely use include_vars: {{ varfile }} . Contents of {{ varfile }} should be a dictionary of the form {"key":"value"}, you will find ansible gives you trouble if you include a space after the colon.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTesterJeffView Question on Stackoverflow
Solution 1 - AnsiblejabclabView Answer on Stackoverflow
Solution 2 - AnsibleGert van den BergView Answer on Stackoverflow
Solution 3 - AnsibleTaha JahangirView Answer on Stackoverflow
Solution 4 - AnsibleDR1979View Answer on Stackoverflow