Pre*_*zel 5 environment-variables path ansible
当我通过 ssh 进入远程服务器并运行时,env我返回以下路径:
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/myusername/bin
Run Code Online (Sandbox Code Playgroud)
相反,当我执行 ansible 命令时ansible -a "env",我得到以下路径:
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
可以想象,试图运行时,这会导致问题
sbin类似的命令service,ntpdate等等,因为它需要打字的完整路径sbin目录命令。(是的,我知道有 ansible 模块可以做到这一点,但我正在尝试解决 PATH 被缩短/截断的原因。)
有谁知道为什么会这样?
编辑:我问这个的原因是我正在按照书中的例子进行操作,Ansible for DevOps并且由于这个原因,一些例子不起作用。
我试图开始工作的例子来自本书的第 28 页:
$ ansible multi -s -a "service ntpd stop"
$ ansible multi -s -a "ntpdate -q 0.rhel.pool.ntp.org"
$ ansible multi -s -a "service ntpd start"
Run Code Online (Sandbox Code Playgroud)
这些命令总是会引发错误。但是如果我将它们更改为包含完整路径,它们就可以工作。
$ ansible multi -s -a "/sbin/service ntpd stop"
$ ansible multi -s -a "/usr/sbin/ntpdate -q 0.rhel.pool.ntp.org"
$ ansible multi -s -a "/sbin/service ntpd start"
Run Code Online (Sandbox Code Playgroud)
自然,我不想为我发出的每个临时命令输入完整路径。(我不知道每个命令的路径。)
有什么办法可以让我的 shell 中的正常路径包含在 ansible 中吗?是否有路径变量可以添加到清单文件或 ansible.cfg 文件中以实现此目的?
Tom*_*Tom 10
ansible -a正在使用命令模块,这不使用 shell 来执行命令。
http://docs.ansible.com/ansible/intro_adhoc.html
通常命令也采用 -m 表示模块名称,但默认模块名称是“command”。
路径的组件,例如/usr/sbin由获取/etc/profile文件的外壳程序添加到路径中,并且命令模块不会创建登录外壳程序,因此它不会读取该文件。
http://linux.die.net/man/1/bash
当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc 读取并执行命令/profile,如果该文件存在。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的命令中读取和执行命令。当 shell 启动时可以使用 --noprofile 选项来禁止这种行为。
ansible 文档说,如果你想要一个 shell,使用shell模块。然而,似乎没有一个选项可以从 shell 模块启动登录 shell(通过传递 --login 选项)。
其实在各个地方都提到ansible的策略是不信任环境,在定义任务的时候明确设置任何VARS。
但是,在 ad-hoc 模式下使用 ansible 时可以设置路径。这些是我可以做的最接近的复制您在交互式/bin/bashshell 中看到的 PATH 的方法;
$ ansible raspberrypi -m shell \
-a 'PATH=$PATH:/usr/local/sbin:/usr/sbin:$HOME/bin env' \
| grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/sbin:
/usr/sbin:/home/pi/bin
Run Code Online (Sandbox Code Playgroud)
或者,您可以获取/etc/profile文件;
$ ansible raspberrypi -m shell \
-a 'executable=/bin/bash source /etc/profile ; env | grep PATH'
PATH=/opt/consul/bin:/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
这似乎也有效;
$ ansible raspberrypi -a '/bin/bash -l -c "env"'
PATH=/opt/consul/bin:/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
小智 2
每当我使用 ansible 时,它都会以不同的用户身份运行......在不同的 shell 下。应该能够通过执行以下操作来查看用户:
ansible -a "id"
然后您可以看到定义在以下位置的用户 shell:
cat /etc/passwd
添加到路径的最佳实践是在以下位置添加一行:
/home/<username>/.profile 或 ~/.bash_profile
| 归档时间: |
|
| 查看次数: |
4841 次 |
| 最近记录: |