从 Ansible 变量输出中删除引号

Pre*_*ura 2 automation yaml configuration-management jinja2 ansible

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

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 }}'}'"
Run Code Online (Sandbox Code Playgroud)

其中添加了这一行:

server '172.16.8.11', user: 'vagrant', roles: %w{'api'}
Run Code Online (Sandbox Code Playgroud)

但我不想要周围的引号api。相反,我想要这个输出:

server '172.16.8.11', user: 'vagrant', roles: %w{api}
Run Code Online (Sandbox Code Playgroud)

udo*_*dan 6

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

%w{'{{ role }}'}
Run Code Online (Sandbox Code Playgroud)

不过,现在的解决方案有点棘手。因为您不能简单地删除这样的引号:

%w{{{ role }}}
Run Code Online (Sandbox Code Playgroud)

这将导致解析错误,因为{{开始一个表达式...

解决方案是将应该在字符串中的外括号写成表达式本身。

所以要输出{你会写{{'{'}}而不是}你会写{{'}'}}. 那有意义吗?您正在指示模板引擎 (Jinja2) 输出括号以避免解析错误:

%w{{'{'}}{{ role }}{{'}'}}
Run Code Online (Sandbox Code Playgroud)

但既然role已经是一个表达式,你也可以将它组合成一个表达式:

%w{{ '{'+role+'}' }}
Run Code Online (Sandbox Code Playgroud)

您的整个任务将如下所示:

- 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+'}' }}"
Run Code Online (Sandbox Code Playgroud)

这也被转换为正确的 YAML 语法,因为这个引用的 k=v 格式真的很难阅读。:)