【Ansible】變量與敏感數據管理:Vault加密與Facts采集詳解

1. 變量

Ansible利用變量存儲可重復使用的值,可以簡化項目的創建和維護,減少錯誤數量。

1.1 變量名稱

由字符串組成,必須以字母開頭,并且只能含有字母、數字和下劃線,和其它編程語言很類似。

1.2 常見變量

  • 要創建的用戶
  • 要安裝的軟件包
  • 要重新啟動的服務
  • 要刪除的?件
  • 要從互聯網檢索的存檔

1.3 定義變量

在不同位置定義變量具有不同的優先級,優先級規則是:越具體越優先,就近優先(離 task 越近,優先級越高)。

以下是一些常見定義位置的示例(優先級從低到高):

  • 在清單中定義的組變量
[webservers]            # 主機組
web1.example.com        # 主機1
web2.example.com        # 主機2[webservers:vars] # 組變量
nginx_port=8080
package_name=nginx
  • 在清單或 playbook 所在目錄的 group_vars 子目錄中定義的組變量
  • 在清單中定義的主機變量
# 清單定義的主機變量 http_port
[webservers]
web1.example.com http_port=80
web2.example.com http_port=8080
  • 在清單或 playbook 所在目錄的 host_vars 子目錄中定義的主機變量
  • 在運行時中發現的主機事實(由 setup 模塊自動收集)
  • playbook 中的 play 變量 (vars 關鍵字和 vars_files 指令)
# var 關鍵字(內聯定義)
---
- hosts: localhostvars:app_name: "my_application"app_port: 8080tasks:- debug:msg: "Deploying {{ app_name }} on port {{ app_port }}"# vars_files 指令 (從外部文件加載)
---
- hosts: localhostvars_files:- vars/settings.yml # 加載外部變量文件tasks:- debug:msg: "Deploying {{ app_name }} on port {{ app_port }}"# vars/settings.yml
---
app_name: "my_application"
app_port: 8080
  • 任務變量
  • 在命令行中定義的額外變量,使用 --extra-vars 或 -e 選項定義(優先級最高)
# 此處僅為示例 xxx.yaml 和 varname=var 需替換為真實的
ansible-navigator run xxx.yaml -e "varname=var"# 示例
# 單個變量
ansible-playbook deploy.yml -e "package_to_install=apache2"
# 列表
ansible-playbook deploy.yml -e '{"packages_to_remove": ["old_app1", "old_app2"]}'
# 變量文件(需創建一個臨時變量文件 vars_file.yml)
ansible-playbook deploy.yml -e "@vars_file.yml"

建議選擇全局唯一的變量名稱。如果不同級別有相同名稱的變量,優先級高的變量會覆蓋優先級低的。

1.4 清單變量

分類:主機變量(用于特定主機),組變量,前者優先級高。

定義方法:
1)在清單文件中定義。

2)在與 playbook 相同的工作目錄中創建 group_vars (存放組變量文件)和 host_vars (存放主機變量文件)兩個目錄。

推薦使用?group_vars?和?host_vars?目錄來管理變量,而不是寫在清單文件中。

示例的項目架構:

my_ansible_project/
├── inventory.ini
├── host_vars/
│   └── web1.example.com.yml
├── group_vars/
│   └── webservers.yml
└── site.yml

對應的項目文件:
文件?group_vars/webservers.yml?內容

---
# 適用于所有 webservers 組主機的變量
firewall_package: ufw
common_packages:- vim- git- htop

文件 host_vars/web1.example.com.yml 內容

---
# 僅適用于 web1.example.com 的特定變量
host_specific_setting: "This is only for web1"
nginx_sites_enabled:- host1.example.com- admin.example.com

1.5 使用字典定義變量

Ansible的模塊也是采用的字典,有層級關系,更直觀。以定義用戶信息為例:

# 扁平化變量(難以管理)
# 注意變量名不要重復
user_alice_name: alice
user_alice_uid: 1234
user_alice_groups: developers
user_alice_home: /home/alice
user_bob_name: bob
user_bob_uid: 1235
user_bob_groups: bob
user_bob_home: /home/bob# 使用字典變量(推薦)
users:alice:name: aliceuid: 1234groups: developershome: /home/alicebob:name: bobuid: 1235groups: bobhome: /home/bob

