在 RHEL7 上使用 Ansible 将项目永久添加到 $PATH

在 RHEL7 上使用 Ansible 将项目永久添加到 $PATH

为了让 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 虚拟机,因此我无法测试此解决方案是否也适用。

相关内容