在Vars中使用Dict,在Ansible中使用模板

时间:2017-12-15 19:25:38

标签: ansible ansible-template

我尝试使用具有不同变量集的模板来确定所设置的os任务的每次迭代。例如,在其中一项任务中,我想为postgres设置特定值:

ind = find(logical(diff(x)));    ind = [1 ind ind+1];   %indices
x = x([ind end]);                y = y([ind end]);      %required updated values

在role / vars / main.yaml中,我定义了:

- name: Define values for postgres-ds
  template:
    src: postgres-ds.xml.j2
    dest: /opt/ear_{{ instance_control.value }}/postgres-ds.xml
  vars: "{{ postgres_desenv }}"
  notify: Restart Service

仍然,我收到以下错误:

postgres_desenv:
  var1: somevalue
  var2: someothervalue
  ...

当我尝试在另一个上下文中使用相同的变量时,它可以正常工作:

fatal: [rmt]: FAILED! => {
    "failed": true, 
    "reason": "Vars in a Task must be specified as a dictionary, or a list of dictionaries
    ...

我尝试按照question的答案,但我仍然坚持。

我的下一步是使用变量在变量内调用变量,如:

- debug:
    msg: "{{ item.key }} - {{ item.value }}"
  with_dict: "{{ postgres_desenv }}"

2 个答案:

答案 0 :(得分:1)

您可以这样做:

- name: Define values for postgres-ds
  template:
    src: postgres-ds.xml.j2
    dest: /opt/ear_{{ instance_control.value }}/postgres-ds.xml
  vars:
    settings: "{{ postgres_desenv }}"
  notify: Restart Service

然后在模板中你可以参考,例如,

{{ settings.var1 }}

答案 1 :(得分:-1)

如果在vars / main.yml中定义了postgres_desenv,它将自动加载并可供角色和剧本的其余部分使用。为什么必须在模板模块任务中使用“vars”选项再次指定它?