長すぎる。

長すぎる。

次のタスクでは:

- name: Create a data container
  docker_container:
    name: mydeploycontainer
    image: 1111112222.dkr.ecr.us-east-1.amazonaws.com/someteam/app-deploy:v.1
    env:
      name1: {{name1_var}}
      name2: {{name2_var}}
      name3: {{name3_var}}

env:一部は二重引用符付きの値のみを受け入れます。たとえば、次のようになります。

    env:
      name1: "value1"

ただし、これはプレイブックに渡された入力に基づく動的値です。

--extra-vars '{ "name1_var": "value_1", "name2_var": "value_2", "name3_var": "value_3" }'


環境セクションに変数を渡すには?

答え1

長すぎる。

すべてのjinja2テンプレート式引用しなければならないスクリプトから二重中括弧で始まるそうしないと、構文エラーが発生します(このエラーが発生するようです)。

エラーをクリアして環境を渡された追加変数に設定するには、以下のようにタスクを作成する必要があります。

- name: Create a data container
  docker_container:
    name: mydeploycontainer
    image: 1111112222.dkr.ecr.us-east-1.amazonaws.com/someteam/app-deploy:v.1
    env:
      name1: "{{ name1_var }}"
      name2: "{{ name2_var }}"
      name3: "{{ name3_var }}"

良い習慣として、二重中括弧で始まらなくてもjinja2テンプレート式が含まれている場合は、path: "/fix/path/{{ var_file_name }}"常に文字列を引用する必要があります(例:)。

詳細については、次を参照してください。Ansible yaml 構文トラップ

POC

以下は、期待どおりに機能することを示すためにAnsible 2.8.1で作成し使用した概念証明です。再生するには、デバッグに使用した値を使用してpip install jmespathいることを確認してください。json_query

スクリプトtest.yml:

---
- name: Test passing vars to docker from command line
  hosts: localhost
  gather_facts: false

  tasks:

    - name: Spin up a container
      docker_container:
        state: started
        image: busybox:latest
        command: sh -c "while true; do sleep 1000; done"
        name: test_for_so
        env:
          oneenv: "{{ oneenv_value }}"
          otherenv: "{{ otherenv_value }}"

    - name: Get env values from container
      command: >-
        docker exec test_for_so sh -c 'echo ${{ item }}'
      register: env_out
      loop:
        - oneenv
        - otherenv

    - name: Display collected values
      debug:
        msg: "{{ env_out.results | json_query('[].{env: item, value: stdout}') }}"

注文する:

ansible-playbook test.yml \
  -e '{"oneenv_value": "This is value 1", "otherenv_value": "This is value 2"}'

結果:

PLAY [Test passing vars to docker from command line] **********************************************************************************************************************************************************************

TASK [Spin up a container] ************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [Get env values from container] *************************************************************************************************************************************************************************************
changed: [localhost] => (item=oneenv)
changed: [localhost] => (item=otherenv)

TASK [Display collected values] *******************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "env": "oneenv",
            "value": "This is value 1"
        },
        {
            "env": "otherenv",
            "value": "This is value 2"
        }
    ]
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

カウンターPOC

envセクションでjinja2テンプレート文字列の周りの引用符を削除すると(例のように)、次のことが発生します。

ERROR! Syntax Error while loading YAML.
  found unacceptable key (unhashable type: 'AnsibleMapping')

The error appears to be in '/home/user/test.yml': line 15, column 20, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

        env:
          oneenv: {{ oneenv_value }}
                   ^ here
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 }}"

答え2

これはあなたが望むものを得ることができます(ansible 2.8

-e 'name1_var=""testa"" name2_var=""testb"" name1_var3=""testc""'

関連情報