2017-07-25 16 views
0

WebアプリケーションをデプロイするAnsibleプレイブック(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 

ここでは、私のプレイブックを実行するたびに番号が異なります。その番号がどこから来ているのか分かりません。それはある種のダニなどのようですが、リンクは$$が単一の$をエスケープする方法であることを示唆しているようです。そのように出てくる理由はわかりません。

私もしてみましたともマークとしてみましたかなし "マークを囲むせずに、しかし無駄にしている。

任意のアイデア私が得ることができるように適切にこれをエスケープする方法として、私のデータベーステーブルに挿入するための準備ができて値例$例

UPDATE:?参照質問は、追加の[説明なしで私の質問に答えていないだろう

しかし、Anthonはこの簡略化をコメントに記述し、この質問でははるかに優れた助けとなりました。

+0

あなたは\でエスケープしようとしましたか? – tux

+0

@tuxはい。それも試しました。 – ManoDestra

+0

[可能な正規表現のエスケープドル文字](https://stackoverflow.com/questions/35717778/ansible-regex-escape-dollar-character) – Anthon

答えて

3

$の文字列をbashに送ります。
bashで$は可変接頭辞です。
$$は、現在のPID番号を持つ特別な変数です。これは、プレイブックを実行するたびに異なります。

二重引用符を使用している場合は、$\$と表示されます。私はYAMLでも二重引用符を使用することを知っているので、スラッシュもエスケープしようとするべきですので、password: "Example\\$Example"で試してみてください。

+0

美しく働いた。ありがとうございました! – ManoDestra

+0

二重引用符を省略した場合(ここでは不要なため、ヘルプの代わりに難読化する)、バックスラッシュをエスケープする必要はありません。 – Anthon

+0

@Anthonありがとう。これは私のhost_varsを単純化します。とても有難い。ここで説明した内容は、あなたがリンクしている他の質問よりはるかに良く、簡潔ですが、それ以上の説明なしに私の問題を修正することはできませんでしたが、参考にしていただきありがとうございます。将来の他の参照のための最終的な解決策は、単にパラメータ値をExample \ $ Example(値を引用符で囲まず)にすることでした。 – ManoDestra

1

YAMLの問題のようには見えません。シェルモジュールを使用していて、ドル記号が十分にエスケープされていないようです。 host_varsの前に\を追加するか、シェル行にもう一度引用符を追加してみてください。

数字については、シェルプロセスのPIDです。 thisを参照してください。

関連する問題