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

时间:2014-07-19 00:54:24

标签: regex ansible ansible-playbook

我想在安装期间从/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 }} \" "
                    ^

6 个答案:

答案 0 :(得分:21)

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

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

请参阅以下页面:
Link-1 Link-2 Link-3

答案 1 :(得分:15)

在任何情况下都可以使用的解决方案,无论您有多少嵌套引号,并且不强迫您在整个事物周围添加更多引号(根据您要编写的行,这可能会变得棘手)通过Jinja2表达式输出冒号,该表达式只是将冒号作为字符串返回:

{{ ":" }}

或者在你的完整专栏中:

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

Credit to this goes to github user drewp.

答案 2 :(得分:9)

将冒号分别保留在引号中 -

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这已经是一个字符串;你没有(并且不能,如此处所见)逃避它内部的冒号。

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

答案 5 :(得分:0)

我发现在所有情况下都能始终如一地工作的是一个变量。例如,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