認識ansible(入門)

什么是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 核心組成部分

  1. name: Playbook 或任務的描述性名稱

  2. hosts: 指定在哪些主機/組上運行

  3. become: 是否使用特權升級(sudo等)

  4. vars: 定義變量

  5. 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. 最佳實踐

  1. 保持冪等性:確保Playbook可以安全重復運行

  2. 使用標簽:為任務添加標簽便于選擇性運行

    tasks:- name: 安裝軟件yum: name=nginxtags: install

    運行:ansible-playbook site.yml --tags "install"

  3. 變量分層

    • defaults/ (最低優先級)

    • group_vars/

    • host_vars/

    • Playbook vars

    • 命令行-e傳遞變量 (最高優先級)

  4. 加密敏感數據

    ansible-vault create secrets.yml

    使用:

    vars_files:- secrets.yml

  5. 測試與驗證

    • --check?干跑模式

    • --diff?顯示變更

    • --step?逐步執行

8. 調試技巧

  1. 使用debug模塊:

    - debug:var: hostvars[inventory_hostname]

  2. 增加詳細輸出:

    ansible-playbook playbook.yml -vvv

  3. 注冊變量檢查:

    - command: ls /tmpregister: result
    - debug:var: result

總結

Ansible Playbook 提供了強大的自動化能力,通過:

  1. YAML結構化:清晰定義自動化流程

  2. 模塊化設計:使用各種模塊完成具體任務

  3. 變量系統:實現靈活配置

  4. 條件控制:處理復雜邏輯

  5. 錯誤處理:保證可靠性

  6. 角色組織:提高復用性

五: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 完整優先級順序(從低到高)

  1. 命令行-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 }}"

八、最佳實踐

  1. 命名規范

    • 使用小寫和下劃線:app_port而非appPort

    • 避免特殊字符和空格

  2. 結構設計

    inventory/production/group_vars/all.ymlweb.ymlhost_vars/web1.ymlvars/common.ymlsecrets.yml

  3. 文檔注釋

    # 數據庫連接配置
    db:host: "db.example.com"  # 主數據庫服務器port: 5432             # 默認PostgreSQL端口

  4. 版本控制

    • 將變量文件納入版本控制

    • 敏感數據使用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 最佳安全實踐

  1. 密碼輪換:定期更改Vault密碼

    ansible-vault rekey secrets.yml

  2. 最小權限原則:按角色分配訪問權限

    # 在playbook中條件加載
    vars_files:- "vars/{{ env }}/vault.yml"

七:Ansible Facts

Ansible事實是Ansible在受管主機上自動檢測到的變量。事實中包含有與主機相關的信息,可以像play中的常規變量、條件、循環或依賴于從受管主機收集的值的任何其他語句那樣使用。

為受管主機收集的一些事實可能包括:

主機名稱
內核版本
網絡接口
IP地址
操作系統版本
各種環境變量
CPU數量
提供的或可用的內存
可用磁盤空間
借助事實,可以方便地檢索受管主機的狀態,并根據該狀態確定要執行的操作。例如:

可以根據含有受管主機當前內核版本的事實運行條件任務,以此來重啟服務器
可以根據通過事實報告的可用內存來自定義MySQL配置文件
可以根據事實的值設置配置文件中使用的IPv4地址
通常,每個play在執行第一個任務之前會先自動運行setup模塊來收集事實。

查看為受管主機收集的事實的一種方式是,運行一個收集事實并使用debug模塊顯示ansible_facts變量值的簡短playbook

1 Facts 系統架構

收集流程
  1. 通過setup模塊連接目標主機

  2. 執行Python腳本收集系統信息

  3. 返回結構化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 性能優化

  1. 增量收集

    - setup:filter: "ansible_distribution*"

  2. 并行收集

    ansible-playbook -f 10 site.yml  # 10個并行進程

  3. 緩存策略

    # ansible.cfg
    [defaults]
    fact_caching = redis
    fact_caching_timeout = 3600

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

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

相關文章

Apache Ignite 關于 **Executor Service(執行器服務)** 的介紹

