ansible 設定環境變數

anyux發表於2024-08-13

這裡有個小知識點
在 Linux 系統中,使用者環境變數檔案是用來設定使用者級別的環境變數和 shell 配置的檔案。這些檔案可以控制使用者的環境,包括路徑、命令別名、shell 提示符、自定義函式等。不同的檔案在不同的情況下會被載入,並對使用者的 shell 會話產生影響。

常見的使用者環境變數檔案及其作用

  1. /etc/profile

    • 作用: 這是系統範圍內的環境變數配置檔案,對所有使用者生效。當使用者登入時(透過互動式的登入 shell,如透過 SSH 登入),系統會首先執行 /etc/profile 中的配置。
    • 載入時機: 每次使用者登入時,系統會自動載入 /etc/profile
  2. ~/.profile

    • 作用: 這是每個使用者的個人環境變數檔案,用於設定使用者級別的環境變數。當使用者登入時,系統會執行這個檔案。可以用來定義使用者專屬的路徑、變數等。
    • 載入時機: 每次使用者登入時,系統會自動載入 ~/.profile。對於一些 shell,如 bash,如果沒有找到 ~/.bash_profile~/.bash_login,它會執行 ~/.profile
  3. ~/.bash_profile

    • 作用: 這是專門為 bash shell 準備的登入指令碼檔案。在使用者透過互動式登入 shell(如 SSH 登入)時,bash shell 會讀取並執行該檔案。它通常用於設定環境變數和啟動應用程式。
    • 載入時機: 每次使用者登入時,bash 會優先載入 ~/.bash_profile,除非指定不載入。~/.bash_profile 通常會包含對 ~/.bashrc 的載入命令。
  4. ~/.bashrc

    • 作用: 這是專門為 bash shell 準備的非登入互動式 shell 初始化檔案。它主要用於設定命令別名、函式、shell 提示符、環境變數等配置。在啟動一個新的終端或執行一個新的 bash shell 時,會載入這個檔案。
    • 載入時機: 每次啟動非登入的互動式 shell(如開啟一個新的終端視窗)時,bash 會載入 ~/.bashrc
  5. /etc/bash.bashrc

    • 作用: 這是系統範圍內的 bash 初始化檔案,對所有使用者生效。用於在所有使用者的非登入互動式 shell 中設定環境變數和其他配置。
    • 載入時機: 每次啟動非登入的互動式 shell 時(如開啟終端視窗),系統會載入 /etc/bash.bashrc
  6. ~/.bash_logout

    • 作用: 這是 bash shell 在使用者登出時執行的檔案。可以用來清理臨時檔案、記錄日誌等。
    • 載入時機: 每次使用者從登入 shell 登出時,bash 會執行 ~/.bash_logout

載入順序和優先順序

  • 登入 shell(如 SSH 登入)時,系統會按照以下順序載入:

    1. /etc/profile
    2. ~/.bash_profile~/.bash_login~/.profile
    3. ~/.bashrc(通常是透過 ~/.bash_profile 或其他檔案手動載入的)
  • 非登入互動式 shell(如開啟新的終端)時,系統會載入:

    1. /etc/bash.bashrc
    2. ~/.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   

相關文章