使用方法

對于上一示例,想要訪問 alice 的 uid可采用以下兩種方式:

# 等價的
users.alice.uid
users['alice']['uid']        # Python語法

盡管兩種都有效,但是建議Ansible項目的所有文件采用一致的一種語法。

1.6 變量使用

將變量名稱放在雙花括號 {{ 變量名稱 }} 中,任務執行時,Ansible 會將其替換為對應的值。

注意:變量名稱和雙花括號之間有空格

強烈建議使用引號,如"{{ 變量名稱 }}",防止 Ansible 當作YAML字典處理。

1.7 捕獲命令輸出

使用?register?關鍵字將一個任務的輸出捕獲到一個變量中。這個變量是一個復雜的字典,包含了命令執行的結果、標準輸出、標準錯誤和返回碼等。

- name: register_testhosts: localhosttasks:- name: check fileansible.builtin.command: ls /etc/hostnameregister: file_check

2. Vault

對于配置遠程服務器需要訪問的密碼或 API 密鑰等敏感數據,如果以純文本形式存儲在變量清單或其它 Ansible 文件中,安全風險極高。推薦使用隨 Ansible 提供的 Ansible Vault?,它可以加密和解密任何由Ansible使用的結構化數據文件,通過 ansible-vault 命令行工具創建、編輯、加密、解密和查看文件。

可類比 K8s 的 ConfigMap(存放非機密信息)和 Secret(存放機密信息)。

Vault 使用 AES256 對稱加密算法來保護文件,加密和解密都使用同一個密碼(Vault密碼)作為密鑰。

2.1 使用方法

2.1.1 創建加密文件

默認使用編輯器 vi 打開文件

ansible-vault create filename.yml

2.1.2 查看加密文件

ansible-vault view filename.yml

2.1.3 編輯加密文件

ansible-vault edit filename.yml

2.1.4 加密現有文件

使用 --output=OUTPUT_FILE 選項,可將加密文件保存為新的名稱。

ansible-vault encrypt filename.yml

2.1.5 解密現有文件

解密單個文件時,可使用 --output 選項以其他名稱保存解密的文件。

ansible-vault decrypt filename.yml

2.1.6 更改加密文件密碼

使用 ansible-vault rekey filename 命令更改加密文件的密碼。執行后,它會先要求輸入當前密碼,然后提示輸入新密碼,也可以使用 --new-vault-password-file 選項直接指定包含新密碼的文件。

ansible-vault rekey filename.ymlansible-vault rekey --new-vault-password-file=new_password.txt filename.yml

2.2 運行?Vault 加密的文件的 playbook

需要向 ansible-playbook 命令提供其加密密碼,有以下三種方式:

1)交互方式,根據提示輸入密碼(需要禁用 artifact 工件,具體原因后期介紹工件時解釋)

ansible-navigator run -m stdout \
--playbook-artifact-enable false filename.yml \
--vault-id @prompt

2)指定 Vault 密碼文件(最安全)

密碼必須在該文件中存儲為一行字符串。

ansible-navigator run -m stdout filename.yml \
--vault-password-file=vault-pw-file

建議:設置密碼文件的權限為 600,確保只有所有者可讀;

???????????將密碼文件存儲在安全的位置,不要納入版本控制系統。

3)使用 $ANSIBLE_VAULT_PASSWORD_FILE 環境變量

# 設置環境變量
export ANSIBLE_VAULT_PASSWORD_FILE=~/path/to/vault-password-file# 運行 playbook(無需額外指定密碼文件參數)
ansible-navigator run -m stdout filename.yml

補充:可以通過 ansible-navigator 使用多個 Ansible Vault 密碼,將多個 --vault id 或 --vault-password-file 選項傳遞給 ansible-navigator 命令。

3. Facts(事實)

