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

一、实验环境

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

ansible主机的devops用户生成ssh公私钥
请添加图片描述
建立ansible目录,编写devops用户家目录下的ansible.cfg配置文件
请添加图片描述
请添加图片描述
编写清单文件
请添加图片描述
ansible主机与三个node节点进行ssh免密认证
请添加图片描述
ansible主机生成加密的密码
请添加图片描述
为清单列表的主机建立用户和密码
请添加图片描述
免密登录成功
请添加图片描述
ansible主机与三个node节点上的devops用户进行ssh免密认证
请添加图片描述
可以看到node主机已经收到了认证密钥
请添加图片描述
ansible主机为三个node节点上的devops用户做提权,设定NOPASSWD免密登陆sudo
请添加图片描述
可以看到三台node主机devpos提权均已设定成功
请添加图片描述
测试能否ping通
请添加图片描述
测试建立文件
请添加图片描述
修改清单文件,将不同主机添加到不同的管控组
请添加图片描述

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

1.简单循环

赋值列表

loop:
- value1
- value2
- ... 

{{item}} 迭代变量名称

例如:为node主机建立用户,以下设定方式会报错
请添加图片描述
应使用 loop 赋值列表,进行迭代
请添加图片描述
可以看到用户成功建立
请添加图片描述
也可以通过文件的方式定义变量,以下是错误示例
请添加图片描述
此时,loop赋值列表下方不能有 -
请添加图片描述
可以看到用户成功删除
请添加图片描述

2.循环散列或字典列表

练习,为node主机建立用户,并赋予密码
请添加图片描述
ansible主机生成加密的密码
请添加图片描述
循环散列或字典列表的好处在于:可以赋予不同的服务不同的状态;
建立yml文件,实现字典列表的循环,为node主机建立用户,并为不同的用户赋予不同的密码
请添加图片描述
执行Playbook
请添加图片描述
建立成功
请添加图片描述
测试连接
请添加图片描述
使用注册变量register ,把模块输出结果注册到指定字符串OUTPUT中
请添加图片描述
为node主机建立文件时,也推荐使用file模块
请添加图片描述
文件建立成功
请添加图片描述

三、条件判定

1.when条件语句

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

when:
- 条件1
- 条件2

示例:判断文件是否存在,并查看输出值
请添加图片描述
在这里插入图片描述
在这里插入图片描述

执行playbook
请添加图片描述
我们通过Ad-Hoc 的方式,利用ansible命令将node1主机/mnt/file文件删除;
再次执行playbook,由于我们yml文件中没有设定忽略错误,当node1主机/mnt/file文件不存在时,rc返回值不为1就会报错
请添加图片描述
请添加图片描述
所以,必须加上错误忽略
请添加图片描述
成功执行playbook
请添加图片描述

2.条件判断

在这里插入图片描述
多条件组合:

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

**测试题:**添加磁盘。利用条件语句对磁盘进行检测。
为node2(172.25.254.180)主机添加一块10G的磁盘
请添加图片描述
可以发现磁盘为/dev/vdb
请添加图片描述
通过搜索vdb事实变量,便于我们采集信息
请添加图片描述
查看到的位置为ansible_facts 下的devices下的vdb
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
建立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         条件不存在时
///

请添加图片描述
执行playbook,可以看到显示只有180主机有vdb存在
请添加图片描述
添加ip,进行多重条件控制;
查看到ip如下,可以使用魔法变量inventory_hostname,也可以使用:

  • ansible_facts[‘ens3’][‘ipv4’][‘address’] in “172.25.254.180”
    请添加图片描述
    必须两个条件都满足才输出结果
    请添加图片描述
    执行playbook
    请添加图片描述
    修改yml文件
    请添加图片描述
    执行playbook
    请添加图片描述
    也可以将or单独放一行
    请添加图片描述
    请添加图片描述

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逻辑卷格式)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建物理卷 PV 以及名为westos的卷组VG(可以在卷组上创建一个或多个“LVM分区”(逻辑卷))
请添加图片描述
查看ansible的lvm部署模块
请添加图片描述
查看lvs创造的具体用法

ansible-doc lvol | less

在这里插入图片描述
查看pv的位置

ansible all -m setup |less

请添加图片描述
请添加图片描述
编写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输出结果 `

请添加图片描述
执行如下;
其他主机因为没有卷组,因此直接跳过创建阶段。因为只有node2主机才有卷组,所以满足条件才执行,但是达不到1500M大小(建立的卷组是1G),因此开始创建800M请添加图片描述请添加图片描述
lvs查看逻辑卷,可以看到node2主机上建立了800M的LVM
请添加图片描述

四、触发器

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

如下:为node主机安装httpd服务,并设定开放端口,当端口改变时会触发火墙和httpd服务
请添加图片描述
请添加图片描述
执行playbook,设定httpd开放端口为80;
-e 定义变量,用于在命令行中为Playbook定义变量
请添加图片描述
请添加图片描述
node主机查看端口
请添加图片描述
执行playbook,设定httpd开放端口为8080,此时只有触发器会做出改变,变为黄色
请添加图片描述
请添加图片描述
node主机查看端口
请添加图片描述
测试:
当执行 ansible-playbook vsftpd.yml -e “state=YES” 时,为node主机安装下载vsftpd,并允许匿名用户能够登陆。

请添加图片描述
请添加图片描述
在这里插入图片描述
执行playbook,设定匿名用户可以访问
请添加图片描述
成功用匿名用户登陆且查看到信息
请添加图片描述
执行playbook,设定匿名用户不能访问;
可以看到触发器(两个)的触发情况
请添加图片描述
可以看到,此时匿名用户无法登录ftp
请添加图片描述

五、处理失败任务

1.ignore_errors

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

例如,我们要为node主机安装一个不存在的服务westos
请添加图片描述
执行playbook会报错
请添加图片描述
加入ignore_errors参数
请添加图片描述
将会忽略任务失败使下面的任务继续运行
请添加图片描述
执行成功
请添加图片描述

2.force_handlers

作用: 当任务失败后play被终止也会调用触发器进程;
通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
请添加图片描述
去掉ignore_errors参数,加入force_handlers参数
请添加图片描述
可以看到执行playbook时会报错,但是仍然调用了触发器进程(restart vsftpd)
请添加图片描述
请添加图片描述
当我们再次执行playbook时,由于ftp已经安装,因此安装模块将不做改变(为绿色)
请添加图片描述

3.changed_when

作用: 控制任务在何时报告它已进行更改;
在安装模块加入changed_when参数
请添加图片描述
此时再次执行playbook时,虽然ftp已经安装,但是安装模块为黄色
请添加图片描述
再次通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
请添加图片描述
设定changed_when为false,控制任务在进行更改时不报告;
请添加图片描述
当我们再次执行playbook时,虽然ftp在这之前未被安装,但安装模块仍然显示为绿色
请添加图片描述

4.failed_when

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

继续编辑yml文件,加入shell指令
请添加图片描述
执行playbook
请添加图片描述
加入failed_when参数
请添加图片描述
此时再次执行playbook,报错
请添加图片描述
继续编辑yml文件,加上之前安装westos(不存在的包)模块;
设定failed_when参数未false
请添加图片描述
此时,执行playbook成功,无报错
请添加图片描述
继续编辑yml文件;
设定failed_when: “‘hello’ in westos.stdout”
请添加图片描述
执行playbook,报错
请添加图片描述
当设定输出的是westos时
请添加图片描述
执行playbook,成功
请添加图片描述

5.block

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

示例:
请添加图片描述
执行playbook,node1主机(170)的/mnt目录下不存在file文件,因此执行会报错,进入rescue模块
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值