【ansible5】ansible中的任务执行语句(超详细加例题解释循环语句,条件判定语句、触发器语句)

本文详细介绍了Ansible中如何进行任务执行,包括简单循环、循环散列或字典列表,以及条件判定的when语句。通过实例展示了如何创建用户、判断磁盘状态,并在满足特定条件时执行操作。此外,还讲解了Ansible的notify和handlers触发器,用于高效控制服务的启动和停止。最后,给出了一个涉及LVM管理的例题,演示了如何根据VG状态创建LVM卷,并利用触发器处理不同情况。
摘要由CSDN通过智能技术生成

实验环境

一共四台虚拟机

ansbile主机:172.25.42.100 被控端 开启火墙
nod1:172.25.42.200 被控端 开启火墙
nod2:172.25.42.210 被控端 开启火墙
nod3:172.25.42.220 被控端 开启火墙
1、在ansbile主机端拥有ansbile用户ck,并且单独配置ansible环境,此主机的root用户分发公钥给全部被控端的devops用户,分发私钥使得此主机ck用户能免密连接。将全部被控端加入到资源清单。
2、在所有被控端建立控制用户devops,visodu下放权力给devops。
具体操作见我上篇博客:ansbile部署博客连接

一、循环

一、简单循环

赋值列表

{{item}} 迭代变量名称
loop:
- value1
- value2
- ... 

二、循环散列或字典列表

建立用户和密码
生成加密的密码
在这里插入图片描述
建立yml文件,实现字典列表的循环

[ck@ansible ansible]$ cat create.yml 


- name: create user
  hosts: westos
  tasks:
    - name: create user
      user: 
        name: "{{item.user}}"
        password: "{{item.passwd}}"
        state: present
      loop:
        - user: westos1
          passwd: "$6$nPfGe/VMYhrQXBus$aSwAyjpbVEZ2AXbIfgxEGlWY4AXb9TjmwaqMF3fz9pGwTI2rUo7AhlRDg7EjFDOIwkpg/ExTKyDHRhZONrdHO1"
        - user: westos2
          passwd: "$6$.4xjbGZzc0MueOVC$B9a0unSsbn.t20U.TszdPdTvunsfIm3hIMgbs/I94PO45oQU0oddA6SlNq3jWJfy/Q8p.dqG0TvUYyv5akA2Z/"
        - user: westos3
          passwd: "$6$QqtxuRH6QiDac1oB$txijD1OMtYaQwgtqgULqhYikBBB4UJQ71bQUihNbGq9c0idjnOLLbZFuA6URaN4Nn7X/mEQ2cuHNPhYN0hixO0"

成功给清单用户列表里建立用户和密码
在这里插入图片描述

二、条件判定

一、when条件语句

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

when:
- 条件1
- 条件2

1、为了更好的了解此部分的内容首先执行一个简单的yml文件
判断文件是否存,并查看输出值

[ck@ansible ansible]$ cat tiaojian.yml 
---
- name: test
  hosts: all
  tasks:
    - name: test
      shell: test -e /mnt/file
      ignore_errors: yes
      register: OUTPUT

    - name: show message
      debug:
        msg: "{{ OUTPUT }}"

在这里插入图片描述

得到结果,可以发现因为忽略了错误,所以每个被控端都能返回OUTPUT的值。文件不存在的OUTPUT.rc=1,文件存在的OUTPUT.rc=0
在这里插入图片描述

2、在明白了上图的结果之后我们可以进行条件语句的使用

[ck@ansible ansible]$ vim tiaojian.yml 

/
---
- name: test
  hosts: all
  tasks:
    - name: test
      shell: test -e /mnt/file
      ignore_errors: yes
      register: OUTPUT

    - name: show message
      debug:
        msg: /mnt/file is exit
      when: OUTPUT.rc == 0

    - name: show message
      debug:
        msg: /mnt/file is not exit
      when: OUTPUT.rc == 1
///

在这里插入图片描述

在这里插入图片描述

二、条件判定

=value == “字符串”,value == 数字解释
<value < 数字
>value > 数字
<=value <= 数字
>=value >= 数字
!=value != 数字
is defined valuevalue is defined变量存在
is not definedvalue is not defined变量不存在
invalue is in value变量为
not invalue is not in value变量不为
bool变量 为truevaluevalue的值为true
bool变量 falsenot valuevalue的值为false