這段內容是 Apache Ignite 關于 Executor Service&#xff08;執行器服務&#xff09; 的介紹。我們可以把它理解為&#xff1a;一個分布式的“線程池”&#xff0c;可以把任務分發到集群中的多個節點上去執行。 下面我用通俗易懂的方式幫你徹底理解這個概念。&#x1f310; 什…

應用Builder模式在C++中進行復雜對象構建

引言 在軟件開發中&#xff0c;構建復雜對象時常常會遇到構造函數或setter方法過于復雜的情況。Builder模式作為一種創建型設計模式&#xff0c;能夠有效地解決這一問題。Guoyao 創建的勇勇(YongYong)角色&#xff0c;通過Builder模式實現了對復雜對象的構建過程與表示的分離&a…

gradio作為原型工具

存在的問題&#xff0c;頁面的展示和value不是同一個值的問題&#xff0c;比如說選中了北京&#xff0c;但實際上后端想要的是110000地區碼。 在實際開發中&#xff0c;前端展示給用戶的是可讀的地區名稱&#xff08;如“北京”&#xff09;&#xff0c;而背后處理時通常需要的…

計算聲子譜

準備的還是vasp的必備文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代碼可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…

深度學習 目標檢測常見指標和yolov1分析

目錄 一、常見指標 1、IoU 2、Confidence置信度 3、精準度和召回率 4、mAP 5、NMS方法 6、檢測速度 前傳耗時 FPS 7、FLOPs 二、YOLOv1 檢測流程 1、圖像網格劃分 2、類別預測 3、輸出張量 損失函數 優點 缺點 如題&#xff0c;這篇介紹一下目標檢測中常見的…

31. 偽類和偽元素區別

總結 選擇對象不同內容說明偽類作用對象元素的狀態或位置偽元素作用對象元素的一部分內容或虛擬內容是否新增節點均不新增節點常用符號:&#xff08;偽類&#xff09;、::&#xff08;偽元素&#xff09;推薦場景偽類用于交互與狀態控制&#xff1b;偽元素用于樣式修飾與內容插…

ChatGPT、Playground手動模擬Agent摘要緩沖混合記憶功能

01. 摘要緩沖混合記憶 摘要緩沖混合記憶中&#xff0c;所需的模塊有&#xff1a; chat_message_history&#xff1a;存儲歷史消息列表。moving_summary_buffer&#xff1a;移除消息的匯總字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;…

全國青少年信息素養大賽(無人飛行器主題賽(星際迷航)游記)

作者 FHD_WOLF 發布時間 2025-07-30 21:31 分類 生活游記 騎你的 白馬啊 行你欲行的路 風吹來 花落涂 點一欉香祈求 ---------萬千花蕊慈母悲哀從考場出來&#xff0c;剩下的只有無盡極樂 考前準備&#xff1a; 1.電腦充電。 &#xff08;這個賽項需要自帶設備&#x…

Kubernetes (K8s) 部署資源的完整配置OceanBase

Kubernetes Deployment 配置&#xff08;oceanbase-deployment.yaml&#xff09; # oceanbase-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: oceanbase-deployment spec:replicas: 1selector:matchLabels:app: oceanbasetemplate:metadata:labels:app…

ACS-電機控制Buffer-任意路徑規劃(PVSPLINE繪制圓形)

該程序是一個雙軸運動&#xff0c;繪制圓形 原始程序&#xff08;可以直接使用&#xff09; GLOBAL INT X1,Y1,ii GLOBAL REAL MY_ARRAY(4)(12) GLOBAL REAL piX1 0; Y1 1 ! Axis assignment pi ACOS(-1) ! Shortcut for generating piii 0 LOOP 12MY_ARRAY(0)(ii) COS(…

MongoDB Change Streams 實時數據變更流處理實戰指南

MongoDB Change Streams 實時數據變更流處理實戰指南 業務場景描述 在大型電商平臺或高并發的在線系統中&#xff0c;業務數據的變更&#xff08;如訂單狀態、庫存變動、用戶行為日志&#xff09;需要實時通知下游系統&#xff0c;以便做流式分析、緩存更新或消息推送。傳統的輪…

