ansible 自动化运维工具 7 (循环、条件判定、触发器)

目录

  • 一、实验环境
  • 二、循环(循环迭代任务)
    • 1.简单循环
    • 2.循环散列或字典列表
  • 三、条件判定
    • 1.when条件语句
    • 2.条件判断
    • 3.例题
  • 四、触发器
  • 五、处理失败任务
    • 1.ignore_errors
    • 2.force_handlers
    • 3.changed_when
    • 4.failed_when
    • 5.block

一、实验环境

准备四台虚拟机:
ansbile主机:172.25.254.100
node1:172.25.254.170 被控端
node2:172.25.254.180被控端
node3:172.25.254.190被控端

ansible主机的devops用户生成ssh公私钥
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第1张图片
建立ansible目录,编写devops用户家目录下的ansible.cfg配置文件
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第2张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第3张图片
编写清单文件
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第4张图片
ansible主机与三个node节点进行ssh免密认证
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第5张图片
ansible主机生成加密的密码
请添加图片描述
为清单列表的主机建立用户和密码
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第6张图片
免密登录成功
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第7张图片
ansible主机与三个node节点上的devops用户进行ssh免密认证
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第8张图片
可以看到node主机已经收到了认证密钥
请添加图片描述
ansible主机为三个node节点上的devops用户做提权,设定NOPASSWD免密登陆sudo
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第9张图片
可以看到三台node主机devpos提权均已设定成功
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第10张图片
测试能否ping通
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第11张图片
测试建立文件
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第12张图片
修改清单文件,将不同主机添加到不同的管控组
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第13张图片

二、循环(循环迭代任务)

1.简单循环

赋值列表

loop:
- value1
- value2
- ... 

{
     {
     item}} 迭代变量名称

例如:为node主机建立用户,以下设定方式会报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第14张图片
应使用 loop 赋值列表,进行迭代
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第15张图片
可以看到用户成功建立
请添加图片描述
也可以通过文件的方式定义变量,以下是错误示例
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第16张图片
此时,loop赋值列表下方不能有 -
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第17张图片
可以看到用户成功删除
请添加图片描述

2.循环散列或字典列表

练习,为node主机建立用户,并赋予密码
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第18张图片
ansible主机生成加密的密码
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第19张图片
循环散列或字典列表的好处在于:可以赋予不同的服务不同的状态;
建立yml文件,实现字典列表的循环,为node主机建立用户,并为不同的用户赋予不同的密码
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第20张图片
执行Playbook
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第21张图片
建立成功
请添加图片描述
测试连接
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第22张图片
使用注册变量register ,把模块输出结果注册到指定字符串OUTPUT中
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第23张图片
为node主机建立文件时,也推荐使用file模块
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第24张图片
文件建立成功
请添加图片描述

三、条件判定

1.when条件语句

此条件代表当两者都满足时

when:
- 条件1
- 条件2

示例:判断文件是否存在,并查看输出值
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第25张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第26张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第27张图片

执行playbook
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第28张图片
我们通过Ad-Hoc 的方式,利用ansible命令将node1主机/mnt/file文件删除;
再次执行playbook,由于我们yml文件中没有设定忽略错误,当node1主机/mnt/file文件不存在时,rc返回值不为1就会报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第29张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第30张图片
所以,必须加上错误忽略
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第31张图片
成功执行playbook
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第32张图片

2.条件判断

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第33张图片
多条件组合:

when:
 条件1 and 条件2
 - 条件1
 - 条件2
when:
 条件1 or 条件2
when: >
 条件1
 or
 条件2

**测试题:**添加磁盘。利用条件语句对磁盘进行检测。
为node2(172.25.254.180)主机添加一块10G的磁盘
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第34张图片
可以发现磁盘为/dev/vdb
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第35张图片
通过搜索vdb事实变量,便于我们采集信息
请添加图片描述
查看到的位置为ansible_facts 下的devices下的vdb
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第36张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第37张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第38张图片

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第39张图片
建立yml文件

///
- name: show message
  debug:
    msg: vdb is exit
  when: ansible_facts['devices']['vdb'] is defined             条件存在时

- name: show message
  debug:
    msg: vdb is not exit
  when: ansible_facts['devices']['vdb'] is not defined         条件不存在时
///

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第40张图片
执行playbook,可以看到显示只有180主机有vdb存在
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第41张图片
添加ip,进行多重条件控制;
查看到ip如下,可以使用魔法变量inventory_hostname,也可以使用:

  • ansible_facts[‘ens3’][‘ipv4’][‘address’] in “172.25.254.180”
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第42张图片
    必须两个条件都满足才输出结果
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第43张图片
    执行playbook
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第44张图片
    修改yml文件
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第45张图片
    执行playbook
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第46张图片
    也可以将or单独放一行
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第47张图片
    ansible 自动化运维工具 7 (循环、条件判定、触发器)_第48张图片

3.例题

  • 建立playbook ~/ansibles/lvm.yml要求如下:
    (1)建立大小为1500M名为exam_lvm的lvm 在westos组中
    (2)如果westos不存在请输出:
    vg westos is not exist
    (3)如果westos大小不足1500M请输出:
    vg westos is less then 1500M
    并建立800M大小的lvm

