Ansible 變量的聲明
前言
全面理解 Ansible 變量是編寫高效、可維護 Playbook 的關鍵。由于最近使用 Ansible 比較多,在變量問題上踩了不少坑,也因此對變量的聲明,優先級和作用域有了更深的理解。姑且總結一下,分享給大家,作為一個學習、避坑小指南。
在哪兒聲明 Ansible 變量?
簡單來說,變量可以放在下面這些地方,我們平時用得最多的也就這幾種。加上代碼示例后會更清晰。
-
命令行里直接加
- 用
-e
或--extra-vars
參數,在跑 playbook 的時候臨時指定。 -
ansible-playbook my_playbook.yml -e “user=admin http_port=8080”
- 用
-
Playbook 文件里
vars:
:直接在 Playbook 里寫。
- name: My Playbookhosts: webserversvars:app_name: "AwesomeApp"app_version: "1.2.3"tasks:- name: Display app infodebug:msg: "Deploying {{ app_name }} version {{ app_version }}"
vars_files
: 把變量單獨存到一個文件里,然后在 Playbook 里引用。
# vars/db.yml db_user: "mysql_user" db_pass: "secret"
# playbook.yml - name: My Playbookhosts: db_serversvars_files:- vars/db.ymltasks:- name: Configure databasedebug:msg: "Configuring DB with user {{ db_user }}"
vars_prompt
: 運行時會提示你手動輸入,適合密碼這類敏感信息。
- name: Deploy with user confirmationhosts: allvars_prompt:- name: "deploy_user"prompt: "Enter your username for deployment"private: no # 輸入時可見- name: "deploy_password"prompt: "Enter your password"private: yes # 輸入時不可見tasks:- name: Run deploymentdebug:msg: "Running as {{ deploy_user }}"
-
Inventory 清單里
group_vars/
: 這是最常用的。給某個主機組(比如webservers
)創建一個group_vars/webservers.yml
文件,里面的變量就對這個組所有機器生效。group_vars/all.yml
里的變量對所有機器都生效。
# 目錄結構 inventory group_vars/webservers.ymlall.yml
# group_vars/webservers.yml http_port: 80 ntp_server: "ntp.web.example.com"
host_vars/
: 如果只想給某一臺機器(比如server1.example.com
)指定變量,就創建一個host_vars/server1.example.com.yml
文件。
# 目錄結構 inventory host_vars/server1.example.com.yml
# host_vars/server1.example.com.yml # 這個配置會覆蓋 group_vars/webservers.yml 里的 http_port http_port: 8080
-
Role (角色) 里
roles/your_role/defaults/main.yml
: 角色的默認變量。注意是“默認”,意思是它的優先級最低,很容易被其他地方的同名變量覆蓋。
# roles/my_apache_role/defaults/main.yml apache_port: 80
roles/your_role/vars/main.yml
: 角色的“標準”變量,比defaults
里的優先級高。
# roles/my_apache_role/vars/main.yml apache_package_name: "httpd"
-
運行時動態生成
- Facts (事實變量): Ansible 會自動收集遠程機器的信息,比如 IP 地址 (
ansible_default_ipv4.address
)、系統版本等。這些是它自己發現的變量。
- name: Show OSdebug:msg: "The OS is {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}"
register
: 把一個任務的執行結果存成一個變量,給后面的任務用。
- name: Check file existencecommand: ls /path/to/some/fileregister: file_check_resultignore_errors: yes- name: Report if file existsdebug:msg: "File exists!"when: file_check_result.rc == 0
set_fact
: 在 playbook 運行過程中,手動創建一個新變量。
- name: Set a custom factset_fact:my_custom_variable: "Hello World"- name: Use the custom factdebug:msg: "{{ my_custom_variable }}"
- Facts (事實變量): Ansible 會自動收集遠程機器的信息,比如 IP 地址 (
后續會再寫一篇介紹 Ansible 變量的優先級和作用域。
參考資料
- Ansible 官方文檔:使用變量 (Using Variables)