task任务控制

目录

一个简单的shell脚本

自动添加3个用户,分别问:a b c

#!/bin/bash              #此行仅为注释,无特殊含义
for i in a b c;do useradd $i;done

为所有用户添加密码redhat

#!/bin/bash
for a in a b c;
do echo redhat |passwd --stdin $a ;done

playbook的loop循环

---
- name: loop循环
  hosts: all
  tasks:
          - name: create group
            group:
                    name: "{{item.groupname}}"  #其中item表示查找loop

            loop:
                   - groupname: abc
          - name: create user
            user:
                    name: "{{item.username}}"
                    state: present
                    groups: "{{item.group}}"
                    uid: "{{item.uid}}"

            loop:
                    - username: a
                      group: abc
                      uid: 2500
                    - username: b
                      group: abc
                      uid: 2501
                    - username: c
                      uid: 2502
                      group: abc

when的条件写法:

1. 判断变量的值

实例:
生成一个setup

ansible all -m setup >111.txt

判断目标主机缓存空余大小:

---
- name: test
  hosts: all
  tasks:


          - name: 打印空余缓存
            debug:
                       msg: "{{ansible_swapfree_mb}}"

            when: ansible_swapfree_mb > 2000

2.判断变量是否存在

使用"is defined""is undefined"来判断变量是否存在
实例:判断目标主机上是否存在sdb磁盘,如果存在则输出sdb磁盘的大小

msg: "{{ ansible_devices.sdb.size}}"
when: ansible_devices.sdb is defined

3.判断变量是否在指定的列表中

使用 “in” 来判断
判断主机名是否在MysqL组中

when ansible_hostname in group.MysqL

一个完整的实例

1.先创建一个locker.yml
里面创建两个密码,如下图

pw_developer: redhat
pw_manager: redhat

2.再创建一个passwd.txt用来存放加密locker的密码

snfwelknfwlnfknwefdsif(随便输)

3.使用anisble-value命令对locker文件加密

ansible-vault encrypt --vault-password-file=passwd.txt locker.yml

4.vim user_list.yml

aaa:
        - username: eoe
          uid: 3600
          job: a
        - username: pop
          uid: 3691
          job: a

5 vim user.yml

---
- name: 111
  hosts: all
  vars_files:
          - user_list.yml
          - locker.yml
  tasks:
          - name: create group
            group:
                    name: aaa
                    state: present
          - name: create user
            user:
                    name: "{{item.username}}"
                    state: present
                    uid: "{{item.uid}}"
                    password: "{{pw_manager | password_hash('sha512')}}"  #采用hash算法加密pw_manager的密码
            loop: "{{aaa}}"    #调用user_list.yml中的aaa
            when: item.job == 'a' #判断job值是否为a,是则执行create user

handler触发器

一个简单的handler触发器例子:

---
- name: test
  hosts: all
  tasks:
          - name: install httpd
            yum:
                    name: httpd
                    state: present
          - name: start httpd
            service:
                    name: httpd
                    state: started
            notify: stopped httpd

  handlers:
        - name: stopped httpd  #只会触发和notify的name一样的任务
          service:
                  name: httpd
                  state: stopped

        - name: remove httpd  #这里不会触发,因为名称和notify不同
          yum:
                  name: httpd
                  state: remove

异常处理

1.忽略错误

ignore_errors:yes可以忽略错误

2. block块

在Ansible中可以使用block将多个任务定义成一个块,一个block块可以看成是一个组或一个整体,我们可以对整个block块进行条件判断,当条件成立时,块中所有的任务都会被执行。block还可以配合rescue和always使用,rescue可以对block中的任务进行错误捕捉,当block中的任何一个任务出错时,都会执行rescue中的任务。always是无论block块中的任务是否执行成功,都会执行always中的任
务。“当block有错,则执行rescue”

实例1:

对block块进行判断 需求:如果存在磁盘vdb,则在vdb上创建一个4GB分区,如果空间不够4GB,则创建2GB分区。
使用的模块parted:磁盘分区和分区大小调整工具

---
- hosts: all
  tasks:
          - block:
                  - name: create 4GiB part
                    parted:
                            device: /dev/vdb
                            number: 1
                            state: present
                            part_end: 4Gib
            rescue:
                  - name: create 1 GiB part
                    parted:
                            device: /dev/vdb
                            number: 1
                            part_end: 2GiB
                            state: present
                    when: ansible_devices.vdb is defined

实例2:

lvol 创建、删除逻辑卷以及动态改变逻辑卷大小。
创建一个名为/home/devops/ansible/lv.yml的playbook,它将在所有受管节点上运行以执行以下任务:
创建符合以下要求的逻辑卷:
逻辑卷创建在research卷组中
逻辑卷名称为data
逻辑卷大小为1500MiB
使用ext4文件系统格式化逻辑卷
如果无法创建请求的逻辑卷大小,应显示错误信息Could not create logical volume of that size,并且改为使用大小800Mib。
如果卷组research不存在,应显示错误信息Volume group not exist。不要以任何方式挂载逻辑卷

环境搭建:
准备两台虚拟机,分别添加硬盘5G
配置第一台虚拟机

fdisk /dev/sdc
n   #创建
p   #primary
Last sector : +840M
t   #改变分区类型
82  #Linux swap 
t
8e  #Linux LVM
w   #保存退出
pvcreate /dev/sdc1     #创建物理卷sdc1
vgcreate research /dev/sdc1  #创建卷组research

第二台虚拟机配置与第一台配置基本相同,区别仅仅是将主分区大小设为1600M

在任何一台具有ansible服务的虚拟机上进行测试:

---
- name: 111
  hosts: all
  tasks:
          - debug:
                  mgs: "Volume group done not exist"

            when: ansible_lvm.vgs.research is undefined
          - block:
                  - name: create lv1500
                    lvol:
                            vg: research
                            lv: data
                            size: 1500M
            rescue:
                    - debug:
                            msg: "Could not create logical volume of that size"
                    - name: create lv800
                      lvol:
                              vg: research
                              lv: data
                              size: 800M
            when: ansible_lvm.vgs.research is defined
            always:
                  - name: create filesystem
                    filesystem:
                            dev: /dev/research/data
                            fstype: ext4

相关文章

----name:setpublickeyonremotehosts&setreomtehostssud...
环境准备#cat/etcedhat-releaseCentOSLinuxrelease7.9.2009(...
准备好环境,在安装之前请先了解openshift提供的ansible有大...
Ansible:运维工作:系统安装(物理机、虚拟机)-->程序包...
ansible与salt对比相同都是为了同时在多台机器上执行相同的命...
[root@node1playbook]#catnginx.yml-hosts:test\\主...