今天我们来讲讲Ansible playbook中的逻辑控制语句when 和loop。
Ansible条件判断语句-When
when是Ansible中的条件判断语句, 类似于编程语言中的if。
有时候用户很可能需要满足特定条件才执行某一个特定的步骤,例如在一个特定版本的系统上安装软件包,或者只在磁盘空间不足的文件系统上执行清理操作一样。这些操作在playbook中用when语句实现。
- when的基本用法
tasks:
- name: "Shutdown centos server"
shell: shutdown -t now
when: ansible_os_family == "centos"
根据Action的执行结果,来决定接下来执行的任务
代码语言:javascript复制tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when result | failed
- command: /bin/something_else
when result | success
- command: /bin/still/something_else
when result | skipped
- 条件表达式
vars:
epic: true
tasks:
- shell: echo "This certainly is epic!"
when: epic
代码语言:javascript复制---
- hosts: all
remote_user: root
tasks:
- command: echo {{ item }}
with_items: [ 0, 2, 4, 6, 8, 10 ]
when: item > 5
Ansible循环语句-Loop
- 标准循环
利用循环创建多个用户:
代码语言:javascript复制---
- hosts: all
remote_user: root
tasks:
- name: add several users
user: name={{ item }} state=present groups=users
with_items:
- testuser1
- testuser2
运行结果: (批量用户创建成功)
上面的playbook也可以这样写:(在"vars"区域定义了一组列表变量)
代码语言:javascript复制---
- hosts: all
remote_user: root
vars:
user_list: ["testuser3","testuser4"]
tasks:
- name: add several users
user: name={{ item }} state=present groups=users
with_items: "{{ user_list }}"
运行结果:(批量用户创建成功)
"with_items"用于迭代的list类型变量,不仅支持简单的字符串列表,如果你有一个哈希列表,那么可以用以下方式来引用子项。
代码语言:javascript复制---
- hosts: all
remote_user: root
tasks:
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name:'testuser1', groups:'users' }
- { name:'testuser2', groups:'users' }
- 嵌套循环
循环也可以嵌套,用[]访问内层和外层的循环。
代码语言:javascript复制---
- hosts: all
remote_user: root
tasks:
- name: give users access to multiple databases
mysql_users: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
with_nested:
- ['alice','bob']
- ['clientdb','employeedb','providerd']
当然上面的item[0]也可以用item.0代替,item[1]可以用item.1代替。
- 对文件列表循环使用
with_fileglob可以以非递归的方式来模拟匹配单个目录中的文件,如:
代码语言:javascript复制---
- hosts: all
remote_user: root
tasks:
#fiest ensure our target directory exists
- file: dest=/etc/fooapp state=directory
#copy each file over that matches the given pattern
- copy: src={{ item }} dest=/etc/fooapp owner=root mode=
with_fileglob:
- /playbook/files/fooapp/*
今天我们先介绍到这里,未完待续!
参考资料:
Ansible快速入门, 技术原理与实战。