在Ansible中,有没有办法使用变量名作为值?

时间:2016-04-01 00:30:04

标签: loops variables ansible

我有一个哈希,我在Ansible中循环。

site1:
    some_config: value1
    some_other_config: value2
site2:
    some_config: value3
    some_other_config: value4

使用哈希,我尝试使用模板创建一些文件,如下所示:

- name: create config files
  template: src=templates/site.conf.j2 dest=/etc/nginx/conf.d/site-{{item???}}.conf
  with_items:
      - "{{site1}}"
      - "{{site2}}"

我能够从模板中引用变量item.some_config和其他变量。但我想使用变量名称命名目标文件。像这样,

site-site1.confsite-site2.conf

如何将变量名称称为值?

(简单的解决方法是在每个变量中添加另一个键,其值为site1site2。但这只是多余的)

2 个答案:

答案 0 :(得分:1)

您似乎与最后一段走在了正确的轨道上,但我认为您在这里错过了更简单的数据结构。

相反,您的配置可以设置如下:

configuration:
 - destination: site1
   some_config: value1
   some_other_config: value2
 - destination: site2
   some_config: value3
   some_other_config: value4

然后你可以像这样引用它:

- name: create config files
  template: src=templates/site.conf.j2 dest=/etc/nginx/conf.d/site-{{item.destination}}.conf
  with_items: configuration

现在,当您需要为任务添加更多模板时,您只需要更改configuration变量块而不是实际任务。如果最终在环境级别(通过组变量等)被覆盖,那么这将变得更加灵活。

答案 1 :(得分:1)

在这种情况下,您可以使用with_dict代替with_items稍作修改,这是一个完整的工作示例:

- hosts: all
  gather_facts: no
  vars:
   sites:
     site1:
       some_config: value1
       some_other_config: value2
     site2:
       some_config: value3
       some_other_config: value4
  tasks:
    - name: create config files
      template:
        src: site.conf.j2 
        dest: "/etc/nginx/conf.d/site-{{ item.key }}.conf"
      with_dict: "{{ sites }}"

在模板中,您可以像这样引用值:

{{ item.value.some_config }}
{{ item.value.some_other_config }}

希望这会对你有所帮助