自动化运维| Ansible playbook的逻辑控制语句

2020-08-20 15:43:33 浏览数 (1)

今天我们来讲讲Ansible playbook中的逻辑控制语句when 和loop。

Ansible条件判断语句-When

when是Ansible中的条件判断语句, 类似于编程语言中的if。

有时候用户很可能需要满足特定条件才执行某一个特定的步骤,例如在一个特定版本的系统上安装软件包,或者只在磁盘空间不足的文件系统上执行清理操作一样。这些操作在playbook中用when语句实现。

  • when的基本用法
代码语言:javascript复制
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
  • 条件表达式
代码语言:javascript复制
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快速入门, 技术原理与实战。

0 人点赞