Ansible的使用2

#### 一、Ansible變量

##### facts變量

> facts組件是Ansible用于采集被控節點機器的設備信息,比如IP地址、操作系統、以太網設備、mac 地址、時間/日期相關數據,硬件信息等

- setup模塊
? - 用于獲取所有facts信息

```shell
## 常用參數
?? ?filter:用于過濾指定信息

# 通過setup模塊查看所有facts信息
ansible web1 -m setup

# facts變量是一個由龐大的{}構成的鍵值字典
# 在{}中,有很多層級的嵌套。可以通過參數過濾出第一個層級的內容
ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses"
ansible webservers -m setup -a "filter=ansible_bios_version"
ansible webservers -m setup -a "filter=ansible_memtotal_mb"
ansible webservers -m setup -a "filter=ansible_hostname"
ansible webservers -m setup -a "filter=ansible_mem*"
ansible web1 -m setup > facts.txt; awk -F: '/mb/{print}' facts.txt
```

- debug模塊
? - 用于基本中使用facts變量打印變量信息
? - 默認有Gathering Facts任務,收集到Facts信息后可以使用該模塊打印
? - 調用變量格式:{{ 變量名 }}

```shell
## 常用參數
? ? msg:打印變量值,格式為:{{ 變量名 }}
? ? var:打印變量值,格式為:變量名

- name: test debug
? hosts: webservers
? tasks:
? ? - name: test debug msg
? ? ? debug:
? ? ? ? msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}}"

- name: test debug
? hosts: webservers
? tasks:
? ? - name: test debug var
? ? ? debug:
? ? ? ? var: ansible_hostname, ansible_bios_version
```

##### 自定義變量

- 通過變量的使用可以讓劇本更加靈活,多次運行劇本只需要調整對應變量名即可
- Ansible支持十幾種變量定義方式
- Ansible變量定義的位置,下列變量優先級從低到高
? - role defaults :roles defaults目錄下的變量
? - inventory vars:inventory文件中定義的變量
? - inventory group_vars:inventory文件組的變量
? - inventory host_vars:inventory文件主機的變量
? - playbook group_vars:劇本中組的變量
? - playbook host_vars:劇本中主機的變量
? - host facts:事實變量
? - play vars:vars定義的變量
? - play vars_prompt:vars_prompt定義的變量
? - play vars_files:vars_files導入的變量
? - registered vars:注冊變量
? - role and include vars:roles中單獨定義的及導入的變量
? - block vars (only for tasks in block):block中定義的變量
? - task vars (only for the task):任務中定義的變量
? - extra vars (always win precedence):命令行指定的變量

- Ansible變量定義的分類

? - 節點變量

? ```shell
? ## 在inventory文件中定義變量
? [webservers]
? web[1:2]
??
? [dbs]
? db1 username="natasha" ? #定義屬于db1主機的變量
? ……
??
? ## 定義變量在Playbook中的使用
? - name: create user with host vars
? ? hosts: db1
? ? tasks:
? ? ? - name: test host vars
? ? ? ? user:
? ? ? ? ? name: "{{ username }}"
? ? ? ? ? state: present
? ```

? - 組變量

? ```shell
? ## 在inventory文件中定義變量
? [webservers]
? web[1:2]
??
? ……
??
? #定義屬于組的變量,:vars是固定格式
? [webservers:vars]
? username="natasha"
??
? ## 定義變量在Playbook中的使用
? - name: create user with group vars
? ? hosts: webservers
? ? tasks:
? ? ? - name: test group vars
? ? ? ? user:
? ? ? ? ? name: "{{ username }}"
? ? ? ? ? state: present
? ```

? - 劇本變量

? ```shell
? ## Playbook中定義變量
? - name: create user with play vars
? ? hosts: webservers
? ? vars: ? ? ? ? ? ? ? ? ? ? #劇本中定義變量
? ? ? username: "natasha"?? ??? ?#定義變量
? ? ? password: "123456" ? ? ?#定義變量,數字作為密碼必須用引號,表示字符串
? ? tasks:
? ? ? - name: test play vars
? ? ? ? user:
? ? ? ? ? name: "{{ username }}"
? ? ? ? ? password: "{{ password|password_hash('sha512')}}"
? ? ? ? ? state: present
? ```

? - 文件變量

```shell
# 變量文件創建一個fvars.yml文件
username: "natasha"
password: "654321"

## 定義變量文件在Playbook中的使用
- name: create user with vars files
? hosts: db1
? vars_files: fvars.yml ? ? #調用定義變量的文件
? tasks:
? ? - name: test vars file
? ? ? user:
? ? ? ? name: "{{ username }}"
? ? ? ? password: "{{ password | password_hash('sha512')}}"
? ? ? ? state: present
```

##### 調用Facts變量信息收集

```shell
# 一定要開啟Facts信息收集,gather_facts: yes
- name: copy file with facts
? hosts: webservers
? tasks:
? ? - name: use facts
? ? ? copy:
? ? ? ?? ?#加\n換行,顯示兩條信息
? ? ? ? content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
? ? ? ? dest: /tmp/facts.txt

# 驗證收集
ansible webservers -a "cat /tmp/facts.txt"
```

##### Ansible補充模塊

- Firewalld模塊
? - 該模塊用于配置firewalld防火墻規則(默認拒絕訪問),對于明確允許的服務設置放行操作
? - 無論服務是否有名字,最終都基于TCP或UDP的端口,比如http服務基于TCP80端口。服務名和端口號對應關系的說明文件位于:/etc/services

```shell
## 常用參數
? ? port:聲明放行端口與通信類型
? ? permanent:永久生效,但不會立即生效
? ? immediate:立即生效,臨時生效
? ? state:enabled,放行;disabled拒絕

# 在webservers主機組安裝nginx軟件、啟動服務
- name: test firewalld
? hosts: webservers
? tasks:
? ? - name: install nginx
? ? ? yum:
? ? ? ? name: nginx
? ? ? ? state: present

? ? - name: start nginx
? ? ? service:
? ? ? ? name: nginx
? ? ? ? state: started
? ? ? ? enabled: true
curl -I http://web1;curl -I http://web2?? ??? ?#測試訪問

# 在webservers主機組安裝firewalld防火墻軟件、啟動服務并訪問測試
- name: test firewalld
? hosts: webservers
? tasks:
?? ?...
? ? - name: install firewalld
? ? ? yum:
? ? ? ? name: firewalld
? ? ? ? state: present

? ? - name: start firewalld
? ? ? service:
? ? ? ? name: firewalld
? ? ? ? state: started
? ? ? ? enabled: true

# 設置防火墻放行http訪問
- name: test firewalld
? hosts: webservers
? tasks:
? ?? ?...
? ? - name: allow http
? ? ? firewalld:
? ? ? ? port: 80/tcp
? ? ? ? permanent: true
? ? ? ? immediate: true
? ? ? ? state: enabled
```

- Template模塊
? - 用于上傳具備特殊格式的文件(如文件中包含變量),文件的語法叫Jinja2
? - 被控節點接收到文件時,模板文件中的變量名會被替換成具體的值
? - 相比于copy模塊更加靈活

```shell
## 常用參數
? ? src:要上傳的文件
? ? dest:目標文件路徑

# 通過facts變量找到被控節點對應ip的變量
# 創建index.html.j2文件將變量對號入座,主機名對應hostname,ip地址對應address
Welcome to {{ ansible_hostname }} on {{ ansible_eth0.ipv4.address }}

- name: upload index
? hosts: webservers
? tasks:
? ? - name: create web index
? ? ? template:
? ? ? ? src: index.html.j2
? ? ? ? dest: /usr/share/nginx/html/index.html
```

#### 二、PlayBook進階語法

##### 錯誤處理機制

> 當Playbook中有多個task時,其中某個任務執行過程中失敗則后續任務將被終止執行
>
> 使用ignore_errors對可能出現錯誤的task進行忽略處理,可以作用于任務級也可作用于全局級

```shell
# 任務級忽略錯誤
- name: test error task
? hosts: webservers
? tasks:
? ? - name: start mysqld
? ? ? service:?
? ? ? ? name: mysqld
? ? ? ? state: started
? ? ? ? enabled: true
? ? ? ignore_errors: true ? ? ? #任務級

? ? - name: touch file
? ? ? file:
? ? ? ? path: /tmp/mysql.txt
? ? ? ? state: touch

# 全局級忽略錯誤
- name: test error task
? hosts: webservers
? ignore_errors: true ? ? ? #全局級
? tasks:
? ? - name: start mysqld
? ? ? service:?
? ? ? ? name: mysqld
? ? ? ? state: started
? ? ? ? enabled: true

? ? - name: touch file
? ? ? file:
? ? ? ? path: /tmp/mysql.txt
? ? ? ? state: touch
```

##### 觸發執行任務

- 通過handlers定義一組任務
- 僅當某個任務觸發(notify)handlers時才會執行相應任務
- 如果有多個notify觸發執行handlers任務,也僅執行一次
- 僅當任務的執行狀態為changed是handlers任務才執行
- handlers任務在所有其他任務都執行后才執行

```shell
# 獲取nginx配置文件
- name: get nginx config file
? hosts: webservers
? tasks:
? ? - name: fetch nginx config file
? ? ? fetch:
? ? ? ? src: /etc/nginx/nginx.conf
? ? ? ? dest: ./
? ? ? ? flat: yes

# 編輯獲取文件的服務端口,調整為facts變量
vim +39 nginx.conf
...
? ? ? ? listen ? ? ? {{ http_port }} default_server;
? ? ? ? listen ? ? ? [::]:{{http_port}} default_server;
...

# 修改nginx服務端口為8000并重啟服務
- name: configure nginx
? hosts: webservers
? vars:
? ? http_port: 8000
? tasks:
? ? - name: upload nginx.conf
? ? ? template:
? ? ? ? src: nginx.conf
? ? ? ? dest: /etc/nginx/nginx.conf

? ? - name: restart nginx
? ? ? service:
? ? ? ? name: nginx
? ? ? ? state: restarted

######執行上條命令,修改文件并重啟服務,第二次執行命令,未修改文件但重啟服務
# 實現目標:只有修改了配置文件才會重啟服務
# 加入handlers觸發器
- name: configure nginx
? hosts: webservers
? vars:
? ? http_port: 80
? tasks:
? ? - name: upload nginx.conf
? ? ? template:
? ? ? ? src: nginx.conf
? ? ? ? dest: /etc/nginx/nginx.conf
? ? ? notify: restart nginx service ? ? #任務狀態為changed時觸發指定任務執行

? handlers:
? ? - name: restart nginx service
? ? ? service:
? ? ? ? name: nginx
? ? ? ? state: restarted

####!!!!!注意notify與handlers的name要一致否則回報錯
ERROR! The requested handler 'restart nginx service' was not found in either the main handlers list nor in the listening handlers list
```

##### when條件判斷

- 滿足條件時才執行任務,多任務使用and或or進行連接,表達邏輯關系
- when表達式中的變量不需要使用{{}}

```shell
## 常用操作符
? ? ==:相等
? ? !=:不等
? ? >:大于
? ? <:小于
? ? <=:小于等于
? ? >=:大于等于

# 單條件測試:當目標主機內存至少4G時安裝MySQL軟件
- name: test when
? hosts: dbs
? tasks:
? ? - name: install mysql soft
? ? ? yum:
? ? ? ? name: mysql-server
? ? ? ? state: present
? ? ? when:
? ? ? ? ansible_memtotal_mb >= 4096

# 多條件測試:當目標主機系統為Rocky8時發送文件,/etc/motd是用戶登錄時屏幕顯示的內容
- name: test when
? hosts: webservers
? tasks:
? ? - name: modify /etc/motd
? ? ? copy:?
? ? ? ? src: motd
? ? ? ? dest: /etc/motd
? ? ? when: > ? #多條件合并成1行
? ? ? ? ansible_distribution == "Rocky"
? ? ? ? and
? ? ? ? ansible_distribution_major_version == "8"
```

