【发布时间】:2017-12-31 22:35:18
【问题描述】:
我有一个部署 Web 应用程序的 Ansible playbook (YAML),作为部署过程的一部分,它创建并初始化各种数据库和某些表中的一些数据。
剧本任务:
- name: insert Meter Managers to mdm_connection
shell : "psql -d {{ mdm_config_db }} -c \"insert into mdm_connection (mdm_connection_type_id, name, db_type, host, port, catalog, username, password) values (3, '{{ item.name }}', '{{ item.db_type }}', '{{ item.host }}', {{ item.port }}, '{{ item.catalog }}', '{{ item.username }}', '{{ item.password }}');\""
with_items: "{{ meter_managers }}"
when: item != ""
sudo_user: postgres
tags:
- initDB
host_vars:
meter_managers:
- name: SAMPLE
db_type: ""
host: "http://www.example.com/axis2/services/Example/"
port: -1
catalog: ""
username: csa1
password: "Example$Example"
您可以忽略上面的大部分参数,但不起作用的部分是密码字段,因为它包含一个 $ 符号。
它以示例的形式出现,在 $ 符号后被截断。
我已尝试将其转义为双 $$,根据此链接:How can I escape a $ dollar sign in a docker compose file?
但是,这不会导致正确的输出。结果是
Example15887Example
每次运行我的剧本时,两者之间的数字都不同。我不知道这个数字是从哪里来的。这似乎是某种滴答声,或类似的东西,但链接似乎表明 $$ 是逃避单个 $ 的方式,所以我不明白为什么会这样。
我也试过带和不带 " 标记,也试过带或不带 ' 标记,但无济于事。
关于如何正确转义这个以便我可以将值 Example$Example 准备好插入到我的数据库表中的任何想法?
更新:
如果没有额外的解释,所引用的问题将无法回答我的问题,但是 Anthon 在 cmets 中描述了以下简化,并在此问题中提供了更好的帮助。
【问题讨论】:
-
你试过用\转义吗??
-
@tux 是的。也试过了。
-
正如我在对您链接到的问题的评论中指出的那样,
$在 YAML 中没有特殊含义。由于该美元符号不是特殊的(对于 YAML),因此添加单引号或双引号根本没有效果。当您使用 ansible 时,docker 期望$$无关紧要。