什么是ansible?
Ansible是一款自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
Ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是Ansible所運行的模塊,Ansible只是提供一種框架。主要包括:
(1) 連接插件connection plugins:負責和被監控端實現通信;
(2) host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
(3) 各種模塊核心模塊、command模塊、自定義模塊;
(4) 借助于插件完成記錄日志郵件等功能;
(5) playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
Ansible 無需代理
Ansible 圍繞無代理架構構建。通常而言,Ansible 通過 OpenSSH 或 WinRM 連接它所管理的主機并且運行任務,方法通常是將稱為 Ansible 模塊的小程序推送至這些主機。這些程序用于將系統置于需要的特定狀態。在 Ansible 運行完其任務后,推送的所有模塊都會被刪除。
Ansible 不需要批準使用任何特殊代理,然后再部署到受管主機上。由于沒有代理,也不需要額外的自定義安全基礎架構,
Ansible 具有多個重要的優點:
跨平臺支持:Ansible 提供Linux、Windows、UNIX和網絡設備的無代理支持,適用于物理、虛擬、云和容器環境。
人類可讀的自動化:Ansible Playbook采用YAML文本文件編寫,易于閱讀,有助于確保所有人都能理解它們的用途。
完美描述應用:可以通過 Ansible Playbook進行每種更改,并描述和記錄應用環境的每一個方面。
輕松管理版本控制:Ansible Playbook和項目是純文本。它們可以視作源代碼,放在現有版本控制系統中。
支持動態清單:可以從外部來源動態更新 Ansible 管理的計算機列表,隨時獲取所有受管服務器的當前正確列表,不受基礎架構或位置的影響。
編排可與其他系統輕松集成:能夠利用環境中現有的 HP SA、Puppet、Jenkins、紅帽衛星和其他系統,并且集成到 Ansible 工作流中。
一:Ansible 的清單(Inventory)
1 什么是 Inventory?
作用:列出 Ansible 需要管理的主機(IP/域名)和分組。
默認路徑:
/etc/ansible/hosts
,但通常使用自定義路徑并通過?-i
?指定。格式:支持 INI 或 YAML 格式(推薦 INI 簡單易讀)。
2. 基礎用法
2.1 定義主機
# 直接定義單個主機(IP 或域名)
192.168.1.10
web.example.com# 指定 SSH 端口和用戶
db-server ansible_host=192.168.1.11 ansible_port=2222 ansible_user=admin
ansible_host
:覆蓋默認的主機名。ansible_port
:指定非標準 SSH 端口(默認 22)。ansible_user
:登錄遠程主機的用戶。
2.2 定義主機組
# 定義組 [組名],組內包含主機
[web_servers]
192.168.1.10
192.168.1.11[db_servers]
db-server # 引用之前定義的主機別名# 嵌套組(:children)
[prod:children]
web_servers
db_servers
組可以嵌套(通過?
:children
?聲明)。示例中?
prod
?組包含?web_servers
?和?db_servers
?的所有主機。
2.3 為主機或組分配變量
# 主機變量
[web_servers]
web1 ansible_host=192.168.1.10 http_port=80# 組變量(通過 :vars)
[db_servers:vars]
ansible_user=postgres
db_version=14
變量可以在 Playbook 或模板中通過?
{{ http_port }}
?引用。
3. 動態清單(Dynamic Inventory)
當主機列表頻繁變化(如云環境),靜態文件難以維護,此時可以用動態清單腳本(返回 JSON 格式的主機信息)。
3.1 動態清單示例(AWS EC2)
# 使用 aws_ec2 插件(需安裝 boto3)
ansible-inventory -i aws_ec2.yaml --list
配置文件?aws_ec2.yaml
:
plugin: aws_ec2
regions:- us-east-1
filters:tag:Environment: prod
3.2 動態清單的優勢
自動從云平臺(AWS、Azure、GCP)或 CMDB 獲取最新主機列表。
支持過濾(如按標簽、區域等)。
4. 高級功能
4.1 模式匹配
在命令中靈活選擇主機:
# 匹配 web_servers 組
ansible web_servers -m ping# 通配符匹配所有以 "web" 開頭的主機
ansible "web*" -m ping# 排除 db_servers 組
ansible all:!db_servers -m ping
4.2 使用多個清單文件
通過目錄合并多個清單:
/etc/ansible/inventories/
├── production
├── staging
└── cloud
運行命令時指定目錄:
ansible -i /etc/ansible/inventories/production all -m ping
4. 高級功能
4.1 模式匹配
在命令中靈活選擇主機:
# 匹配 web_servers 組
ansible web_servers -m ping# 通配符匹配所有以 "web" 開頭的主機
ansible "web*" -m ping# 排除 db_servers 組
ansible all:!db_servers -m ping
4.2 使用多個清單文件
通過目錄合并多個清單:
/etc/ansible/inventories/
├── production
├── staging
└── cloud
運行命令時指定目錄:
ansible -i /etc/ansible/inventories/production all -m ping
二:ansible的運行臨時命令
1. 臨時命令的基本格式
ansible <主機或組名> -m <模塊名> -a "<模塊參數>" [其他選項]
<主機或組名>:
可以是 Inventory 文件中定義的主機名、組名,或通配符(如 all 表示所有主機)。
示例:web_servers、192.168.1.10。
-m <模塊名>:指定要使用的模塊(如 command、shell、copy 等)。
如果省略 -m,默認使用 command 模塊。
-a "<模塊參數>":傳遞給模塊的參數(如命令、文件路徑等)。
[其他選項]:如 -i 指定 Inventory 文件、-u 指定用戶等。
2. 常用模塊的臨時命令示例
(1)執行 Shell 命令
# 在所有主機上執行 `ls /tmp`
ansible all -m command -a "ls /tmp"# 使用 shell 模塊(支持管道)
ansible web_servers -m shell -a "cat /var/log/nginx/access.log | grep 404"
(2)文件管理
# 復制本地文件到遠程主機
ansible db_servers -m copy -a "src=/etc/hosts dest=/tmp/hosts mode=0644"# 刪除遠程文件
ansible 192.168.1.10 -m file -a "path=/tmp/old.log state=absent"
(3)軟件包管理
# 在 CentOS 上安裝 nginx
ansible web -m yum -a "name=nginx state=present"# 在 Ubuntu 上更新所有軟件包
ansible ubuntu_servers -m apt -a "upgrade=dist"
(4)服務管理
# 啟動 nginx 并設置開機自啟
ansible web -m service -a "name=nginx state=started enabled=yes"
(5)用戶管理
# 創建用戶
ansible all -m user -a "name=testuser groups=wheel"
(6)收集主機信息(使用 setup 模塊)
# 獲取所有主機的內存信息
ansible all -m setup -a "filter=ansible_memtotal_mb"
3. 常用選項
選項說明:
-i <路徑>?? ?指定自定義的 Inventory 文件(默認 /etc/ansible/hosts)。
-u <用戶名>?? ?指定遠程主機的登錄用戶(如 -u root)。
--become?? ?提權(默認用 sudo,等同于 -b)。
--become-user?? ?提權到指定用戶(如 --become-user=root)。
-k?? ?提示輸入 SSH 密碼(如果未配置密鑰認證)。
-K?? ?提示輸入提權密碼(如 sudo 密碼)。
-v / -vvv?? ?輸出詳細日志(-v 為基本信息,-vvv 為調試信息)。
--limit <主機>?? ?限制執行的主機(如 --limit 192.168.1.10)。
示例:
# 以 admin 用戶登錄,sudo 執行命令
ansible db -u admin --become -K -m shell -a "whoami"
4. 實際場景示例
(1)批量重啟服務
ansible web_servers -m service -a "name=httpd state=restarted" --become
(2)檢查磁盤空間
ansible all -m shell -a "df -h /"
(3)批量推送公鑰
ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'"
5. 注意事項
冪等性:
大多數模塊(如 yum、copy)是冪等的(多次執行結果一致),但 shell 和 command 模塊可能不是。
安全性:
避免在 -a 中直接傳遞敏感信息(如密碼),建議使用 Ansible Vault。
性能:
臨時命令是同步執行的,若需并行控制,可使用 -f <并發數>(如 -f 10)。
6. 與 Playbook 的區別
臨時命令?? ?Playbook
單行命令,快速執行簡單任務。?? ?YAML 文件,適合復雜、多步驟的任務。
無需保存,適合臨時操作。?? ?可復用、版本控制、支持條件判斷等邏輯。
示例:ansible all -m ping?? ?示例:ansible-playbook deploy.yml
總結
臨時命令是 Ansible 快速操作的利器,適合:
快速驗證模塊功能。
緊急修復或一次性任務。
簡單的主機狀態檢查。
掌握后,可以結合 Playbook 實現更強大的自動化!
三:ansible常用模塊
1. command 模塊
用途:在遠程主機上執行簡單的命令。
特點:
????????不支持管道(|)、重定向(>)等 Shell 特性。
????????如果需要 Shell 功能,應使用 shell 模塊。
常用參數:
????????cmd: 要執行的命令(可選,可以直接寫命令字符串)。
????????chdir: 執行命令前切換到的目錄。
示例:
- name: 查看當前目錄內容command: ls -lregister: result ?# 將命令輸出保存到變量 result- name: 打印命令輸出debug:var: result.stdout
2. shell 模塊
用途:在遠程主機上通過 Shell 執行命令(支持管道、重定向等)。
特點:
????????比 command 更靈活,但可能有安全風險(如用戶輸入未過濾時)。
常用參數:
????????cmd: 要執行的命令。
????????executable: 指定 Shell 路徑(如 /bin/bash)。
示例:
- name: 使用管道統計文件行數shell: cat /etc/passwd | wc -lregister: line_count- name: 打印行數debug:var: line_count.stdout
3. copy 模塊
用途:將本地文件復制到遠程主機。
常用參數:
????????src: 本地源文件路徑。
????????dest: 遠程目標路徑(必須是完整路徑)。
????????owner: 設置文件所有者。
????????group: 設置文件所屬組。
????????mode: 設置文件權限(如 0644)。
示例:
- name: 復制本地文件到遠程主機copy:src: ./app.confdest: /etc/app.confowner: rootgroup: rootmode: '0644'
4. file 模塊
用途:管理文件和目錄(創建、刪除、修改權限等)。
常用參數:
????????path: 文件/目錄路徑。
????????state: 狀態(file、directory、link、absent 等)。
????????recurse: 遞歸設置目錄屬性(如權限)。
示例:
- name: 創建目錄file:path: /opt/myappstate: directorymode: '0755'- name: 刪除文件file:path: /tmp/old.logstate: absent
5. yum (或 apt) 模塊
用途:管理軟件包(yum 用于 CentOS/RHEL,apt 用于 Debian/Ubuntu)。
常用參數:
????????name: 包名(支持列表)。
????????state: present(安裝)、latest(更新)、absent(卸載)。
示例:
- name: 安裝 Nginxyum: ?# 對于 Debian 替換為 aptname: nginxstate: present
6. service 模塊
用途:管理服務(啟動、停止、重啟等)。
常用參數:
????????name: 服務名。
????????state: started、stopped、restarted。
????????enabled: 是否開機自啟(yes/no)。
示例:
- name: 啟動 Nginx 并設置開機自啟service:name: nginxstate: startedenabled: yes
7. template 模塊
用途:將 Jinja2 模板渲染后復制到遠程主機(常用于配置文件動態生成)。
常用參數:
????????src: 本地模板文件(.j2 后綴)。
????????dest: 遠程目標路徑。
示例:
- name: 生成 Nginx 配置template:src: ./nginx.conf.j2dest: /etc/nginx/nginx.conf
8. user 模塊
用途:管理用戶賬號。
常用參數:
????????name: 用戶名。
????????state: present(創建)或 absent(刪除)。
????????groups: 用戶所屬組。
????????password: 加密后的密碼(需使用 openssl passwd 生成)。
示例:
- name: 創建用戶user:name: devusergroups: wheelstate: present
9. debug 模塊
用途:調試任務(打印變量或消息)。
常用參數:
????????msg: 打印自定義消息。
????????var: 打印變量值。
示例:
- name: 顯示變量debug:var: my_variable- name: 打印消息debug:msg: "任務執行完成!"
10. fetch 模塊
用途:從遠程主機拉取文件到本地。
常用參數:
????????src: 遠程文件路徑。
????????dest: 本地存儲目錄(會自動創建以主機名命名的子目錄)。
示例:
- name: 拉取遠程日志文件fetch:src: /var/log/app.logdest: /tmp/backups/
四:Ansible Playbook 詳細講解
Playbook 是 Ansible 的核心組件,用于定義復雜的自動化任務流程。它以 YAML 格式編寫,能夠實現配置管理、應用部署、編排等高級功能。下面我將從基礎到高級全面講解 Playbook 的使用。
1. Playbook 基礎結構
一個基本的 Playbook 包含以下元素:
---
- name: 我的第一個Playbook # Playbook描述hosts: web_servers # 目標主機或組become: yes # 是否提權執行vars: # 定義變量http_port: 80tasks: # 任務列表- name: 確保nginx已安裝yum:name: nginxstate: present
1.1 核心組成部分
name: Playbook 或任務的描述性名稱
hosts: 指定在哪些主機/組上運行
become: 是否使用特權升級(sudo等)
vars: 定義變量
tasks: 要執行的任務序列
2. Playbook 編寫詳解
2.1 多Play結構
一個Playbook可以包含多個Play:
---
- name: 配置Web服務器hosts: web_serverstasks:- name: 安裝nginxyum: name=nginx state=latest- name: 配置數據庫服務器hosts: db_serverstasks:- name: 安裝PostgreSQLyum: name=postgresql-server state=latest
2.2 變量使用
變量可以在多個位置定義:
---
- hosts: allvars: # Play級別變量package_name: nginxvars_files: # 引入外部變量文件- vars/main.ymltasks:- name: 安裝{{ package_name }}yum:name: "{{ package_name }}"state: present- name: 使用Facts變量debug:msg: "{{ ansible_hostname }} 的內存是 {{ ansible_memtotal_mb }}MB"
2.3 條件與循環
條件判斷:
tasks:- name: 僅當是CentOS時安裝yum: name=nginx state=presentwhen: ansible_os_family == "RedHat"
循環:
tasks:- name: 添加多個用戶user:name: "{{ item.name }}"groups: "{{ item.groups }}"loop:- { name: 'user1', groups: 'wheel' }- { name: 'user2', groups: 'root' }
3. 常用模塊在Playbook中的應用
3.1 文件管理
tasks:- name: 復制配置文件copy:src: files/nginx.confdest: /etc/nginx/nginx.confowner: rootgroup: rootmode: '0644'notify: 重啟nginx # 觸發handler- name: 創建目錄file:path: /var/www/htmlstate: directorymode: '0755'
3.2 包管理
tasks:- name: 安裝EPEL倉庫yum:name: epel-releasestate: present- name: 安裝必要軟件包yum:name: "{{ packages }}"state: latestvars:packages:- nginx- php-fpm- mariadb-server
3.3 服務管理
tasks:- name: 確保nginx運行service:name: nginxstate: startedenabled: yes
4. 高級功能
4.1 Handlers(觸發器)
tasks:- name: 更新nginx配置template:src: templates/nginx.conf.j2dest: /etc/nginx/nginx.confnotify: 重啟nginx # 配置文件改變時觸發handlers:- name: 重啟nginxservice:name: nginxstate: restarted
4.2 模板(Jinja2)
templates/db.conf.j2
:
[database]
host = {{ db_host }}
port = {{ db_port | default(3306) }}
user = {{ db_user }}
password = {{ db_password }}
Playbook中使用:
tasks:- name: 配置數據庫連接template:src: templates/db.conf.j2dest: /etc/app/db.confvars:db_host: "192.168.1.100"db_user: "appuser"db_password: "{{ vault_db_password }}" # 使用加密變量
4.3 角色(Roles)組織
推薦的項目結構:
site.yml
roles/common/tasks/handlers/files/templates/vars/defaults/meta/webserver/database/
使用角色:
---
- hosts: allroles:- common- webserver
5. 錯誤處理
5.1 忽略錯誤
tasks:- name: 嘗試停止服務command: /bin/falseignore_errors: yes
5.2 重試機制
tasks:- name: 等待端口響應wait_for:port: 80host: "{{ inventory_hostname }}"delay: 10timeout: 300register: resultuntil: result is succeededretries: 5delay: 30
6. 實際案例:部署Web應用
---
- name: 部署WordPress站點hosts: web_serversbecome: yesvars:wp_version: "5.8"db_name: "wordpress"db_user: "wpuser"tasks:- name: 安裝依賴yum:name: [nginx, php-fpm, php-mysql, mariadb]state: latest- name: 下載WordPressunarchive:src: "https://wordpress.org/wordpress-{{ wp_version }}.tar.gz"dest: /var/www/remote_src: yes- name: 配置nginxtemplate:src: templates/wordpress.conf.j2dest: /etc/nginx/conf.d/wordpress.confnotify: 重啟nginx- name: 設置文件權限file:path: /var/www/wordpressowner: nginxgroup: nginxrecurse: yeshandlers:- name: 重啟nginxservice:name: nginxstate: restarted
7. 最佳實踐
保持冪等性:確保Playbook可以安全重復運行
使用標簽:為任務添加標簽便于選擇性運行
tasks:- name: 安裝軟件yum: name=nginxtags: install
運行:
ansible-playbook site.yml --tags "install"
變量分層:
defaults/ (最低優先級)
group_vars/
host_vars/
Playbook vars
命令行-e傳遞變量 (最高優先級)
加密敏感數據:
ansible-vault create secrets.yml
使用:
vars_files:- secrets.yml
測試與驗證:
--check
?干跑模式--diff
?顯示變更--step
?逐步執行
8. 調試技巧
使用debug模塊:
- debug:var: hostvars[inventory_hostname]
增加詳細輸出:
ansible-playbook playbook.yml -vvv
注冊變量檢查:
- command: ls /tmpregister: result - debug:var: result
總結
Ansible Playbook 提供了強大的自動化能力,通過:
YAML結構化:清晰定義自動化流程
模塊化設計:使用各種模塊完成具體任務
變量系統:實現靈活配置
條件控制:處理復雜邏輯
錯誤處理:保證可靠性
角色組織:提高復用性
五:Ansible 變量管理
Ansible支持利用變量來存儲值,并在Ansible項目的所有文件中重復使用這些值。這可以簡化項目的創建和維護,并減少錯誤的數量。
通過變量,可以輕松地在Ansible項目中管理給定環境的動態值。例如,變量可能包含下面這些值:
要創建的用戶
要安裝的軟件包
要重新啟動的服務
要刪除的文件
要從互聯網檢索的存檔
一、變量基礎概念
1.1 變量定義方式
Ansible 支持多種變量定義形式:
# 鍵值對形式
variable_name: "value"# 列表形式
packages:- nginx- mysql-server# 字典形式
user:name: aliceuid: 1001groups: wheel
1.2 變量引用語法
基本引用:
{{ variable_name }}
訪問字典:
{{ user.name }}
訪問列表:
{{ packages[0] }}
二、變量作用域與優先級
2.1 作用域類型
作用域 | 描述 | 示例 |
---|---|---|
全局 | 對所有Play有效 | group_vars/all.yml |
Play | 當前Play內有效 | Play中的vars: 段 |
Host | 特定主機有效 | host_vars/web1.yml |
Task | 僅當前任務有效 | 任務中的vars: |
2.2 完整優先級順序(從低到高)
命令行
-e
傳遞的變量(最高優先級)
三、變量定義位置詳解
3.1 Inventory 變量
# inventory.ini
[web]
web1 ansible_host=192.168.1.10 http_port=8080[web:vars]
nginx_version=1.18
3.2 獨立變量文件
# group_vars/web.yml
service_name: nginx
config_path: /etc/nginx/nginx.conf# host_vars/web1.yml
max_connections: 2048
3.3 Playbook 中定義
- hosts: webvars:deploy_user: "www-data"vars_files:- vars/secrets.yml
3.4 角色變量
roles/webserver/defaults/main.yml # 默認變量(低優先級)vars/main.yml # 角色變量(高優先級)
四、特殊變量類型
4.1 Facts 變量
系統自動收集的主機信息:
- debug:msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"
4.2 注冊變量(Registered Variables)
捕獲任務輸出:
- name: 檢查服務狀態command: systemctl is-active nginxregister: nginx_statusignore_errors: yes- name: 根據狀態處理service:name: nginxstate: "{{ 'restarted' if nginx_status.rc != 0 else 'started' }}"
4.3 魔法變量(Magic Variables)
Ansible 內置特殊變量:
inventory_hostname
:當前操作的主機名groups
:所有分組信息ansible_play_hosts
:當前Play的目標主機列表
五、高級變量技術
5.1 變量合并(hash_behaviour)
配置ansible.cfg
:
[defaults]
hash_behaviour = merge # 合并字典而不是覆蓋
5.2 變量過濾器
Jinja2過濾器應用:
- debug:msg: "{{ user_input | lower | replace(' ', '_') }}"
5.3 動態變量
從命令獲取變量值:
- name: 獲取最新版本號command: curl -s https://api.github.com/repos/foo/bar/releases/latestregister: releasechanged_when: false- set_fact:latest_version: "{{ release.stdout | from_json | json_query('tag_name') }}"
六、安全變量管理
6.1 Ansible Vault 加密
# 創建加密文件
ansible-vault create vars/secrets.yml# 編輯加密文件
ansible-vault edit vars/secrets.yml# 運行Playbook時解密
ansible-playbook site.yml --ask-vault-pass
6.2 加密變量示例
# vars/secrets.yml
db_password: !vault |$ANSIBLE_VAULT;1.1;AES256663864396532363364626265666530633361646239663038633737346...
七、變量調試技巧
7.1 查看所有變量
# vars/secrets.yml
db_password: !vault |$ANSIBLE_VAULT;1.1;AES256663864396532363364626265666530633361646239663038633737346...
7.2 特定變量檢查
- debug:var: hostvars[inventory_hostname]
7.3 變量類型檢查
- debug:msg: "{{ some_var | type_debug }}"
八、最佳實踐
命名規范:
使用小寫和下劃線:
app_port
而非appPort
避免特殊字符和空格
結構設計:
inventory/production/group_vars/all.ymlweb.ymlhost_vars/web1.ymlvars/common.ymlsecrets.yml
文檔注釋:
# 數據庫連接配置 db:host: "db.example.com" # 主數據庫服務器port: 5432 # 默認PostgreSQL端口
版本控制:
將變量文件納入版本控制
敏感數據使用Vault加密后提交
九、實戰案例
9.1 多環境配置管理
# inventory/
# production/
# group_vars/all.yml
env: production
db_host: db-prod.example.com# staging/
# group_vars/all.yml
env: staging
db_host: db-stage.example.com
9.2 條件變量應用
- name: 配置防火墻firewalld:port: "{{ item.port }}/tcp"state: enabledpermanent: yesloop: "{{ firewall_rules | default([]) }}"when: firewall_enabled | default(true)
9.3 變量繼承示例
# roles/common/defaults/main.yml
package_version: "1.0.0"# playbook.yml
- hosts: allroles:- role: commonvars:package_version: "2.0.0" # 覆蓋默認值
六:Ansible 機密管理
Ansible可能需要訪問密碼或API密鑰等敏感數據,以便能配置受管主機。通常,此信息可能以純文本形式存儲在清單變量或其他Ansible文件中。但若如此,任何有權訪問Ansible文件的用戶或存儲這些Ansible文件的版本控制系統都能夠訪問此敏感數據。這顯示存在安全風險。
Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的結構化數據文件。若要使用Ansible Vault,可通過一個名為ansible-vault的命令行工具創建、編輯、加密、解密和查看文件。Ansible Vault可以加密任何由Ansible使用的結構化數據文件。這可能包括清單變量、playbook中含有的變量文件、在執行playbook時作為參數傳遞的變量文件,或者Ansible角色中定義的變量。
1.1 Ansible Vault 基礎
加密原理
Ansible Vault 使用 AES-256 對稱加密算法保護敏感數據,通過密碼或密鑰文件進行加解密。
基本操作命令
# 創建加密文件
ansible-vault create secrets.yml# 編輯加密文件
ansible-vault edit secrets.yml# 查看加密文件
ansible-vault view secrets.yml# 加密現有文件
ansible-vault encrypt existing.yml# 解密文件
ansible-vault decrypt secrets.yml --output=plaintext.yml
1.2 高級加密技術
變量文件加密
# 創建加密文件
ansible-vault create secrets.yml# 編輯加密文件
ansible-vault edit secrets.yml# 查看加密文件
ansible-vault view secrets.yml# 加密現有文件
ansible-vault encrypt existing.yml# 解密文件
ansible-vault decrypt secrets.yml --output=plaintext.yml
Playbook 中引用加密變量
- hosts: db_serversvars_files:- group_vars/prod/vault.ymltasks:- name: 配置數據庫密碼mysql_user:name: app_userpassword: "{{ db_password }}"
1.3 多密碼管理
密碼文件使用
# 創建密碼文件
echo "myvaultpassword" > ~/.vault_pass.txt
chmod 600 ~/.vault_pass.txt# 使用密碼文件
ansible-playbook site.yml --vault-password-file ~/.vault_pass.txt
不同環境不同密碼
# ansible.cfg 配置
[vault]
vault_password_file = dev@~/.vault_pass_dev.txt
vault_password_file = prod@~/.vault_pass_prod.txt
1.4 最佳安全實踐
密碼輪換:定期更改Vault密碼
ansible-vault rekey secrets.yml
最小權限原則:按角色分配訪問權限
# 在playbook中條件加載 vars_files:- "vars/{{ env }}/vault.yml"
七:Ansible Facts
Ansible事實是Ansible在受管主機上自動檢測到的變量。事實中包含有與主機相關的信息,可以像play中的常規變量、條件、循環或依賴于從受管主機收集的值的任何其他語句那樣使用。
為受管主機收集的一些事實可能包括:
主機名稱
內核版本
網絡接口
IP地址
操作系統版本
各種環境變量
CPU數量
提供的或可用的內存
可用磁盤空間
借助事實,可以方便地檢索受管主機的狀態,并根據該狀態確定要執行的操作。例如:
可以根據含有受管主機當前內核版本的事實運行條件任務,以此來重啟服務器
可以根據通過事實報告的可用內存來自定義MySQL配置文件
可以根據事實的值設置配置文件中使用的IPv4地址
通常,每個play在執行第一個任務之前會先自動運行setup模塊來收集事實。
查看為受管主機收集的事實的一種方式是,運行一個收集事實并使用debug模塊顯示ansible_facts變量值的簡短playbook
1 Facts 系統架構
收集流程
通過
setup
模塊連接目標主機執行Python腳本收集系統信息
返回結構化JSON數據
核心組件
Gatherers:特定類型數據的收集器
Cache:事實緩存系統(JSON文件、Redis等)
Custom Facts:用戶自定義的
.fact
文件
2 Facts 分類與應用
系統基礎信息
- debug:msg: |主機名: {{ ansible_hostname }}操作系統: {{ ansible_distribution }} {{ ansible_distribution_version }}內核版本: {{ ansible_kernel }}處理器架構: {{ ansible_architecture }}
網絡配置
- name: 顯示所有IP地址debug:var: ansible_all_ipv4_addresses- name: 主網絡接口debug:msg: "主接口: {{ ansible_default_ipv4.interface }}"
存儲信息
- name: 顯示磁盤空間debug:msg: "根分區可用空間: {{ ansible_mounts | json_query('[?mount==`/`].size_available') }} bytes"- name: 列出所有塊設備debug:var: ansible_devices
3 高級 Facts 技術
條件收集
- hosts: webserversgather_facts: true # 默認開啟tasks:- name: 僅收集網絡factssetup:gather_subset:- network- !hardware # 排除硬件信息
自定義 Facts
在目標主機創建:
# /etc/ansible/facts.d/appinfo.fact
[deployment]
version=2.3.1
environment=production
在Playbook中使用:
- debug:var: ansible_local.appinfo.deployment
Facts 緩存配置
# ansible.cfg
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts
fact_caching_timeout = 86400 # 24小時
4 Facts 性能優化
增量收集:
- setup:filter: "ansible_distribution*"
并行收集:
ansible-playbook -f 10 site.yml # 10個并行進程
緩存策略:
# ansible.cfg [defaults] fact_caching = redis fact_caching_timeout = 3600