如何使用 Ansible 模块 lineinfile 编辑 /etc/environment 文件,自动化配置 Linux 系统级环境变量。

背景

在 Linux 上,有两种主要方式可以配置系统级环境变量:

  1. /etc/environment 这是一个系统级配置文件,适用于所有用户。它由 root 用户所有,因此需要管理员权限或 sudo 权限才能修改。该文件存储系统级的区域设置和路径配置。
  2. /etc/profile 和 /etc/profile.d/\*.sh 这些是全局初始化脚本。当通过终端、SSH 或图形界面登录时,这些脚本会在用户特定脚本之前执行。/etc/profile 会在退出前执行 /etc/profile.d/ 目录中的所有 *.sh 脚本。

每个用户还可以通过 ~/.profile 自定义个人 shell 初始化脚本,而不会影响其他用户。

示例:使用 Ansible Playbook 在远程 Linux 上永久设置系统级环境变量

代码文件: set-environment.yml

---
- name: set environment demo
  hosts: all
  gather_facts: false
  become: true
  vars:
    os_environment:
      - key: EDITOR
        value: vi
      - key: MY_ENV_VARIABLE
        value: ansiblepilot
  tasks:
    - name: customize /etc/environment
      ansible.builtin.lineinfile:
        dest: "/etc/environment"
        state: present
        regexp: "^{{ item.key }}="
        line: "{{ item.key }}={{ item.value }}"
      with_items: "{{ os_environment }}"

执行命令:

ansible-pilot $ ansible-playbook -i virtualmachines/demo/inventory ansible\ statements/set-environment.yml

执行结果:

PLAY [set environment demo] ******************************************

TASK [customize /etc/environment] ***********************************
changed: [demo.example.com] => (item={'key': 'EDITOR', 'value': 'vi'})
changed: [demo.example.com] => (item={'key': 'MY_ENV_VARIABLE', 'value': 'ansiblepilot'})

PLAY RECAP ******************************************************
demo.example.com           : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

幂等性验证

多次运行 Playbook 时,结果保持一致,不会对远程主机产生额外更改:

ansible-pilot $ ansible-playbook -i virtualmachines/demo/inventory ansible\ statements/set-environment.yml

执行结果与第一次相同,表明该操作是幂等的。

执行前的状态

ansible-pilot $ ssh devops@demo.example.com
Last login: Tue Feb 22 18:45:12 2022 from 192.168.131.111
[devops@demo ~]$ sudo su
[root@demo devops]# printenv | grep EDITOR
[root@demo devops]# printenv | grep MY_ENV_VARIABLE
[root@demo devops]# cat /etc/environment 

执行后的状态

ansible-pilot $ ssh devops@demo.example.com
Last login: Tue Feb 22 18:48:46 2022 from 192.168.131.111
[devops@demo ~]$ sudo su
[root@demo devops]# printenv | grep EDITOR
EDITOR=vi
[root@demo devops]# printenv | grep MY_ENV_VARIABLE
MY_ENV_VARIABLE=ansiblepilot
[root@demo devops]# cat /etc/environment 
EDITOR=vi
MY_ENV_VARIABLE=ansiblepilot