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


93

我正在使用ec2模块,ansible-playbook我想将一个变量设置为文件的内容。这是我目前的操作方式。

  1. 带有文件名的变量
  2. Shell任务到cat文件
  3. 使用的结果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文档时找不到。


这个为我工作。我没有找到如何将变量嵌入到lookup(pipe)命令中。
ericson.cepeda 2015年

Answers:


90

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

90
请注意,查找在本地运行,而cat@TesterJeff示例中的命令在远程计算机上运行。
Alex Dupuy 2014年

8
对于远程查找,请检查slurp和fetch模块
Marco Ferrari

14

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


0

查找仅适用于本地主机。如果你想要从一个变量,变量文件你让远程使用include_vars: {{ varfile }}。目录的形式{{ varfile }}应该是字典, {"key":"value"}如果您在冒号后面加一个空格,您会发现ansible给您带来麻烦。


7
这是无稽之谈。include_vars在控制机器上本地工作,而不与目标上的文件一起工作。
techraf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.