目录
写一个简单的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_devices.vdb is defined
always:
- name: create filesystem
filesystem:
dev: /dev/research/data
fstype: ext4