为了让 Ansible 成功添加
/home/another-user/bin
到 RHEL 7 VM 上的 $PATH 变量,必须更改以下哪些特定语法?
剧本的当前版本:
我们使用的剧本设置了一个变量/home/another-user/bin
,然后使用该变量添加一行,/etc/environment
如下所示:
vars:
extra_path: /home/another-user/bin
vars_files:
- myVars.yaml
#Other stuff
- name: Update /etc/environment for newly loaded apps
lineinfile:
dest: /etc/environment
line: "export PATH={{ extra_path }}:$PATH"
owner: root
become: true
become_user: root
vars:
ansible_become_password: "{{ root_pass_word }}"
糟糕的结果
问题是上面的示例破坏了 $PATH 中的所有现有条目,因此cat
不再识别诸如 和其他命令之类的基本命令:
[my-user@ip-10-0-0-171 ~]$ echo $PATH
/home/another-user/bin:$PATH:/usr/local/sbin:/usr/sbin:/home/my-user/.local/bin:/home/my-user/bin
[my-user@ip-10-0-0-171 ~]$ cat /etc/environment
-bash: cat: command not found
[my-user@ip-10-0-0-171 ~]$
我确实在此处和 Stack Overflow 上找到了使用正则表达式的其他示例,但这些示例通过以一种或另一种方式command not found
修改会导致相同的问题。/etc/environment
答案1
该/etc/environment
文件不会被评估为 shell 脚本。引用其手册页(为清晰起见重新排列):
配置文件包含“KEY=VALUE”环境变量分配的列表,以换行符分隔。
这些分配的右侧可能会使用“${OTHER_KEY}”和“$OTHER_KEY”格式引用先前定义的环境变量。
...
不支持 shell 语法的其他元素。
因此,插入的行中有一个export
命令,该命令对该文件无效/etc/environment
。更改自:
line: "export PATH={{ extra_path }}:$PATH"
到
line: "PATH={{ extra_path }}:$PATH"
它应该可以正常工作。
这里要检查的其他内容是您要添加的新路径,它似乎是/home/another-user/bin
.用户的主目录通常受到 700 权限的保护,因此内容仅对所有者(即与该主目录对应的用户)可见。/etc/environment
适用于所有用户,但是新的路径配置是否与所有用户相关?需要考虑调查的事情。
答案2
我发现接受的答案在 Centos7 上不起作用。通常我发现 RHEL7 和 Centos7 在这个级别上具有相同的功能。
/etc/environment
是空的,并且行为与此中描述的完全一样Ubuntu文档(是的,我仔细检查过,VM 肯定是 Centos7)。它没有扩展$PATH
变量,导致路径中断,因为它不喜欢$
其中的文字。
我从该文档中找到了推荐的解决方案,添加脚本确实可以/etc/profile.d/
按预期工作,即
echo 'export PATH=$PATH:/some/other/path' > /etc/profile.d/my_path.sh
或使用ansible复制模块
- name: Add to PATH
copy:
content: "export PATH=$PATH:/some/other/path"
dest: "/etc/profile.d/my_path.sh"
由于我没有任何 RHEL7 虚拟机,因此我无法测试此解决方案是否也适用。