web-dev-qa-db-ja.com

Ansible Playbookで複数の変数と文字列を連結する

宛先セクションにwith_itemsを実行するときに複数の連結を試みています。

現在、次のようになっています。

- name: create app except+lookup
  copy: content="" dest="{{ dir.comp ~ '/config/con2dd/' ~ item.name ~ 'File.txt' }}" force=no group=devops owner=devops mode: 0755
  with_items:
...

私は得る:

We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they 
start a value. For instance:            

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

いくつかのアプローチを試してみましたが、機能するものはありませんでした。

変数を文字列と連結することは可能ですか?

13
Moshe

パラメーターに純粋なYAML構文とkey = value構文を混在させないでください。そして、複雑な引数には常にYAML構文を使用します。

- name: create app except+lookup
  copy:
    content: ""
    dest: "{{ dir.comp }}/config/con2dd/{{ item.name }}File.txt"
    force: no
    group: devops
    owner: devops
    mode: 0755
  with_items:
  ...
12

キーcopyに関連付けられた値を引用していません。そのためには、first文字を二重引用符(または単一引用符)にする必要があります。フィードバックで与えられた例は、これを正しく行いますが、それについて明示的ではありません。スカラーが非引用符で始まる(スカラーで発生するcクォートからのcontentで始まるものは、もはや特別な意味を持ちません。

Ansibleが使用するパーサーのバグのため、:(コロンスペース)そのスカラー(mode: 0755)は問題を引き起こします。スカラー全体を二重引用符で囲み、その中にある二重引用符をエスケープする必要があります。

copy: "content=\"\" dest=\"{{ dir.comp ~ '/config/con2dd/' ~ item.name ~ 'File.txt' }}\" force=no group=devops owner=devops mode: 0755"

または、単一引用符を使用します(エスケープ規則は異なります:

copy: 'content="" dest="{{ dir.comp ~ ''/config/con2dd/'' ~ item.name ~ ''File.txt'' }}" force=no group=devops owner=devops mode: 0755'

this オンラインYAMLパーサーで自分でスカラーをテストできます。これには、AnsibleがYAMLを正しく解析しない原因と同じバグがあります。

これ パーサー、スカラー:が正しく、入力にエラーは発生しません(ただし、他の問題があります)。

2
Anthon