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 − 动作标签旁边的代码是要执行的任务。 该动作再次是 yaml 中使用的 Ansible 关键字。

  • register − 动作的输出使用 register 关键字注册,Output 是保存动作输出的变量名。

  • always − 又是一个 Ansible 关键字,它表明将始终执行以下操作。

  • msg − 显示消息。

变量的使用 - {{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 机器上执行的东西)。

  • 如果写入块功能中的命令失败,则执行到达救援块并被执行。 如果阻止功能下的命令没有错误,则不会执行救援。

  • Always 在所有情况下都会被执行。

  • 所以如果我们和java比较的话,那么就类似于try、catch、finally块。

  • 这里,Block 类似于 try block,您可以在其中编写要执行的代码,而 rescue 类似于 catch 块 并且 alwaysfinally 类似。


循环

下面是一个例子来演示循环在 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}}"


整个 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 条件一起使用。

只需将 test1 变量的值从 Hello Vivek 更改为 Hello World 并查看输出。