我想使用ansible
部署一个配置,作为最后一步,(重新)启动服务。该服务需要在我的主机(存储剧本的主机)中定义的环境变量。为了将这些env var传递到目标计算机,我尝试通过执行以下操作将environment
参数添加到ansible service
指令中:
- name: start service
service:
name: my_service
state: restarted
environment:
OAUTH2_AUTHORIZE_URL: "{{ lookup('env','OAUTH2_AUTHORIZE_URL') }}"
OAUTH2_TOKEN_URL: "{{ lookup('env','OAUTH2_TOKEN_URL') }}"
CLIENT_SECRET: "{{ lookup('env','CLIENT_SECRET') }}"
但是,这在启动服务时这些变量未知的意义上失败了。我能找到解决该问题的唯一方法是通过执行以下操作来修改我的剧本:
- name: set some env vars systemctl
shell: |
systemctl import-environment OAUTH2_AUTHORIZE_URL OAUTH2_TOKEN_URL CLIENT_SECRET
args:
executable: /bin/bash
environment:
OAUTH2_AUTHORIZE_URL: "{{ lookup('env','OAUTH2_AUTHORIZE_URL') }}"
OAUTH2_TOKEN_URL: "{{ lookup('env','OAUTH2_TOKEN_URL') }}"
CLIENT_SECRET: "{{ lookup('env','CLIENT_SECRET') }}"
- name: start my service
service:
name: my_service
state: restarted
这是正确进行方式吗?
NB:我对ansible感到很陌生,现在还没有玩role
我想远离的东西。
Systemctl配置文件:
[Unit]
Description=my_service
After=syslog.target network.target
[Service]
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/bin/bash /root/start_myservice.sh
[Install]
WantedBy=multi-user.target
要运行的服务:
#/bin/bash
echo "${CLIENT_SECRET}"
echo "${OAUTH2_AUTHORIZE_URL}"
echo "${OAUTH2_TOKEN_URL}"
答案 0 :(得分:1)
在systemd服务单元中,可以使用EnvironmentFile
指令以比Environment
更为方便的方式传递环境变量。如果需要,它还允许跨服务共享变量。
您可以使用ansible通过简单的copy
或使用template
安装包含环境变量的文件,例如在/etc/<service>/environment
中。
这样,您无需在每次部署时都设置这些变量。首次设置服务以及需要更改这些设置时仅一次。
另外,据我了解,使用import-environment
意味着systemd会将导入的变量传递给所有单元,而这可能不是您想要的。特别是对于CLIENT_SECRET
的人。