1. 程式人生 > >ansible基礎-Jinja2模版 | 測試

ansible基礎-Jinja2模版 | 測試

book 分享圖片 gis books ear 穩定 匹配 我們 subset

一 簡介

註:本文demo使用ansible2.7穩定版

Jinja2的測試語句被用來評估一個條件表達式,並且最終返回True或False,經常和「when」語句搭配使用。

測試語句和過濾器的相同點:測試語句的條件表達式也在控制端執行,在目的主機端生效。

測試語句和過濾器的不同點:

  • 前者多被用於「比較」,執行結果是True或False,而後者多被用於對數據的操作與轉換,執行結果是我們期望的數據內容或數據格式。
  • 語法不同,前者使用「is」,後者使用「|」

測試語句的語法很簡單,寫法如下:

variable is test_name

舉個??,task執行結果為failed時,則返回True:

result is failed

二 測試字符串

關鍵字「match」和「search」,參數可以使用正則表達式,用來查找一個字符串是否與測試語句相匹配。

vars:
  url: "http://example.com/users/foo/resources/bar"

tasks:
    - debug:
        msg: "matched pattern 1"
      when: url is match("http://example.com/users/.*/resources/.*")

    - debug:
        msg: "matched pattern 2
" when: url is search("/users/.*/resources/.*") - debug: msg: "matched pattern 3" when: url is search("/users/")

通過上面示例,我們可以看出:

  • 關鍵字「match」用於判斷一個字符串的完整匹配
  • 關鍵字「search」用於判斷一個字符串的部分匹配

三 測試版本號

關鍵字「version」(舊版本為「version_compare」),用於比較版本號。

例如,測試當前centos操作系統的版本號是否大於等於「7.2.1511」,可以這樣寫:

{{ ansible_facts[ansible_distribution_version] is version(7.2.1511, >=) }}

如果當前操作系統版本號大於或等於「7.2.1511」,條件表達式返回True,否則返回False。

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

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

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

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

四 測試列表

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

vars:
    a: [1,2,3,4,5]
    b: [2,3]
tasks:
    - debug:
        msg: "A includes B"
      when: a is superset(b)

    - debug:
        msg: "B is included in A"
      when: b is subset(a)

關鍵字「all」和「any」,用於檢查列表裏的元素的真假:

vars:
  mylist:
      - 1
      - "{{ 3 == 3 }}"
      - True
  myotherlist:
      - False
      - True
tasks:

  - debug:
      msg: "all are true!"
    when: mylist is all

  - debug:
      msg: "at least one is true"
    when: myotherlist is any

用大學學的離散數學概括下:

all:一假則假

any:一真則真

五 測試文件路徑

測試文件路徑的關鍵字從字面上就能看出來其含義,下面直接上示例:

- debug:
    msg: "path is a directory"
  when: mypath is directory

- debug:
    msg: "path is a file"
  when: mypath is file

- debug:
    msg: "path is a symlink"
  when: mypath is link

- debug:
    msg: "path already exists"
  when: mypath is exists

- debug:
    msg: "path is {{ (mypath is abs)|ternary(‘absolute‘,‘relative‘)}}"

- debug:
    msg: "path is the same file as path2"
  when: mypath is same_file(path2)

- debug:
    msg: "path is a mount"
  when: mypath is mount

註:這個特性在ansible>=2.5的版本中才有,在生產實踐中,可以替換舊版本中「stat」+「register」+「when」實現的功能。

六 測試任務執行結果

測試任務執行結果也比較通俗易懂,示例如下:

tasks:

  - shell: /usr/bin/foo
    register: result
    ignore_errors: True

  - debug:
      msg: "it failed"
    when: result is failed

  # in most cases youll want a handler, but if you want to do something right now, this is nice
  - debug:
      msg: "it changed"
    when: result is changed

  - debug:
      msg: "it succeeded in Ansible >= 2.1"
    when: result is succeeded

  - debug:
      msg: "it succeeded"
    when: result is success

  - debug:
      msg: "it was skipped"
    when: result is skipped

七 本節應該掌握的技能

  • 掌握測試語句與過濾器的相同點和異同點。
  • 掌握在playbook和模版中靈活運用測試語句。

八 參考鏈接

  • https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html

歡迎大家關註我的公眾號:

技術分享圖片

ansible基礎-Jinja2模版 | 測試