117

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

  1. 带有文件名的变量
  2. 外壳任务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 文档时我找不到它。

4

4 回答 4

114

您可以在 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 }}"
于 2014-06-03T11:55:35.220 回答
32

您可以使用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 }}"
于 2018-09-19T09:47:23.607 回答
9

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

于 2014-09-09T13:35:21.577 回答
-1

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

于 2015-05-02T15:15:19.593 回答