如何在Ansible host_vars文件中转义$符号

如何在Ansible host_vars文件中转义$符号,ansible,yaml,Ansible,Yaml,我有一个Ansible playbook(YAML),它部署了一个web应用程序,作为部署过程的一部分,它创建并初始化了各种数据库和某些表中的一些数据 剧本任务: - 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,

我有一个Ansible playbook(YAML),它部署了一个web应用程序,作为部署过程的一部分,它创建并初始化了各种数据库和某些表中的一些数据

剧本任务:

  - 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
meter_managers:
  - name: SAMPLE
    db_type: ""
    host: "http://www.example.com/axis2/services/Example/"
    port: -1
    catalog: ""
    username: csa1
    password: "Example$Example"
主机变量:

  - 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
meter_managers:
  - name: SAMPLE
    db_type: ""
    host: "http://www.example.com/axis2/services/Example/"
    port: -1
    catalog: ""
    username: csa1
    password: "Example$Example"
您可以忽略上面的大多数参数,但密码字段不起作用,因为它包含$符号

它作为示例出现,在$符号后被截断

我尝试将其转换为双$$,如下链接所示:

但是,这并不会产生正确的输出。结果是

Example15887Example
每次我运行剧本时,两者之间的数字是不同的。我不知道这个数字是从哪里来的。这似乎是某种滴答声,或类似的东西,但链接似乎表明,$$是逃避单个$的方法,所以我不明白为什么会出现这样的情况

我也试过使用和不使用标记,也试过使用或不使用标记,但没有效果

您知道如何正确地转义它,以便将值Example$Example插入到数据库表中吗

更新:

  - 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
meter_managers:
  - name: SAMPLE
    db_type: ""
    host: "http://www.example.com/axis2/services/Example/"
    port: -1
    catalog: ""
    username: csa1
    password: "Example$Example"

如果没有额外的解释,引用的问题将无法回答我的问题,但是Anthon在下面的评论中描述了简化,并在这个问题上提供了更好的帮助。

您将带有
$
的字符串输入bash。
在bash中,$是一个变量前缀。
$$
是一个具有当前PID编号的特殊变量,每次运行playbook时都会有所不同


在bash中使用双引号时,
$
应显示为
\$
。我看到您在YAML中也使用双引号,因此您也应尝试转义斜杠,因此请尝试使用
密码:“Example\\\$Example”
将带有
$
的字符串输入bash。
在bash中,$是一个变量前缀。
$$
是一个具有当前PID编号的特殊变量,每次运行playbook时都会有所不同


在bash中,当您使用双引号时,
$
应显示为
\$
。我看到您在YAML中也使用双引号,因此您也应该尝试转义斜杠,所以请尝试使用
密码:“Example\\\$Example”“

它看起来不像是YAML问题;您使用的是shell模块,您的美元符号似乎没有被充分转义。尝试在
主机变量的前面添加一个
\
,或者在shell行中添加一个更高级别的引用


至于数字,它们是shell进程的PID。请参阅。

它看起来不像YAML问题;您使用的是shell模块,您的美元符号似乎没有被充分转义。尝试在
主机变量的前面添加一个
\
,或者在shell行中添加一个更高级别的引用


至于数字,它们是shell进程的PID。看。

你有没有试着穿礼服逃跑是的。我也试过了。正如我在对您链接到的问题的评论中指出的,
$
在YAML中没有特殊意义。因为美元符号并不特别(对于YAML),所以添加单引号或双引号根本没有效果。当您使用ansible时,docker期望的
$
是不相关的。您是否尝试使用\??@tux转义是。我也试过了。正如我在对您链接到的问题的评论中指出的,
$
在YAML中没有特殊意义。因为美元符号并不特别(对于YAML),所以添加单引号或双引号根本没有效果。当您使用ansible时,docker期望的
$
是不相关的。如果您省略了双引号(此处不需要双引号,因此会混淆,而不是帮助),您甚至不必逃避反斜杠。@Anthon谢谢。这简化了我的主机。非常感谢。你在这里给出的解释比你所联系的另一个问题要好得多,也更简洁,如果没有进一步的解释,这个问题将无法纠正我的问题,但我感谢你提到它。其他人将来参考的最终解决方案是简单地将参数值设置为:Example\$Example(值周围没有引号)。如果您省略了双引号(此处不需要双引号,因此会混淆,而不是帮助),您甚至不必逃避反斜杠。@Anthon谢谢。这简化了我的主机。非常感谢。你在这里给出的解释比你所联系的另一个问题要好得多,也更简洁,如果没有进一步的解释,这个问题将无法纠正我的问题,但我感谢你提到它。其他人将来参考的最终解决方案是简单地将参数值设置为:Example\$Example(值周围没有引号)。