Ansible 事實是 Ansible 從受管節點自動探查到的變量,由 ansible.builtin.setup 模塊調取,其中包含的信息存儲到可重復使用的變量中。

以下僅列舉部分(使用 Python 語法表述字典),根據變量名稱也可大致知道表述的內容。

事實描述變量
短主機名稱ansible_facts['hostname']
完全限定的域名ansible_facts['fqdn']
主要 IPv4 地址(基于路由)ansible_facts['default_ipv4']['address']
所有網絡接口的名稱列表ansible_facts['interfaces']
特定網絡接口的詳細信息(eth0)ansible_facts['interfaces']['eth0']
網絡接口的 IP 地址配置ansible_facts['interfaces']['eth0']['ipv4']['address']
磁盤分區的大小(/dev/vda1)ansible_facts['devices']['vda']['partitions']['vda1']['size']
DNS 服務器列表ansible_facts['dns']['nameservers']
當前運行的內核版本ansible_facts['kernel']
操作系統版本ansible_facts['distribution_version']
總內存大小(MB)ansible_facts['memtotal_mb']
可用內存大小(MB)ansible_facts['memfree_mb']
【提問】Linux 中使用什么命令查看磁盤的使用情況?

答:df命令

對于大型的集群系統,在執行play,task之前,需要先知道受管節點的配置情況(收集事實),軟硬件環境和配置情況會通過變量引用成為代碼的一部分。

3.1 查看事實

運行一個收集事實并使用ansible.builtin.debug 模塊顯示,以下示例會顯示事實的全部內容。只需要特定信息時,只選擇特定變量即可。

# fact_test.yml
---
- name: Fact dumphosts: all# gather_facts: true             # 默認為truetasks:- name: Print all factsansible.builtin.debug:var: ansible_facts 
# 運行該playbook
ansible-navigator run -m stdout fact_test.yml
# 內容會很多

3.2 關閉事實

為 play 禁用事實收集,將gather_facts 關鍵字設置為 no。可以加快 playbook 的運行速度,或者在受控節點不支持 setup 模塊時使用。

即使在 play 設置 gather_facts 為 no 的情況下,任務仍可以通過設置 ansible.builtin.setup 模塊手動收集事實。

---
- name: Play with manual fact gatheringhosts: allgather_facts: no                    # 關閉自動收集tasks:- name: Manually collect only disk factsansible.builtin.setup:          # 設置 ansible.builtin.setup 模塊gather_subset:- network 

3.3 事實子集

模塊默認收集全部事實,但可以通過配置僅收集事實的子集。子集的具體內容可以參考 Ansible 官方文檔或使用 ansible-doc setup 命令查看。

---
- name: Various fact gathering exampleshosts: alltasks:- name: Collect all facts (default behavior)ansible.builtin.setup:gather_subset:- all- name: Collect network-related factsansible.builtin.setup:gather_subset:- network- name: Collect hardware and network factsansible.builtin.setup:gather_subset:- hardware- network- name: Collect all facts except networkansible.builtin.setup:gather_subset:- "!network"- name: Collect minimal fact setansible.builtin.setup:gather_subset:- min

3.3 自定義事實

管理員可以使用自定義事實定義受管主機的特定值。自定義事實存儲在受管節點的本地文件中。

自定義事實可以在 INI 或 JSON 格式(效率高,語法麻煩)的文件中靜態定義,也可以通過可執行腳本在運行時動態生成

ansible.builtin.setup 模塊會自動從受管節點的 /etc/ansible/facts.d 目錄中收集自定義事實,文件的擴展名必須為 .fact

注意: 自定義事實不支持 YAML 格式。

4. 魔法變量

有些變量不由 ansible.builtin.setup 模塊收集,但有用,此時就需要魔法變量,它是一種特殊的變量,可以獲取與特定受管主機相關的信息。

使用場景:在一個任務中需要訪問其他受管主機的信息。

常用魔法變量

變量名稱描述
hostvars包含所有受管主機的非事實變量
hostvars[inventory_hostname]當前主機的所有變量(包括事實和自定義變量)
group_names列出當前受管主機所屬的所有組
groups列出 inventory 中所有組和對應的主機
inventory_hostname在 inventory 中定義的主機名(可能與事實主機名不同)

