Каждый раз, когда мне нужно использовать несколько версий Python в любой системе, в которой я использую Pyenv, вы можете использовать его для каждой роли пользователя или просто использовать его глобально.
Из их ридми:
pyenv позволяет легко переключаться между несколькими версиями Python. Это просто, ненавязчиво и следует традициям UNIX в отношении одноцелевых -инструментов, которые хорошо справляются с одной задачей.
Это может сделать то, что вы хотите(ansible 2.8
)
-e 'name1_var=""testa"" name2_var=""testb"" name1_var3=""testc""'
Все выражения шаблона jinja2 должны быть заключены в кавычки в вашем плейбуке, когда они начинаются с двойных фигурных скобок иначе вы получите синтаксическую ошибку (Что вы и получите, я думаю)
Вы должны написать свою задачу, как показано ниже, чтобы устранить ошибку и установить ваши envs на ваши переданные дополнительные vars:
- 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 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
Если вы удалите кавычки вокруг строк шаблонов jinja2 в разделе env (, как в вашем примере ), вот что произойдет:
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 }}"