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
广告