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"
以下是异常处理的语法。
rescue 和 always 是特定于异常处理的关键词。
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}}"
块
整个 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 条件一起使用,就像在所有编程语言中一样。
只需将 test1 变量的值从 Hello Vivek 改为 Hello World,然后查看输出。