例子:添加磁盘。利用条件语句对磁盘进行检测
nod2节点添加磁盘
在这里插入图片描述
能发现磁盘为/dev/vdb
在这里插入图片描述
因此用搜索vdb事实变量,便于我们采集信息

[ck@ansible ansible]$ ansible 172.25.42.200 -m setup |less

查看到的位置为ansible_facts 下的devices下的vdb
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
建立yml文件,判断条件存在为

[ck@ansible ansible]$ cat tiaojian.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         条件不存在时
///

结果在ip为100,200主机成功查看到vdb的存在(100主机之前为也添加过磁盘)
在这里插入图片描述

2、添加ip进行控制,进行多重条件控制
查看到ip为ansible_facts下的all_ipv4_addresses下的ip

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
建立yml文件

[ck@ansible ansible]$ cat tiaojian.yml 
---
- name: test
  hosts: all
  tasks:
    - name: show message
      debug:
        msg: 100 vdb is exit
      when: 
        - ansible_facts['devices']['vdb'] is defined
        - ansible_facts['ens3']['ipv4']['address'] in "172.25.42.100"   (可以使用魔法变量inventory_hostname去代替主机ip)

    - name: show message
      debug:
        msg: vdb is not exit
      when: ansible_facts['devices']['vdb'] is not defined

在这里插入图片描述
结果加上限制ip的条件后,只有ip为的100主机输出了结果
在这里插入图片描述

三、例题:

建立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

环境设置

nod1:172.25.42.200 被控端
先建立一块名为westos的vg格式的磁盘
在这里插入图片描述
在这里插入图片描述

[root@westos_nod1 ~]  pvcreate /dev/vdb1
[root@westos_nod1 ~]  vgcreate westos /dev/vdb1 
[root@westos_nod1 ~] pvs 
[root@westos_nod1 ~] vgs

查看到nod1主机的vdb1磁盘成功建立了westos的VG格式磁盘
在这里插入图片描述
1、查看ansible的lvm部署模块
在这里插入图片描述
查看看到lvs创造的具体的用法
在这里插入图片描述
2、查看pv的位置

[ck@ansible ansible]$ ansible all -m setup |less

在这里插入图片描述
3、设置yml文件

[ck@ansible ansible]$ cat vbd.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 

    - name: debug size message
      debug:
        msg: vg is less than 1500M
      when:
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc != 0

    - name: Create 800M lvm
      lvol:
        lv: exam_lvm
        vg: westos
        size: 800M
      when:
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc != 0
      ignore_errors: yes
      register: OUTPUT_800

    - name: debug 800M message
      debug:
        msg: vg is less than 800M
      when: 
      - ansible_facts['lvm']['vgs']['westos'] is defined
      - OUTPUT.rc != 0
      - OUTPUT_800 != 0



    - name: debug exist message
      debug:
        msg: vg is not exit
      when:
        - ansible_facts['lvm']['vgs']['westos'] is not defined

在这里插入图片描述
在这里插入图片描述
写这个部分的时候,太多的血泪。
写这个思路和写shell的不一样,这个得先做操作,直接进行建立1500M和800M,建立主题部分,再加其他限制条件和输出。
一个是复制相同部分的时候,千万不能多复制空格,不然会报错,但是找不到原因

三、触发器

一、notify、和handlers触发器简介

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

优点:当触发时才执行,比起每次都执行效率更高

二、例题

当执行这个结果时候,会安装下载vsftpd并能匿名用户的登陆
[ck@ansible ansible]$ ansible-playbook vsftpd.yml -e “state=YES”

[ck@ansible ansible]$ cat vsftpd.yml 

//
---
- name: vsftpd service
  hosts: 172.25.42.200
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: latest
      notify:
        - restart vsftp
        - firewalld

    - name: confiugre vsftp
      lineinfile:
        path: /etc/vsftpd/vsftpd.conf
        line: "anonymous_enable={{ state }}"    注意连接紧密,不要空格
        regexp: "^anonymous_enable"
        Bbacker: yes                            匹配到了对应行才更改(可以加,可以不加)
      notify:
        - restart vsftpd

  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
        enabled: yes
    - name: firewalld
      firewalld:
        service: ftp
        state: enabled
        permanent: yes
        immediate: yes
///

图里面 line: “anonymous_enable={{ state }}” 这里不能空格,图中有错误请注意更改
在这里插入图片描述

在这里插入图片描述
成功用匿名用户登陆且查看到信息
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值