ansible 运行持续进程及配置环境变量
配置环境变量
ansible 是通过 ssh 登陆的,同时也是 Non-Login 的方式登陆,这种登陆情况下,部分环境参数是拿不到的。Login 和 Non-Login 的区别可以参考 Difference between Login shell and Non login shell。
那么如果一行 shell 运行的指令需要用到环境参数该怎么处理?
根据 Non-Login shell 调用顺序,~/.bashrc 是会被调用的,所以可以想办法把参数文件写在 ~/.bashrc 中,这样就可以运行 shell。
另一种思路是,不想破坏系统的 ~/.bashrc 文件,或者环境变量本身也是经常变的,那么就自制一个文件,通过 source 启用,设想很好,但是实际操作不行,我这边的环境(ubuntu 18.04 server)提示 source:command not found。有些解释是,ansible 的 shell 不是 bash,没有 bash 的特性。
但 source 的方法不行,还有另一个方法,启用 environment。
---
- hosts: all
remote_user: test
gather_facts: True
tasks:
# 在需要环境的任务下,一一指定变量,在执行过程中会导入这些变量
- name: some command need environment
shell:
cmd: xxx yyy zzz
chdir: /your/path
environment:
ARGS1: 1
ARGS: 2
后台持续运行
后台持续运行的方法很多,正规点的利用 supervisord,systemd 配置一个服务,让服务在后台运行,但这需要配置文件,有没有更好的处理方法,nohup 能否在 ansible 中使用,答案是:可以。
唯一需要注意的是,nohup 指令需要完整,也就是对标准错误输出需要重定向到标准输出,最后再加个 &
实现后台运行。
---
- hosts: all
remote_user: test
gather_facts: True
tasks:
# 在需要环境的任务下,一一指定变量,在执行过程中会导入这些变量
- name: some command need environment
shell:
cmd: nohup commanda > x.out 2<&1 &
chdir: /your/path
参考
- ansible - 在后台,ansible运行远程主机上的命令
- github issue:copy module fails with “source not found” when HOME variable not set
- 不可能用Ansible获取.bashrc
- linux后台执行命令:&和nohup
- Difference between Login shell and Non login shell
- difference-between-login-shell-and-non-login-shell
- 关于ansible远程执行的环境变量问题(login shell & nonlogin shelll)