4

私は非常に単純なことをすることができません。

私のタスクでは、2 つのデフォルト変数をリテラル文字列で連結してパスを作成しようとしています

- name: "Uploading File"
  copy:
    src: "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
    dest: /opt/temp/filename.iso

これは私にエラーを与えます。変数とリテラル文字列を連結する方法はありますか?

4

1 に答える 1

12

まず、YAML

  1. 構文は YAML に準拠する必要があります。

    通常、文字列 (スカラー) は引用符で囲まれませんが、二重引用符 (") または単一引用符 (') で囲むことができます。

    したがって、次のいずれかを書くことができます:

    parameter: value
    

    また

    parameter: 'value'
    

    また

    parameter: "value"
    

    以下は有効な YAML ではありません。

    "{{ installer_iso_src_location }}"/"{{ installer_version }}"/filename.iso
    
  2. value中かっこで始まる場合、{Ansible はそれを辞書として解析しようとします (YAML は JSON のスーパーセットであるため、中かっこで囲まれた辞書/連想配列は有効な構文です)。

    連想配列は、key: value の形式でコロン スペース (: ) を使用して表されます。1 行に 1 つ、または中括弧 ({ }) で囲み、コンマ スペース (, ) で区切ります。

    有効な JSON 配列でない場合、Ansible は構文エラーを報告します。

次に、Jinja2 :

  • Ansible のパラメーター (when重要な例外であるという値) の大部分は、Jinja2 テンプレート (文字列) です。

    Ansible-variable-value を参照するには、and で区切られたJinja2 式を使用します(引用符は含まれません)。{{}}

    {{ variable }}
    

    ケースの変数値と文字列を連結する方法は 2 つあります。

    {{ installer_iso_src_location }}/{{ installer_version }}/filename.iso
    

    また

    {{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}
    

YAML と Jinja2 を組み合わせると、次のようになります。

  • パラメーター (文字列) が{文字で始まり、有効な YAML/JSON 辞書ではないため、YAML パーサーは失敗します (上記の YAML 要件のポイント2.を参照してください)。

    その結果、値が YAML パーサーによって文字列と見なされるようにするには、値 (Jinja2 テンプレート) を引用符で囲む必要があります。

    src: "{{ installer_iso_src_location }}/{{ installer_version }}/filename.iso"
    

    また

    src: "{{ installer_iso_src_location + '/' + installer_version + '/filename.iso' }}"
    

    または一重引用符と二重引用符の他の組み合わせ。

  • パラメータ値が 以外の文字列で始まる場合は、上記のポイント1.{の最初の例のように、引用符なしで使用できます。


最後に、値が YAML 規則に従うことが期待されない 2 つの注目すべき例外があります。

  • キーと値のペアが結合されたモジュールの Ansible 短縮構文=
  • commandまたはshellモジュールなどの自由形式のパラメーター
于 2017-06-25T02:31:54.770 に答える