Ansible: Set variable to file content

TesterJeff picture TesterJeff · Jun 2, 2014 · Viewed 115.7k times · Source

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.

Answer

jabclab picture jabclab · Jun 3, 2014

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