다음 작업에서:
- 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""'