我有一个Ansible playbook(YAML),它部署了一个Web应用程序,并且作为部署过程的一部分,它创建并初始化了某些表中的各种数据库和一些数据。
Playbook任务:
- 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
每次运行我的剧本时,两者之间的数字都不同。我不知道这个数字来自哪里。它似乎是某种嘀嗒,或类似的东西,但链接似乎表明$$是逃避单一$的方式,所以我不明白为什么这样的出现就像那样
我也尝试过使用和不使用" 标记,并尝试使用或不使用' 标记,但无效。
有关如何正确转义这个以便我可以获取值示例$示例准备好插入我的数据库表的任何想法吗?
更新
如果没有额外的解释,引用的问题就不会回答我的问题,但是Anthon在评论中描述了下面的简化,并在这个问题上提供了更好的帮助。
答案 0 :(得分:4)
您将带有$
的字符串输入bash
在bash $
中是一个变量前缀
$$
是一个带有当前PID编号的特殊变量,每次运行playbook时都会有所不同。
在bash中使用双引号$
时,应显示为\$
。我也看到你在YAML中使用双引号,所以你也应该尝试逃避斜杠,所以试试password: "Example\\$Example"
。
答案 1 :(得分:1)
它看起来不像YAML问题;你正在使用shell模块,似乎你的美元符号没有被充分转义。尝试在\
前面添加host_vars
或在shell行中再添加一个引用级别。
至于数字,它们是shell进程的PID。请参阅this。