关于如何优雅地处理这种情况,我非常感谢您的建议
-
我有一个需要特定环境变量的应用程序。该应用程序的构建使我可以加载.env文件,并且该应用程序将从环境变量中读取登录用户/密码。
-
我有一个可靠的战术手册,
a( 签出一个数字回购
b( 设置应用
-
我需要用中的环境变量运行应用程序
(这些环境变量[作为.env文件]由地形工作流创建(
使用.env文件将环境变量传递到ansible.builtin.shell/命令等中,而不将其存储在磁盘上,这是一种优雅的方法
env文件采用密钥=值格式
例如
USER=Fish
PASSWORD=Net
我知道Ansible可以读取定义了变量的.yaml/.json文件,但我想避免使用另一种存储登录/密码参数的方式。
当我尝试从.env文件读取访问令牌时,这对我有效
- 以字符串形式获取内容文件
- 替换";TOKEN=";包含空字符串
- 在新行拆分字符串
- 获取返回数组中的第一个元素
# 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一样(,但没有。