Ansible - 變數



Playbook 中的變數與在任何程式語言中使用變數非常相似。它可以幫助您使用和分配變數的值,並在 playbook 的任何地方使用它。您可以圍繞變數的值設定條件,並根據需要在 playbook 中使用它們。

示例

- hosts : <your hosts> 
vars:
tomcat_port : 8080 

在上面的示例中,我們定義了一個名為tomcat_port的變數,併為該變數分配了值 8080,可以在 playbook 中根據需要使用它。

現在參考共享的示例。以下程式碼來自其中一個角色(install-tomcat):

block: 
   - name: Install Tomcat artifacts 
      action: > 
      yum name = "demo-tomcat-1" state = present 
      register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}" 

這裡,輸出是使用的變數。

讓我們一起了解上面程式碼中使用的所有關鍵字:

  • block - Ansible 語法,用於執行給定的程式碼塊。

  • name - 程式碼塊的相關名稱 - 這用於日誌記錄,並有助於除錯哪些程式碼塊已成功執行。

  • action - action 標籤後面的程式碼是要執行的任務。action 也是 yaml 中使用的 Ansible 關鍵字。

  • register - 使用 register 關鍵字註冊 action 的輸出,Output 是儲存 action 輸出的變數名稱。

  • always - 也是 Ansible 關鍵字,它表示下面將始終執行。

  • msg - 顯示訊息。

變數用法 - {{Output}}

這將讀取變數 Output 的值。由於它在 msg 標籤中使用,因此它將列印輸出變數的值。

此外,您還可以使用變數的子屬性。例如,在檢查 {{Output.changed}} 時,檢查輸出是否已更改,並相應地使用它。

Playbook 中的異常處理

Ansible 中的異常處理類似於任何程式語言中的異常處理。Playbook 中的異常處理示例如下所示。

tasks: 
   - name: Name of the task to be executed 
      block: 
         - debug: msg = 'Just a debug message , relevant for logging' 
         - command: <the command to execute> 
      
      rescue: 
         - debug: msg = 'There was an exception.. ' 
         - command: <Rescue mechanism for the above exception occurred) 
      
      always: 
         - debug: msg = "this will execute in all scenarios. Always will get logged" 

以下是異常處理的語法。

  • rescuealways 是特定於異常處理的關鍵字。

  • Block 是編寫程式碼的地方(在 Unix 機器上執行的任何內容)。

  • 如果 block 功能內編寫的命令失敗,則執行將到達 rescue 程式碼塊並執行它。如果 block 功能下的命令沒有錯誤,則不會執行 rescue。

  • Always 在所有情況下都會執行。

  • 因此,如果我們將其與 Java 進行比較,則它類似於 try、catch 和 finally 程式碼塊。

  • 這裡,Block 類似於try 程式碼塊,您可以在其中編寫要執行的程式碼,rescue 類似於catch 程式碼塊always 類似於finally

迴圈

以下是演示 Ansible 中迴圈用法的示例。

任務是將所有 war 檔案從一個目錄複製到 tomcat webapps 資料夾。

下面示例中使用的大多數命令之前已經介紹過了。在這裡,我們將重點關注迴圈的用法。

最初在 'shell' 命令中,我們執行了 ls *.war。因此,它將列出目錄中的所有 war 檔案。

該命令的輸出儲存在名為 output 的變數中。

要迴圈,使用了 'with_items' 語法。

with_items: "{{output.stdout_lines}}" --> output.stdout_lines 為我們提供了逐行輸出,然後我們使用 Ansible 的 with_items 命令在輸出上迴圈。

附加示例輸出只是為了讓大家瞭解如何在 with_items 命令中使用 stdout_lines。

--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
      - name: Install Apache 
      shell: "ls *.war" 
      register: output 
      args: 
         chdir: /opt/ansible/tomcat/demo/webapps 
      
      - file: 
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}' 
         dest: '/users/demo/vivek/{{ item }}' 
         state: link 
      with_items: "{{output.stdout_lines}}"

Loop

程式碼塊

Playbook 總體上被分解成程式碼塊。要執行的步驟的最小部分寫在程式碼塊中。將特定指令寫入程式碼塊有助於隔離功能,並在需要時使用異常處理來處理它。

變數用法、異常處理和迴圈中上面已經介紹了程式碼塊的示例。

條件語句

條件語句用於根據條件執行特定步驟。

--- 
#Tsting 
- hosts: all 
   vars: 
      test1: "Hello Vivek" 
   tasks: 
      - name: Testing Ansible variable 
      debug: 
         msg: "Equals" 
         when: test1 == "Hello Vivek" 

在這種情況下,將列印 Equals,因為 test1 變數與 when 條件中提到的內容相等。when 可以與邏輯 OR 和邏輯 AND 條件一起使用,就像在所有程式語言中一樣。

Conditional Output

只需將 test1 變數的值從 Hello Vivek 更改為 Hello World 並檢視輸出即可。

Changed Conditional Output
廣告

© . All rights reserved.