如有問題或建議,歡迎在評論區中留言~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94012.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS2下YOLO+Moveit+PCL機械臂自主避障抓取方案

整體運行架構 1.運行相機取像節點 . ./install/setup.bash ros2 launch orbbec_camera gemini_330_series.launch.py depth_registration:true 2.運行根據圖像x,y獲取z的service 基本操作記錄: 創建python包,在src目錄下 ros2 pkg create test_python_topic --bu…

快速入門Vue3——初體驗

目錄 前言 一、搭建環境 1.1、安裝Node.js 1.2、安裝Vite 二、項目創建 三、運行項目 四、集成Pinia 4.1、Pinia介紹 4.2、Pinia安裝 五、集成VueUse 5.1、vueuse簡介 5.2、vueuse安裝 六、集成Vant 6.1、Vant簡介 6.2、Vant安裝 前言 本專欄主要介紹如何使用…

深入理解Kubernetes核心:標簽與標簽選擇器實戰解析

在管理 Kubernetes 集群時,隨著 Pods、Services 等資源數量的增長,如何有效地組織和篩選它們,成為了一個核心問題。Kubernetes 為此提供了一個簡單卻極其強大的機制:標簽(Labels)和標簽選擇器(L…

哈希和字符串哈希

哈希(Hash) Hash 表 Hash 表又稱為散列表,一般由 Hash 函數(散列函數)與鏈表結構共同實現。與離散化思想類似,當我們要對若干復雜信息進行統計時,可以用 Hash 函數把這些復雜信息映射到一個容…

【Docker基礎】Docker-Compose核心配置文件深度解析:從YAML語法到高級配置

目錄 前言 1 YAML基礎語法解析 1.1 YAML格式簡介 1.2 Docker-compose中的YAML語法規則 1.3 YAML數據類型在Compose中的應用 2 docker-compose.yml文件結構剖析 2.1 基本文件結構 2.2 版本聲明詳解 3 services配置深度解析 3.1 服務定義基礎 3.2 鏡像與構建配置 3.3…

如何判斷是否應該為了一個小功能而引入一個大體積的庫

在軟件開發中,判斷是否應該為了一個看似微小的功能,而引入一個大體積的第三方庫,是一項極其重要的、需要進行審慎的“投入產出比”分析的技術決策。這個決策,絕不能,僅僅基于“實現功能的便利性”,而必須&a…

相機定屏問題分析五:【跳幀異常】照片模式1x以上的焦段拍照之后定屏

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 相機定屏問題分析五:【跳幀異常】照片模式1x以上的焦段拍照之后定屏9573412 目錄 一、問題背景 二…

Non-stationary Diffusion For Probabilistic Time Series Forecasting論文閱讀筆記

Non-stationary Diffusion For Probabilistic Time Series Forecasting 摘要 時間序列數據受到潛在的物理動力學和外部影響,其不確定性通常隨時間而變化。現有的去噪擴散概率模型(DDPMs)受到加性噪聲模型(ANM)的恒定方…

解決Docker 無法連接到官方鏡像倉庫

這個錯誤: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)表示 Docker 無法連接到官方鏡像倉庫 registry-1.docker…

解決RAGFlow啟動時Elasticsearch容器權限錯誤的技術指南

文章目錄 問題現象 根本原因分析 解決方案步驟 1. 定位宿主機數據目錄 2. 修復目錄權限 3. 驗證權限狀態 4. 重啟服務 5. 檢查啟動狀態 永久解決方案:優化Docker Compose配置 高級故障排除 技術原理 問題現象 在啟動RAGFlow項目時,執行 docker logs ragflow-es-01 發現Elast…

【C++高階六】哈希與哈希表

【C高階六】哈希與哈希表1.什么是哈希?2.unordered系列容器3.哈希表3.1將key與存儲位置建立映射關系3.1.1直接定址法3.1.2除留余數法(產生哈希沖突)3.2解決哈希沖突的方法3.2.1閉散列(開放定址法)3.3.2開散列&#xff…

