Ansible 变量怎么定义和使用?

文章导读
上一个 测验 下一个 Playbook 中的变量与在任何编程语言中使用变量非常相似。它帮助您为变量赋值并在 playbook 的任何位置使用该变量。您可以在变量的值周围设置条件,并据此在 playbook 中使用它们。
📋 目录
  1. A Playbook 中的异常处理
  2. B 循环
  3. C
  4. D 条件语句
A A

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}}" 

这里,output 是使用的变量。

让我们逐一讲解上面代码中使用的所有关键字 −

  • 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 被分解为块。最小执行步骤的代码块被写在 block 中。将特定指令写在块中有助于分离功能,并在需要时进行异常处理。

块的示例已在上面的变量使用、异常处理和循环中介绍过。

条件语句

条件语句用于根据条件运行特定步骤。

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

在这种情况下,由于 test1 变量等于 when 条件中指定的值,将打印 Equals。when 可以与逻辑 OR 和逻辑 AND 条件一起使用,就像在所有编程语言中一样。

Conditional Output

只需将 test1 变量的值从 Hello Vivek 改为 Hello World,然后查看输出。

Changed Conditional Output