繁体   English   中英

如何在 Ansible YAML 文件中的字符串中转义冒号?

[英]How can escape colon in a string within an Ansible YAML file?

我想在安装过程中更改文件 /var/www/kibana/config.js 中的一行代码

elasticsearch: "http://"+window.location.hostname+":9200"

elasticsearch: "http://192.168.1.200:9200"

在这里,我尝试使用 lineinfile 来做到这一点,如下所示

- name: Comment out elasticsearch the config.js to ElasticSearch server
  lineinfile:
    dest=/var/www/kibana/config.js
    backrefs=true
    regexp="(elasticsearch.* \"http.*)$"
    line="elasticsearch\: \" {{ elasticsearch_URL }}:{{ elasticsearch_port }} \" "
    state=present

我已将{{elasticsearch_URL}}{{elasticsearch_port}}变量分别设置为http://192.168.1.2009200

这是我遇到的错误消息:

ERROR: Syntax Error while loading YAML script, /Users/shuoy/devops_workspace/ansible_work/logging-for-openstack/roles/kibana/tasks/Debian.yml
Note: The error may actually appear before this position: line 29, column 25

regexp="(elasticsearch.* \"http.*)$"
line="elasticsearch\: \" {{ elasticsearch_URL }}:{{ elasticsearch_port }} \" "
                    ^

无论您有多少嵌套引号,在任何情况下都有效的解决方案是输出冒号通过 Jinja2 表达式,它简单地将冒号作为字符串返回:

{{ ":" }}

或者在您的完整行中:

line="elasticsearch\: \" {{ elasticsearch_URL }}{{ ":" }}{{ elasticsearch_port }} \" "

这要归功于 github 用户 drawp。

您需要将整行括在" ,其中:出现。

lineinfile:
'dest=/var/www/kibana/config.js
backrefs=true
regexp="(elasticsearch.* \"http.*)$"
line="elasticsearch\: \ {{ elasticsearch_URL }}:{{ elasticsearch_port }} \ "
state=present'  

请参阅这些页面:
链接 1链接 2 链接 3

只需将冒号单独放在引号中 -

regexp="(elasticsearch.* \\"http.*)$" line="elasticsearch':' \\" {{ elasticsearch_URL }}:{{ elasticsearch_port }} \\" "

foo=bar是更适合单行指令的格式,但由于您的参数已经跨越了多行,只需将=更改为: ,就不会在字符串中包含冒号而大惊小怪。

- name: Comment out elasticsearch the config.js to ElasticSearch server
  lineinfile:
    dest:     /var/www/kibana/config.js
    backrefs: true
    regexp:   'elasticsearch.* "http.*$'
    line:     'elasticsearch: "{{ elasticsearch_URL }}:{{ elasticsearch_port }}"'
    state:    present

它已经是一个字符串; 你不必(也不能,如这里所见)在其中转义冒号。

line="elasticsearch: \" {{ elasticsearch_URL }}:{{ elasticsearch_port }} \" "

我发现在所有情况下都能始终如一地工作的是一个变量。 例如, vars/main.yml

fw_zone_str: 'Error: NAME_CONFLICT: new_zone():'

tasks/foo.yml

failed_when: fw_zone_str not in fw_new_zone.stderr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM