自動化運維工具Ansible之Tests測驗詳解

来源:https://www.cnblogs.com/zhanglianghhh/archive/2020/05/07/12846711.html
-Advertisement-
Play Games

Ansible Tests 詳解與使用案例 主機規劃 添加用戶賬號 說明: 1、 運維人員使用的登錄賬號; 2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放; 3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun ...


 

Ansible Tests 詳解與使用案例

 

主機規劃

 

添加用戶賬號

說明:

1、 運維人員使用的登錄賬號;

2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放;

3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun 用戶也進行了 sudo 提權)。

1 # 使用一個專門的用戶,避免直接使用root用戶
2 # 添加用戶、指定家目錄並指定用戶密碼
3 # sudo提權
4 # 讓其它普通用戶可以進入該目錄查看信息
5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
6 echo "yun  ALL=(ALL)       NOPASSWD: ALL" >>  /etc/sudoers
7 chmod 755 /app/

 

Ansible 配置清單Inventory

之後文章都是如下主機配置清單

 1 [yun@ansi-manager ansible_info]$ pwd
 2 /app/ansible_info
 3 [yun@ansi-manager ansible_info]$ cat hosts_key 
 4 # 方式1、主機 + 埠 + 密鑰
 5 [manageservers]
 6 172.16.1.180:22
 7 
 8 [proxyservers]
 9 172.16.1.18[1:2]:22
10 
11 # 方式2:別名 + 主機 + 埠 + 密碼
12 [webservers]
13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22

 

Tests 概述

Tests 在 Jinja 中是一種評估模板表達式,並最終返回 True 或 False。Jinja 中就有自帶的 Tests 清單,具體地址如下:

http://docs.jinkan.org/docs/jinja2/templates.html#builtin-tests

 

tests 和 filters 的主要區別在於Jinja tests 用於比較,而 filters 用於數據操作,兩者在Jinja中有不同的應用。

與所有模板一樣,tests 總是在 Ansible 控制機上執行,而不是在任務的目標機上,因為它們測驗本地數據。

除了 Jinja2 tests 之外,Ansible還提供了一些 tests,用戶也可以輕鬆創建自己的 tests。

測驗字元串

若要將字元串與子字元串或正則表達式匹配,請使用「match」、「search」或「regex」過濾。

match:必須有開頭匹配

search:子串匹配

regex:正則匹配

示例:

 1 [yun@ansi-manager ansi_tests]$ pwd
 2 /app/ansible_info/ansi_tests
 3 [yun@ansi-manager ansi_tests]$ cat tests_str.yml 
 4 ---
 5 
 6 - hosts: manageservers
 7   vars:
 8     url: "http://example.com/users/foo/resources/bar"
 9 
10   tasks:
11     - debug:
12         msg: "matched pattern 1-1"
13       when: url is match("http://example.com/users/.*/resources/.*") # True
14 
15     - debug:
16         msg: "matched pattern 1-2"
17       when: url is match("http://example.com") # True
18 
19     - debug:
20         msg: "matched pattern 1-3"
21       when: url is match(".*://example.com") # True
22 
23     - debug:
24         msg: "matched pattern 1-4"
25       when: url is match("example.com/users/.*/resources/.*") # False
26 
27     - debug:
28         msg: "matched pattern 2-1"
29       when: url is search("/users/.*/resources/.*") # True
30 
31     - debug:
32         msg: "matched pattern 2-2"
33       when: url is search("/users/") # True
34 
35     - debug:
36         msg: "matched pattern 2-3"
37       when: url is search("/user/") # False
38 
39     - debug:
40         msg: "matched pattern 3"
41       when: url is regex("example.com/\w+/foo") # True
42 
43 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_str.yml  # 註意查看執行

 

測驗版本比較

使用「version」,用於版本號比較。

「version」接受的運算符如下:

<, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne

 

「version」也可以接受「strict」參數,這個參數預設值為「False」,如果設置為「True」則ansible會進行更嚴格的版本檢查:

{{ sample_version_var is version('1.0', operator='lt', strict=True) }}

 

示例:

 1 # 判斷 ansible_python_version 版本是否 大於等於 2.7.3
 2 [yun@ansi-manager ansi_tests]$ pwd
 3 /app/ansible_info/ansi_tests
 4 [yun@ansi-manager ansi_tests]$ ll
 5 total 8
 6 drwxrwxr-x 2 yun yun  35 Sep 12 15:14 file
 7 -rw-rw-r-- 1 yun yun 209 Sep 12 15:08 tests_version.yml
 8 [yun@ansi-manager ansi_tests]$ cat file/tests_version.conf.j2   # 涉及文件
 9 # Jinja2 版本測驗
10 
11 {% if ansible_python_version is version('2.7.3', '>=') %}
12 result True. ansible_python_version = {{ ansible_python_version }}
13 {% else %}
14 result False
15 {% endif %}
16 
17 [yun@ansi-manager ansi_tests]$ cat tests_version.yml  # 涉及的playbook文件
18 ---
19 # ansible tests Version Comparison
20 
21 - hosts: proxyservers
22 
23   tasks:
24     - name: "Tests Version Comparison"
25       template:
26         src: ./file/tests_version.conf.j2
27         dest: /tmp/tests_version.conf
28 
29 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_version.yml   # 執行

 

測驗子集和超集

關鍵字「superset」和「subset」,用於測驗一個列表是否包含被包含於另一個列表

示例:

 1 [yun@ansi-manager ansi_tests]$ pwd
 2 /app/ansible_info/ansi_tests
 3 [yun@ansi-manager ansi_tests]$ cat tests_set.yml 
 4 ---
 5 # tests 子集和超集
 6 - hosts: manageservers
 7 
 8   vars:
 9     a: [1,2,3,4,5]
10     b: [2,3]
11   tasks:
12     - debug:
13         msg: "A includes B"
14       when: a is superset(b)
15 
16     - debug:
17         msg: "B is included in A"
18       when: b is subset(a)
19 
20 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_set.yml  # 註意查看執行

 

測驗列表真假

關鍵字「all」和「any」,用於檢查列表裡元素的真假,列表中所有為真或者任何一個為真。

all:一假則假

any:一真則真

 

 1 [yun@ansi-manager ansi_tests]$ pwd
 2 /app/ansible_info/ansi_tests
 3 [yun@ansi-manager ansi_tests]$ cat tests_list.yml 
 4 ---
 5 #  tests 測驗 all any
 6 - hosts: manageservers
 7 
 8   vars:
 9     mylist:
10       - 1
11       - "{{ 3 == 3 }}"
12       - True
13     myotherlist:
14       - False
15       - True
16 
17   tasks:
18     - debug:
19         msg: "all are true!"
20       when: mylist is all
21 
22     - debug:
23         msg: "at least one is true"
24       when: myotherlist is any
25 
26 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_list.yml  # 註意查看執行

  

測驗文件或目錄

用於測驗目錄、文件、軟連接、是否已存在、是相對路徑還是絕對路徑等等。

 1 [yun@ansi-manager ansi_tests]$ pwd
 2 /app/ansible_info/ansi_tests
 3 [yun@ansi-manager ansi_tests]$ cat tests_path.yml 
 4 ---
 5 - hosts: manageservers
 6 
 7   vars:
 8     # - mypath: /tmp/
 9     - mypath: /tmp/yum_hard.sh
10     - path2: /tmp/
11     # - path2: /tmp/yum_hard_2.sh
12 
13   tasks:
14     - debug:
15         msg: "path is a directory"
16       when: mypath is directory
17 
18     - debug:
19         msg: "path is a file"
20       when: mypath is file
21 
22     - debug:
23         msg: "path is a symlink"
24       when: mypath is link
25 
26     - debug:
27         msg: "path already exists"
28       when: mypath is exists
29 
30     - debug:
31         msg: "path is {{ (mypath is abs)|ternary('absolute','relative')}}"
32 
33     - debug:
34         msg: "path is the same file as path2"
35       when: mypath is same_file(path2)
36 
37     - debug:
38         msg: "path is a mount"
39       when: mypath is mount
40 
41 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_path.yml  # 註意查看執行

 

