安赛尔: 将变量设置为文件内容

我使用的是带有 ansible-playbook的 ec2模块,我想为文件的内容设置一个变量。我现在是这么做的。

  1. 具有文件名的 Var
  2. Shell 任务到 cat的文件
  3. use the result of the cat to pass to the ec2 module.

我剧本的内容范例。

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

我想应该有更简单的方法,但是我在搜索安塞尔文档的时候找不到。

175832 次浏览

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

可以使用 获取模块获取模块将文件从远程主机复制到本地,使用 lookup module读取所获取文件的内容。

查找只能在本地主机上运行。如果要从远程创建的变量文件中检索变量,请使用 include _ vars: \{\{ varfile }}。内容的 \{\{ varfile }}应该是一个字典的形式 {"key":"value"},你会发现给你带来麻烦,如果你包括一个空格后的冒号。

您可以使用 吃东西模块从远程主机获取文件: (感谢@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 }}"