次のタスクでは:
- 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""'