測驗任務執行結果

對任務執行結果進行測驗。

 1 [yun@ansi-manager ansi_tests]$ pwd
 2 /app/ansible_info/ansi_tests
 3 [yun@ansi-manager ansi_tests]$ cat tests_result.yml 
 4 ---
 5 - hosts: 172.16.1.180
 6 
 7   ## 對如下3種情況一次測驗
 8   tasks:
 9     - shell: /usr/bin/foo
10     #- shell: /usr/bin/true
11     #- shell: /usr/bin/false
12       register: result
13       ignore_errors: True
14 
15     - debug:
16         msg: "{{ result }}"
17 
18     - debug:
19         msg: "it failed"
20       when: result is failed
21 
22     # in most cases you'll want a handler, but if you want to do something right now, this is nice
23     - debug:
24         msg: "it changed"
25       when: result is changed
26 
27     - debug:
28         msg: "it succeeded in Ansible >= 2.1"
29       when: result is succeeded
30 
31     - debug:
32         msg: "it succeeded"
33       when: result is success
34 
35     - debug:
36         msg: "it was skipped"
37       when: result is skipped
38 
39 [yun@ansi-manager ansi_tests]$ ansible-playbook -b -i ../hosts_key tests_result.yml  # 註意查看執行

 

 


 

———END———
如果覺得不錯就關註下唄 (-^O^-) !

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 綜述 .NET CORE 3.0開始,桌面端支持WPF了。很多.NET FRAMEWORK的項目已經跑了一陣子了,不是很有必要支持.NET CORE,不過最近用一個程式,為了貫徹一些C 8的特性,需要升級項目到.NET CORE 3.1。 方法 參考 "官方指導" ,需要這麼幾步: 1. 瞭解並更新 ...
  • vue+element部署 一.環境準備 1.因為Nginx依賴於gcc的編譯環境,所以,需要安裝編譯環境來使Nginx能夠編譯起來。 命令:yum install gcc-c++ 2.Nginx的http模塊需要使用pcre來解析正則表達式,需要安裝pcre。 命令:yum install -y ...
  • EFCore數據操作 ...
  • 0. 前言 這是C 基礎知識系列的最後一個內容講解篇,下一篇是基礎知識 實戰篇。這一篇主要講解一下C 程式的結構和主要編程工具。 1. 工具 工欲善其事必先利其器,在實際動手之前我們先來看看想要編寫一套C 程式需要做哪些準備吧。 1.1 選擇 C 的sdk在之前的某個時間點分為了三個方向: 1. . ...
  • 關於數據類型 c#的類型一般分為值類型和引用類型兩種, 值類型的變數包含類型的實例,值類型存放棧中 引用類型的變數包含對類型實例的引用,引用類型放在堆中,在棧中設置一個指針指向堆 值類型: 1.整數型數值:所有的整型數值類型均為值類型,可以用文本進行初始化,每個整型類型的預設值都是0,c#支持以下預 ...
  • 今年年初進了一家新公司,進入之後一邊維護老項目一邊瞭解項目流程,為了接下來的項目重做積累點經驗。 先說下老項目吧,.net fx 3.5+oracle...... 在實際維護中逐漸發現,老項目有標準版、定製版兩種,標準版就是一套代碼,粗略計算了下,全部版本加起來有20+個版本,如果項目重做後還是依照 ...
  • 環境和工具 服務端電腦IP:192.168.1.130 客戶端電腦IP:192.168.1.120 1、在服務端電腦運行 "IoTClientTool" 2、運行 "Wireshark" 3、在客戶端電腦運行 "IoTClientTool" 4、Wireshark得到如下報文 報文分析,plc的連接 ...
  • 一次HTTP請求,就是一次標準IO操作。請求是I,是輸入;響應式O,是輸出。任何web開發框架,其實都是在乾這兩件事: + 接受請求併進行解析獲取參數 + 根據參數進行渲染並輸出響應內容 所以我們學習一個框架,我認為最首要的是知道如何從請求中獲取參數。http請求攜帶參數的地方主要有下麵幾個地方: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...