前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动化运维| Ansible playbook的逻辑控制语句

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

作者头像
小土豆Yuki
发布2020-08-20 15:43:33
1.2K0
发布2020-08-20 15:43:33
举报
文章被收录于专栏:洁癖是一只狗

今天我们来讲讲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快速入门, 技术原理与实战。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ansible条件判断语句-When
  • Ansible循环语句-Loop
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档