##### register注冊變量

- register用于捕獲和保存任務執行結果,它允許將其他任務的輸出作為變量使用
- register也是一個關鍵字,可以將任務執行的結果賦值給指定的變量名稱,并在后續任務中使用
- register可以捕獲各種類型的輸出,包括stdout、stderr、rc、changed等并與其他模塊一起使用,例如"when"條件、"loop"循環等

```shell
# 在web1主機執行創建/tmp/reg1.txt,捕獲命令執行結果并打印
- name: test register
? hosts: web1
? tasks:
? ? - name: create file
? ? ? file:
? ? ? ? path: /tmp/reg1.txt
? ? ? ? state: touch
? ? ? register: result

? ? - name: display result
? ? ? debug:
? ? ? ? msg: "{{result}}"?

# 在web1主機上執行任務,創建文件/tmp/abcdemo/abc。如果創建不成功,則通過debug輸出create failed
- name: test register
? hosts: web1
? ignore_errors: true ? #如果不忽略則任務2無法執行
? tasks:
? ? - name: create file
? ? ? file:
? ? ? ? path: /tmp/abcdemo/abc
? ? ? ? state: touch
? ? ? register: result

? ? - name: debug out
? ? ? debug:
? ? ? ? msg: "create failed"
? ? ? when: result.failed
```

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

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

相關文章

