带有 $ 的 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 时要格外小心=] 以避免进一步插值)