我想使用ansible
来部署一个配置,作为最后一步,(重新)启动一个服务。该服务需要在我的主机(存储剧本的主机)中定义的环境变量。为了将这些env var传递给我的目标机器,我尝试通过执行以下操作向ansible service
指令添加environment
参数:
- 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
这是继续下去的正确方式吗?
注:作为ansible的新手,我没有玩过role
的东西,现在我想远离它。
系统配置文件:
[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}"
发布于 2019-06-04 03:15:06
在systemd服务单元中,您可以使用EnvironmentFile
指令以比使用Environment
更方便的方式传递环境变量。如果需要,它还允许在服务之间共享变量。
您可以使用ansible通过简单的copy
或template
安装包含环境变量的文件,例如在/etc/<service>/environment
中。
这样您就不需要在每次部署时都设置这些变量。仅在您第一次设置服务以及需要更改这些设置时使用一次。
另外,据我所知,使用import-environment
意味着systemd会将您导入的变量传递给所有单元,这可能不是您想要的。尤其是对于CLIENT_SECRET
one。
https://stackoverflow.com/questions/56429231
复制相似问题