将.env文件中的环境变量传递给Ansible任务/剧本



关于如何优雅地处理这种情况,我非常感谢您的建议

  • 我有一个需要特定环境变量的应用程序。该应用程序的构建使我可以加载.env文件,并且该应用程序将从环境变量中读取登录用户/密码。

  • 我有一个可靠的战术手册,

    a( 签出一个数字回购

    b( 设置应用

  • 我需要用中的环境变量运行应用程序

(这些环境变量[作为.env文件]由地形工作流创建(

使用.env文件将环境变量传递到ansible.builtin.shell/命令等中,而不将其存储在磁盘上,这是一种优雅的方法

env文件采用密钥=值格式

例如

USER=Fish
PASSWORD=Net

我知道Ansible可以读取定义了变量的.yaml/.json文件,但我想避免使用另一种存储登录/密码参数的方式。

当我尝试从.env文件读取访问令牌时,这对我有效

  1. 以字符串形式获取内容文件
  2. 替换";TOKEN=";包含空字符串
  3. 在新行拆分字符串
  4. 获取返回数组中的第一个元素
# app/.env
TOKEN=<token>
USERNAME=<username>
# app/ansible/playbooks/get_token.yml
path: "../../.env"
token: "{{ lookup('file', path) | replace('TOKEN=','') | split('n') | first }}"

TASK [print token] ******************************************************
ok: [ip] => {
"msg": [
"the value of token is <token>"
]
}

这对我有效

- name: Get env vars
shell: cat .env
register: env
- name: Run command
shell: /usr/bin/env {{ env.stdout_lines | join(' ') }} bash -c 'echo $USER $PASSWORD'
register: echo
- name: debug
debug:
var: echo.stdout_lines
TASK [debug] **********************************************************
ok: [localhost] => {
"echo.stdout_lines": [
"Fish Net"
]
}

但我不得不说,这是一件很糟糕的事情。我本以为/usr/bin/env命令会以文件名作为参数(就像docker一样(,但没有。

最新更新