Ansible:将变量设置为文件内容

时间:2014-06-02 21:50:13

标签: ansible ansible-playbook

我正在使用带有ansible-playbook的ec2模块我想将变量设置为文件的内容。这是我目前正在做的事情。

  1. Var,文件名为
  2. shell任务到cat文件
  3. 使用cat的结果传递给ec2模块。
  4. 我的剧本的示例内容。

    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文档时我找不到它。

3 个答案:

答案 0 :(得分:74)

您可以在Ansible中使用lookups来获取文件的内容,例如

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

警告:此查找适用于本地文件,而不是远程文件。

这是complete example from the docs

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

答案 1 :(得分:8)

您可以使用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 }}"

答案 2 :(得分:6)

您可以使用fetch module将文件从远程主机复制到本地,并使用lookup module来读取已获取文件的内容。