如何使用 Ansible 模块 lineinfile 编辑 /etc/environment 文件,自动化配置 Linux 系统级环境变量。
背景
在 Linux 上,有两种主要方式可以配置系统级环境变量:
/etc/environment这是一个系统级配置文件,适用于所有用户。它由 root 用户所有,因此需要管理员权限或 sudo 权限才能修改。该文件存储系统级的区域设置和路径配置。/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