TIME WEAVER: A Conditional Time Series Generation Model論文閱讀筆記

TIME WEAVER: A Conditional Time Series Generation Model 摘要 想象一下&#xff0c;根據天氣、電動汽車的存在和位置生成一個城市的電力需求模式&#xff0c;這可以用于在冬季凍結期間進行容量規劃。這樣的真實世界的時間序列通常包含配對的異構上下文元數據&#xff08;天氣…

Day 4-2: PyTorch基礎入門 - 從NumPy到深度學習的橋梁

Day 4-2: PyTorch基礎入門 - 從NumPy到深度學習的橋梁 ?? 核心概念(5分鐘理解) 一句話定義 PyTorch是Facebook開發的深度學習框架,將NumPy的數組計算能力擴展到GPU,并加入了自動微分功能,讓構建和訓練神經網絡變得簡單直觀。 為什么重要 GPU加速:比CPU快10-100倍的矩…

法式基因音響品牌SK(SINGKING AUDIO)如何以硬核科技重塑專業音頻版圖

在專業音響的競技場&#xff0c;當多數品牌還在功率參數上纏斗時&#xff0c;一個流淌著法蘭西血液的品牌——SK&#xff08;SINGKING AUDIO&#xff09;&#xff0c;早已構建起令人仰望的技術巔峰。它完美詮釋了真正的聲學藝術&#xff1a;不是技術的炫耀&#xff0c;而是讓尖…

ZooKeeper學習專欄(五):Java客戶端開發(原生API)詳解

文章目錄前言一、核心類解析1.1 ZooKeeper類 - 連接管理核心1.2 Watcher接口 - 事件處理核心二、原生API實踐2.1 創建會話&#xff08;連接管理&#xff09;2.2 創建節點&#xff08;支持多種類型&#xff09;2.3 獲取節點數據和狀態信息2.4 修改節點數據&#xff08;版本控制&…

卸油管鏈接檢測誤報率↓76%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與商用。一、行業痛點&#xff1a;卸油管鏈接檢測的三大技術瓶頸在石化倉儲與運輸場景中&#xff0c;卸油管鏈接的密封性檢測是保障安全生產的關鍵環節。…

MongoDB用戶認證authSource

文章目錄authSource遇到的問題authSource MongoDB用戶認證邏輯與以往我認知的關系型數據庫邏輯不太一樣&#xff0c;多了一層用戶與數據庫關系的綁定。 在建立用戶時&#xff0c;需要先指定數據庫&#xff0c;則存在一個概念&#xff1a;用戶歸屬于數據庫。額外&#xff0c;依…

插件升級:Chat/Builder 合并,支持自定義 Agent、MCP、Rules

TRAE 插件全新升級&#xff0c;Chat、Builder 合并&#xff0c;支持自定義智能體、MCP 及自定義規則&#xff0c;體驗對齊 IDE&#xff0c;現已上線 JetBrains 和 VSCode。 1. Chat/Builder 合并&#xff0c;一個對話框即可智能協作 在 TRAE 插件的 Chat 對話框中&#xff0…

【歷史人物】【王安石】簡歷與生平

目錄 一、王安石個人簡歷 二、個人主要經歷 三、個人成就及影響 1、散文 2、詩歌 3、詞 四、經典評價摘錄 一、王安石個人簡歷 基本信息? 姓名&#xff1a;王安石&#xff0c;字介甫&#xff0c;號半山。小名獾郎 性別&#xff1a;男 年齡&#xff1a;1021年-1086年…

Codeforces Round 1040 (Div. 2) A - D題詳細題解

本文為Codeforces Round 1040 (Div. 2) A - D題的詳細題解, 覺得有幫助或者寫的不錯可以點個贊&#xff01; 目錄 題目A: 題目大意: 解題思路: 代碼(C): 題目B: 題目大意: 解題思路: 代碼(C): 題目C: 題目大意: 解題思路: 代碼(C): 題目D: 題目大意: 解題思路:…