Vue 3 +Ant Design Vue 父容器樣式不影響子級,隔離

公共樣式文件 common.scss.zz-ant-status-bar {div {font-size: 12px;padding: 0 8px;} }頁面代碼<div class"zz-ant-status-bar"><a-row><a-col :span"6" ><a-progress :percent"progress.percent" size"small"…

k8s 簡介及部署方法以及各方面應用

Kubernetes 簡介及部署方法Kubernetes&#xff08;簡稱 K8s&#xff09;是一個開源的容器編排平臺&#xff0c;用于自動化容器化應用的部署、擴展、管理和運維。它由 Google 基于內部的 Borg 系統經驗開發&#xff0c;2014 年開源后由云原生計算基金會&#xff08;CNCF&#xf…

Class A 包含字段 x Class B 也包含字段 x,如果判斷List<A> lista 和 List<B> listb 有相同的 x?

要判斷兩個不同類型的對象列表 List<A> 和 List<B> 是否包含相同的 x字段值&#xff08;即兩個列表中至少有一個 x是相同的&#xff09;&#xff0c;你可以使用 Java 8 的 Stream API 來實現。import java.util.List; import java.util.Set; import java.util.stre…

SpringBoot整合Camunda工作流

什么是工作流&#xff1f;概述 工作流是將一組任務組織起來以完成某個經營過程&#xff1a;定義了任務的觸發順序和觸發條件&#xff0c;每個任務可以由一個或多個軟件系統完成&#xff0c;也可以由一個或一組人完成&#xff0c;還可以由一個或多個人與軟件系統協作完成&#x…

2025年09月計算機二級Java選擇題每日一練——第四期

計算機二級中選擇題是非常重要的&#xff0c;所以開始寫一個每日一題的專欄。 答案及解析將在末尾公布&#xff01; 今日主題&#xff1a;面向對象特性 1、有兩個類 A 和 B 的定義如下&#xff1a; class A{final int x10;public void show(){System.out.print(x " &quo…

《Nature》新文解讀:電化學輔助核聚變的實驗驗證與機制分析

前言一篇于2025年8月發表在《Nature》期刊上的重磅研究&#xff0c;由加拿大不列顛哥倫比亞大學&#xff08;UBC&#xff09;Curtis P. Berlinguette教授領導的跨學科團隊完成&#xff0c;首次在實驗上證實&#xff1a;通過電化學方法向鈀金屬靶中加載氘&#xff0c;可顯著提升…

【基礎-判斷】用戶在長視頻、短視頻、直播、通話、會議、拍攝類應用等場景下,可以采用懸停適配在折疊屏半折態時,上屏進行瀏覽下屏進行交互操作

用戶在長視頻、短視頻、直播、通話、會議、拍攝類應用等場景下,可以采用懸停適配在折疊屏半折態時,上屏進行瀏覽下屏進行交互操作。 解釋如下: ? 1. 懸停態適配機制的核心設計 HarmonyOS 針對折疊屏半折態(懸停態)提供了分屏交互框架,其核心邏輯是: 上屏(Upper Scre…

nodejs安裝后 使用npm 只能在cmd 里使用 ,但是不能在poowershell使用,只能用npm.cmd

nodejs安裝后 使用npm 只能在cmd 里使用 &#xff0c;但是不能在poowershell使用&#xff0c;只能用npm.cmdnodejs版本&#xff1a;22.18.0 剛安裝好nodejs&#xff0c;在 PowerShell 中無法執行 npm&#xff0c;但能執行npm.cmd&#xff0c;這通常是因為 PowerShell 的執行策略…

【鏈表 - LeetCode】2. 兩數相加

誰都逃不掉 LeetCode &#xff01;&#xff01;哈哈哈~~~ 開刷&#xff1a;&#xff09; 2025年08月22日 題目&#xff1a;2. 兩數相加 - 力扣&#xff08;LeetCode&#xff09; 知識點&#xff1a;鏈表 /*** Definition for singly-linked list.* struct ListNode {* in…