多模態大語言模型arxiv論文略讀(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文標題&#xff1a;FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ?? 論文作者&#xff1a;Zhen Wang, Da Li, Yulin Su, Min Yang,…

MySQL深入

體系結構 連接層&#xff1a;主要處理客戶端的連接進行授權認證、校驗權限等相關操作 服務層&#xff1a;如sql的接口、解析、優化在這里完成&#xff0c;所有跨存儲引擎的操作在這里完成 引擎層&#xff1a;索引是在存儲引擎層實現的&#xff0c;所以不同的存儲引擎他的索引…

智能 SQL 優化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速覽 本月更新包含 21項功能增強 和 9項問題修復&#xff0c;重點提升SQL解析精度與優化建議覆蓋率。 一、SQL解析能力擴展 ? 新增SQL語法解析支持 SELECT...INTO TABLE 語法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 語句解析&#…

數組劃分使元素總和最接近

0劃分 - 藍橋云課 將一個數組劃分為兩個元素總和最接近的兩個數組 要使得兩組權值的乘積最大&#xff0c;根據數學原理&#xff0c;當兩組權值越接近時&#xff0c;它們的乘積就越大。因此&#xff0c;可以將這個問題轉化為一個 0 - 1 背包問題&#xff0c;把所有數的總和的一…

多線程代碼案例(線程池)- 4

目錄 引入 標準庫中的線程池 -- ThreadPoolExecutor 研究一下這個方法的幾個參數 1. int corePoolSize 2. int maximumPoolSize 3. long keepAliveTime 4. TimeUnit unit 5. BolckingQueue workQueue 6. ThreadFactory threadFactory 7. RejectedExecutionHandler h…

C,C++,C#

C、C 和 C# 是三種不同的編程語言&#xff0c;雖然它們名稱相似&#xff0c;但在設計目標、語法特性、運行環境和應用場景上有顯著區別。以下是它們的核心區別&#xff1a; 1. 設計目標和歷史 語言誕生時間設計目標特點C1972&#xff08;貝爾實驗室&#xff09;面向過程&#…

nginx 代理 https 接口

代碼中需要真實訪問的接口是&#xff1a;https://sdk2.028lk.com/application-localizationdev.yml文件中配置&#xff1a; url: http:/111.34.80.138:18100/sdk2.028lk.com/該服務器111.34.80.138上 18100端口監聽&#xff0c;配置信息為&#xff1a; location /sdk2.028lk.c…

數據結構實驗3.1:順序棧的基本操作與進制轉換

文章目錄 一&#xff0c;問題描述二&#xff0c;基本要求三&#xff0c;算法分析四&#xff0c;示例代碼五&#xff0c;實驗操作六&#xff0c;運行效果 一&#xff0c;問題描述 在數據處理中&#xff0c;常常會遇到需要對鏈接存儲的線性表進行操作的情況。本次任務聚焦于將鏈…

經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現

目錄 經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現一、引言二、經典頻域分析方法的基本原理2.1 Bode 圖分析2.2 Nyquist 判據三、數學建模與公式推導3.1 一階系統的頻域響應3.2 多極系統的 Bode 圖繪制3.3 Nyquist 判據的數學描述四、經典頻域分析…

Vue知識點(5)-- 動畫

CSS 動畫是 Vue3 中實現組件動畫效果的高效方式&#xff0c;主要通過 CSS transitions 和 keyframes 動畫 CSS Keyframes&#xff08;關鍵幀動畫&#xff09; 用來創建復雜的動畫序列&#xff0c;可以精確控制動畫的各個階段。 核心語法&#xff1a; keyframes animationNa…

小型園區網實驗

劃分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool 本篇摘要16. 使用LangChain Agents構建Gradio及Gradio Tool16.6 創建自己的GradioTool16.6.1 創建步驟16.6.2 創建示例StableDiffusionTool參考文獻本章目錄如下: 《使用LangChain Agents構建Grad…

SDL顯示YUV視頻

文章目錄 1. **宏定義和初始化**2. **全局變量**3. **refresh_video_timer 函數**4. **WinMain 函數**主要功能及工作流程&#xff1a;總結&#xff1a; 1. 宏定義和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 請求畫面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基礎教學:隨機抽取花名冊,不能重復

一.核心代碼: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["張三", &quo…

軟考 系統架構設計師系列知識點 —— 設計模式之抽象工廠模式

本文內容參考&#xff1a; 軟考 系統架構設計師系列知識點之設計模式&#xff08;2&#xff09;_系統架構設計師中考設計模式嗎-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致謝&#xff01; Abstract Fac…

P2040 打開所有的燈

題目背景 pmshz在玩一個益(ruo)智(zhi)的小游戲&#xff0c;目的是打開九盞燈所有的燈&#xff0c;這樣的游戲難倒了pmshz。。。 題目描述 這個燈很奇(fan)怪(ren)&#xff0c;點一下就會將這個燈和其周圍四盞燈的開關狀態全部改變。現在你的任務就是就是告訴pmshz要全部打開…

漢得企業級 PaaS 平臺 H-ZERO 1.12.0 發布!四大維度升級,構建企業數字化新底座

漢得企業級 PaaS 平臺&#xff08;以下簡稱"H-ZERO"&#xff09;是一款基于微服務架構的企業級數字化 PaaS 平臺&#xff0c;可支持企業各類系統搭建、產品研發&#xff0c;幫助企業快速構架技術中臺。 H-ZERO于2025年3月底正式發布 V1.12.0 &#xff0c;此次發布聚…

ReplicaSet、Deployment功能是怎么實現的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的關鍵對象。它們各自的功能和實現機制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;確保指定數量的 Pod 副本一直在運行。如果有 Pod 副本崩潰或被刪除&#xff0c;ReplicaSet 會…

物聯網外設管理服務平臺

1 開發目標 1.1 架構圖 操作系統&#xff1a;基于Linux5.10.10源碼和STM32MP157開發板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驅動層&#xff1a;為每個外設配置DTS并且單獨封裝外設驅動模塊。其中電壓ADC測試&#xff0c;采用linux內核…

PyTorch教程:如何讀寫張量與模型參數

本文演示了PyTorch中張量&#xff08;Tensor&#xff09;和模型參數的保存與加載方法&#xff0c;并提供完整的代碼示例及輸出結果&#xff0c;幫助讀者快速掌握數據持久化的核心操作。 1. 保存和加載單個張量 通過torch.save和torch.load可以直接保存和讀取張量。 import to…