這裡有個小知識點
在 Linux 系統中,使用者環境變數檔案是用來設定使用者級別的環境變數和 shell 配置的檔案。這些檔案可以控制使用者的環境,包括路徑、命令別名、shell 提示符、自定義函式等。不同的檔案在不同的情況下會被載入,並對使用者的 shell 會話產生影響。
常見的使用者環境變數檔案及其作用
-
/etc/profile
- 作用: 這是系統範圍內的環境變數配置檔案,對所有使用者生效。當使用者登入時(透過互動式的登入 shell,如透過 SSH 登入),系統會首先執行
/etc/profile
中的配置。 - 載入時機: 每次使用者登入時,系統會自動載入
/etc/profile
。
- 作用: 這是系統範圍內的環境變數配置檔案,對所有使用者生效。當使用者登入時(透過互動式的登入 shell,如透過 SSH 登入),系統會首先執行
-
~/.profile
- 作用: 這是每個使用者的個人環境變數檔案,用於設定使用者級別的環境變數。當使用者登入時,系統會執行這個檔案。可以用來定義使用者專屬的路徑、變數等。
- 載入時機: 每次使用者登入時,系統會自動載入
~/.profile
。對於一些 shell,如bash
,如果沒有找到~/.bash_profile
或~/.bash_login
,它會執行~/.profile
。
-
~/.bash_profile
- 作用: 這是專門為
bash
shell 準備的登入指令碼檔案。在使用者透過互動式登入 shell(如 SSH 登入)時,bash
shell 會讀取並執行該檔案。它通常用於設定環境變數和啟動應用程式。 - 載入時機: 每次使用者登入時,
bash
會優先載入~/.bash_profile
,除非指定不載入。~/.bash_profile
通常會包含對~/.bashrc
的載入命令。
- 作用: 這是專門為
-
~/.bashrc
- 作用: 這是專門為
bash
shell 準備的非登入互動式 shell 初始化檔案。它主要用於設定命令別名、函式、shell 提示符、環境變數等配置。在啟動一個新的終端或執行一個新的bash
shell 時,會載入這個檔案。 - 載入時機: 每次啟動非登入的互動式 shell(如開啟一個新的終端視窗)時,
bash
會載入~/.bashrc
。
- 作用: 這是專門為
-
/etc/bash.bashrc
- 作用: 這是系統範圍內的
bash
初始化檔案,對所有使用者生效。用於在所有使用者的非登入互動式 shell 中設定環境變數和其他配置。 - 載入時機: 每次啟動非登入的互動式 shell 時(如開啟終端視窗),系統會載入
/etc/bash.bashrc
。
- 作用: 這是系統範圍內的
-
~/.bash_logout
- 作用: 這是
bash
shell 在使用者登出時執行的檔案。可以用來清理臨時檔案、記錄日誌等。 - 載入時機: 每次使用者從登入 shell 登出時,
bash
會執行~/.bash_logout
。
- 作用: 這是
載入順序和優先順序
-
登入 shell(如 SSH 登入)時,系統會按照以下順序載入:
/etc/profile
~/.bash_profile
或~/.bash_login
或~/.profile
~/.bashrc
(通常是透過~/.bash_profile
或其他檔案手動載入的)
-
非登入互動式 shell(如開啟新的終端)時,系統會載入:
/etc/bash.bashrc
~/.bashrc
總結
使用者環境變數檔案在 Linux 系統中起到了配置和定製使用者環境的關鍵作用。透過這些檔案,使用者可以自定義自己的工作環境,包括新增自定義命令、設定路徑和配置 shell 行為。瞭解這些檔案的作用和載入順序對於有效管理和最佳化 Linux 工作環境非常重要。
使用lineinfile模組設定環境變數
---
- hosts: ubuntu
tasks:
- name: 設定環境變數
lineinfile:
dest: ~/.profile
regexp: ^export ENV_KEY=
line: export ENV_KEY=env_value
- name: 獲取環境變數值 #指定bash shell,預設是使用/bin/sh,/bin/sh無法執行source命令
ansible.builtin.shell: 'source ~/.profile && echo $ENV_KEY'
args:
executable: /bin/bash
register: env_key
- name: 列印環境變數,inventory_hostname 是當前主機在inventory清單檔案中的名稱,預設情況下會在playbook中顯示出來,一般為ip,也可以自定義名稱
debug:
msg: "this linux os {{ inventory_hostname }} env_key is {{ env_key.stdout }}"
- name: 列印環境變數 #ansible_env 變數不包含lineinfile模組設定的變數,不知道為什麼
debug:
msg: "{{ ansible_env }}"
root@test:~/ansible/env# ansible-playbook env01.yaml
PLAY [ubuntu] *************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100]
TASK [設定環境變數] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100]
TASK [獲取環境變數值] *****************************************************************************************************************************************************************************************************************************************************
changed: [192.168.232.100]
TASK [列印環境變數] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100] => {
"msg": "this linux os 192.168.232.100 env_key is env_value"
}
TASK [列印環境變數] *******************************************************************************************************************************************************************************************************************************************************
ok: [192.168.232.100] => {
"msg": {
"DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/0/bus",
"HOME": "/root",
"LANG": "en_US.UTF-8",
"LOGNAME": "root",
"PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin",
"PWD": "/root",
"SHELL": "/bin/bash",
"SHLVL": "0",
"SSH_CLIENT": "192.168.232.100 43140 22",
"SSH_CONNECTION": "192.168.232.100 43140 192.168.232.100 22",
"SSH_TTY": "/dev/pts/3",
"TERM": "xterm",
"USER": "root",
"XDG_RUNTIME_DIR": "/run/user/0",
"XDG_SESSION_CLASS": "user",
"XDG_SESSION_ID": "39",
"XDG_SESSION_TYPE": "tty",
"_": "/bin/sh"
}
}
PLAY RECAP ****************************************************************************************************************************************************************************************************************************************************************
192.168.232.100 : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0