带有 $ 的 Ansible 查找环境并注入 jj2 模板不起作用
Ansible lookup env with $ and inject into jj2 template not working
我们在这个项目中使用 Ansible playbook 和 GitLab CI,我们将通过 Ansible playbook 从 ENV_FILE 传递一些变量,然后用它们渲染 JJ2 模板。
现在,当某些变量的值中包含 $
时会出现问题,这在某些时候似乎被解释为 shell 变量,并且最终值呈现不正确。
例如,在ENV_FILE
(通过 GitLab CI 设置 > CI/CD > 变量菜单设置):
export FIRST_VAR=...
export SOME_VAR='123$abc@xyz'
export SOME_OTHER_VAR=...
而docker-compose.yaml中的最终结果变为123@xyz
编辑:我们刚刚尝试更改为export SOME_VAR='123''$''abc@xyz'
,最终结果变为123abc@xyz
,仍然缺少$
。
gitlab-ci.yaml
deploy:
stage: deploy
environment:
name: dev
script:
- source $ENV_FILE
- cd ansible && ansible-playbook -i inventory/dev.ini runapp.yaml --vault-password-file=${ANSIBLE_VAULT_FILE}
runapp.yaml
- hosts: app
become: yes
roles:
- { role: some_app }
vars:
SOME_VAR: "{{ lookup('env', 'SOME_VAR') }}"
任务文件:
- name: "Templating docker-compose file"
become: yes
template:
src: app-docker-compose.yaml.j2
dest: /opt/someapp/docker-compose.yaml
app-docker-compose.yaml.j2
someapp-svc:
image: someapp:version
restart: always
ports:
- ####:####
environment:
SOME_VAR: {{ SOME_VAR }}
有什么提示吗?
谢谢!
我可以在设置包含 $
的 CI/CD 变量时重现该行为; the docs kind of hint at it,尽管文档写得好像问题只适用于在 .gitlab-ci.yml
中设置变量时,这显然是错误的
如果你想让一个CI/CD变量包含一个文字$
,它需要加倍,所以SOME_VAR
需要写成123$$abc@xyz
CI/CD 配置页,以便它在管道 中具体化为 123$abc@xyz
(尽管正如评论正确指出的那样,在使用 [=16 时要格外小心=] 以避免进一步插值)
我们在这个项目中使用 Ansible playbook 和 GitLab CI,我们将通过 Ansible playbook 从 ENV_FILE 传递一些变量,然后用它们渲染 JJ2 模板。
现在,当某些变量的值中包含 $
时会出现问题,这在某些时候似乎被解释为 shell 变量,并且最终值呈现不正确。
例如,在ENV_FILE (通过 GitLab CI 设置 > CI/CD > 变量菜单设置):
export FIRST_VAR=...
export SOME_VAR='123$abc@xyz'
export SOME_OTHER_VAR=...
而docker-compose.yaml中的最终结果变为123@xyz
编辑:我们刚刚尝试更改为export SOME_VAR='123''$''abc@xyz'
,最终结果变为123abc@xyz
,仍然缺少$
。
gitlab-ci.yaml
deploy:
stage: deploy
environment:
name: dev
script:
- source $ENV_FILE
- cd ansible && ansible-playbook -i inventory/dev.ini runapp.yaml --vault-password-file=${ANSIBLE_VAULT_FILE}
runapp.yaml
- hosts: app
become: yes
roles:
- { role: some_app }
vars:
SOME_VAR: "{{ lookup('env', 'SOME_VAR') }}"
任务文件:
- name: "Templating docker-compose file"
become: yes
template:
src: app-docker-compose.yaml.j2
dest: /opt/someapp/docker-compose.yaml
app-docker-compose.yaml.j2
someapp-svc:
image: someapp:version
restart: always
ports:
- ####:####
environment:
SOME_VAR: {{ SOME_VAR }}
有什么提示吗? 谢谢!
我可以在设置包含 $
的 CI/CD 变量时重现该行为; the docs kind of hint at it,尽管文档写得好像问题只适用于在 .gitlab-ci.yml
中设置变量时,这显然是错误的
如果你想让一个CI/CD变量包含一个文字$
,它需要加倍,所以SOME_VAR
需要写成123$$abc@xyz
CI/CD 配置页,以便它在管道 中具体化为 123$abc@xyz
(尽管正如评论正确指出的那样,在使用 [=16 时要格外小心=] 以避免进一步插值)