以node2(172.25.254.180)主机为例,首先建立一块大小为1G的磁盘(LVM逻辑卷格式)
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第49张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第50张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第51张图片
创建物理卷 PV 以及名为westos的卷组VG(可以在卷组上创建一个或多个“LVM分区”(逻辑卷))
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第52张图片
查看ansible的lvm部署模块
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第53张图片
查看lvs创造的具体用法

ansible-doc lvol | less

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第54张图片
查看pv的位置

ansible all -m setup |less

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第55张图片
请添加图片描述
编写yml文件

[lr@westos_ansible]$ cat lvm.yml 
---
- name: create lvm
  hosts: all
  tasks:
    - name: create 1500M lvm
      lvol:
        lv: exam_lvm   
        vg: westos
        size: 1500M   
      when: ansible_facts['lvm']['vgs']['westos'] is defined  
      ignore_errors: yes
      register: OUTPUT 
 `当名为westos的卷组存在时,直接执行创建1500M的LVM可能会因为内存不够而创建失败,所以要忽略创建时的一些错误,并创建结果注册到OUTPUT变量中`
 
    - name: debug size message
      debug:
        msg: vg is less than 1500M
      when:
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc != 0   
 `当VG存在,且1500M创建失败时输出msg`

    - name: create 800M lvm
      lvol:
        lv: exam_lvm
        vg: westos
        size: 800M
      when:
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc != 0
 `当卷组存在,且进行创建的1500M的lvm失败时进行创建800M的lvm `
   
    - name: debug messages
      debug:
        msg: vg westos is not exist
      when:
        - ansible_facts['lvm']['vgs']['westos'] is not defined
 `VG不存在时的msg输出结果 `

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第56张图片
执行如下;
其他主机因为没有卷组,因此直接跳过创建阶段。因为只有node2主机才有卷组,所以满足条件才执行,但是达不到1500M大小(建立的卷组是1G),因此开始创建800Mansible 自动化运维工具 7 (循环、条件判定、触发器)_第57张图片ansible 自动化运维工具 7 (循环、条件判定、触发器)_第58张图片
lvs查看逻辑卷,可以看到node2主机上建立了800M的LVM
请添加图片描述

四、触发器

notify: 触发器当遇到更改时触发handlers;
handlers: 触发器触发后执行的动作。

如下:为node主机安装httpd服务,并设定开放端口,当端口改变时会触发火墙和httpd服务
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第59张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第60张图片
执行playbook,设定httpd开放端口为80
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第61张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第62张图片
node主机查看端口
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第63张图片
执行playbook,设定httpd开放端口为8080,此时只有触发器会做出改变,变为黄色
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第64张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第65张图片
node主机查看端口
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第66张图片
测试:
当执行 ansible-playbook vsftpd.yml -e “state=YES” 时,为node主机安装下载vsftpd,并允许匿名用户能够登陆。

ansible 自动化运维工具 7 (循环、条件判定、触发器)_第67张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第68张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第69张图片
执行playbook,设定匿名用户可以访问
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第70张图片
成功用匿名用户登陆且查看到信息
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第71张图片
执行playbook,设定匿名用户不能访问;
可以看到触发器(两个)的触发情况
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第72张图片
可以看到,此时匿名用户无法登录ftp
请添加图片描述

五、处理失败任务

1.ignore_errors

作用: 当play遇到任务失败时会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行

例如,我们要为node主机安装一个不存在的服务westos
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第73张图片
执行playbook会报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第74张图片
加入ignore_errors参数
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第75张图片
将会忽略任务失败使下面的任务继续运行
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第76张图片
执行成功
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第77张图片

2.force_handlers

作用: 当任务失败后play被终止也会调用触发器进程;
通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第78张图片
去掉ignore_errors参数,加入force_handlers参数
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第79张图片
可以看到执行playbook时会报错,但是仍然调用了触发器进程(restart vsftpd)
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第80张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第81张图片
当我们再次执行playbook时,由于ftp已经安装,因此安装模块将不做改变(为绿色)
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第82张图片

3.changed_when

作用: 控制任务在何时报告它已进行更改;
在安装模块加入changed_when参数
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第83张图片
此时再次执行playbook时,虽然ftp已经安装,但是安装模块为黄色
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第84张图片
再次通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第85张图片
设定changed_when为false,控制任务在进行更改时不报告;
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第86张图片
当我们再次执行playbook时,虽然ftp在这之前未被安装,但安装模块仍然显示为绿色
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第87张图片

4.failed_when

作用:当符合条件时强制任务失败

继续编辑yml文件,加入shell指令
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第88张图片
执行playbook
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第89张图片
加入failed_when参数
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第90张图片
此时再次执行playbook,报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第91张图片
继续编辑yml文件,加上之前安装westos(不存在的包)模块;
设定failed_when参数未false
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第92张图片
此时,执行playbook成功,无报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第93张图片
继续编辑yml文件;
设定failed_when: “‘hello’ in westos.stdout”
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第94张图片
执行playbook,报错
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第95张图片
当设定输出的是westos时
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第96张图片
执行playbook,成功
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第97张图片

5.block

block: 定义要运行的任务
rescue: 定义当block句子中出现失败任务后运行的任务
always: 定义最终独立运行的任务

示例:
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第98张图片
执行playbook,node1主机(170)的/mnt目录下不存在file文件,因此执行会报错,进入rescue模块
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第99张图片
ansible 自动化运维工具 7 (循环、条件判定、触发器)_第100张图片

你可能感兴趣的:(运维,自动化,devops)