Automation 从Ansible变量输出中删除引号

Automation 从Ansible变量输出中删除引号,automation,yaml,ansible,jinja2,configuration-management,Automation,Yaml,Ansible,Jinja2,Configuration Management,我正在使用此任务向文件中添加一行: lineinfile: "dest={{ ansible_env.HOME }}/{{ deploy_dir }}/config/deploy/{{ stage_name }}.rb insertbefore='# role-based syntax' line='server "'{{ ip_addr }}'", user: "'{{ user_name }}'", roles: %w{'{{ role

我正在使用此任务向文件中添加一行:

lineinfile: "dest={{ ansible_env.HOME }}/{{ deploy_dir }}/config/deploy/{{ stage_name }}.rb
              insertbefore='# role-based syntax'
              line='server "'{{ ip_addr }}'", user: "'{{ user_name }}'", roles: %w{'{{ role }}'}'"
这增加了这一行:

server '172.16.8.11', user: 'vagrant', roles: %w{'api'}
但是我不想在
api
中引用这些引号。相反,我想要这个输出:

server '172.16.8.11', user: 'vagrant', roles: %w{api}

实际上,引号不是来自变量,而是在字符串中:

%w{'{{ role }}'}
现在的解决方案有点棘手。因为您不能简单地删除这样的引号:

%w{{{ role }}}
这将导致分析错误,因为
{{
启动表达式

解决方案是将外圆括号作为表达式本身写入字符串中

因此,要输出
{
,您需要编写
{{{{}}
,而不是
}
,您需要编写
{{{}}}
。这有意义吗?您正在指示模板引擎(Jinja2)输出括号以避免解析错误:

%w{{'{'}}{{ role }}{{'}'}}
但由于
role
已经是一个表达式,您也可以将其组合成一个表达式:

%w{{ '{'+role+'}' }}
然后,您的整个任务将如下所示:

- lineinfile:
    dest: "{{ ansible_env.HOME }}/{{ deploy_dir }}/config/deploy/{{ stage_name }}.rb"
    insertbefore: "# role-based syntax"
    line: "server '{{ ip_addr }}', user: '{{ user_name }}', roles: %w{{ '{'+role+'}' }}"
这也被转换成正确的YAML语法,因为这种引用的k=v格式确实很难阅读。:)