专栏首页洁癖是一只狗自动化运维| Ansible playbook的逻辑控制语句

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

今天我们来讲讲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的执行结果,来决定接下来执行的任务

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
---
- hosts: all
  remote_user: root
  tasks:
    - command: echo {{ item }}
      with_items: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5

Ansible循环语句-Loop

  • 标准循环

利用循环创建多个用户:

---
- hosts: all
  remote_user: root
  tasks:
    - name: add several users
      user: name={{ item }} state=present groups=users
      with_items:
           - testuser1
           - testuser2

运行结果: (批量用户创建成功)

上面的playbook也可以这样写:(在"vars"区域定义了一组列表变量)

---
- 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类型变量,不仅支持简单的字符串列表,如果你有一个哈希列表,那么可以用以下方式来引用子项。

---
- 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' }
  • 嵌套循环

循环也可以嵌套,用[]访问内层和外层的循环。

---
- 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可以以非递归的方式来模拟匹配单个目录中的文件,如:

---
- 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快速入门, 技术原理与实战。

本文分享自微信公众号 - 洁癖是一只狗(rookie-dog),作者:小土豆Yuki

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mysql如何使用order by工作

    日常开发中,我们经常要进行字段的排序,但是我们大多不知道排序是如何执行的,今天我们就说说order by 的执行逻辑,

    小土豆Yuki
  • redis数据分布

    我们知道redis官方说他是可以支持10万/每秒的并发量,但是如果我们的业务场景需要100万/每秒呢?

    小土豆Yuki
  • redis全量复制和部分复制

    我们在第一次同步数据的时候,redis集群都是进行全量复制,由于全量复制的开销比较大,在2.8版本之后就提出了一种部分复制,我们先看一下全量复制的流程原理。

    小土豆Yuki
  • 【教程】快速入门,十天学会ASP

    落叶大大
  • python开发_getpass_获取登录名

    我们有时候需要获取到计算机的登录名,这时候,就可以使用python中的getpass模块了

    Hongten
  • Oracle基本参数(DB_UNIQUE_NAME)

    第一期就从基本的初始化参数讲起,一篇一个参数,会尽可能的具体. 如无特殊说明数据库版本为11g

    bsbforever
  • 【5min+】更好的选项实践。.Net Core中的IOptions

    【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,Aspne...

    句幽
  • 接口测试业务验证--视频演示

    接口框架的基础功能已经讲完了,接下来会分享一些接口测试实践。今天分享了接口一般的业务验证,注册用户和用户登录。借助开源社区提供的接口来做演示。写了一些测试脚本,...

    FunTester
  • 求二叉树的深度和宽度

    题目: 输入一个二叉树的根节点,求该树的深度。从根节点到叶子节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度包含的节点数为为树的深度,即二...

    Dabelv
  • Grid布局简介

    没错,这其实就是我们小时候写的小格子本本,其实它跟我们今天要讲的主题Grid布局非常类似,其实Grid布局就是它的升级加强版。

    桃翁

扫码关注云+社区

领取腾讯云代金券