准备四台虚拟机:
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通
测试建立文件
修改清单文件,将不同主机添加到不同的管控组
赋值列表
loop:
- value1
- value2
- ...
{
{
item}} 迭代变量名称
例如:为node主机建立用户,以下设定方式会报错
应使用 loop 赋值列表,进行迭代
可以看到用户成功建立
也可以通过文件的方式定义变量,以下是错误示例
此时,loop赋值列表下方不能有 -
可以看到用户成功删除
练习,为node主机建立用户,并赋予密码
ansible主机生成加密的密码
循环散列或字典列表的好处在于:可以赋予不同的服务不同的状态;
建立yml文件,实现字典列表的循环,为node主机建立用户,并为不同的用户赋予不同的密码
执行Playbook
建立成功
测试连接
使用注册变量register ,把模块输出结果注册到指定字符串OUTPUT中
为node主机建立文件时,也推荐使用file模块
文件建立成功
此条件代表当两者都满足时
when:
- 条件1
- 条件2
执行playbook
我们通过Ad-Hoc 的方式,利用ansible命令将node1主机/mnt/file文件删除;
再次执行playbook,由于我们yml文件中没有设定忽略错误,当node1主机/mnt/file文件不存在时,rc返回值不为1就会报错
所以,必须加上错误忽略
成功执行playbook
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
///
- 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,也可以使用:
以node2(172.25.254.180)主机为例,首先建立一块大小为1G的磁盘(LVM逻辑卷格式)
创建物理卷 PV 以及名为westos的卷组VG(可以在卷组上创建一个或多个“LVM分区”(逻辑卷))
查看ansible的lvm部署模块
查看lvs创造的具体用法
ansible-doc lvol | less
ansible all -m setup |less
[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
node主机查看端口
执行playbook,设定httpd开放端口为8080,此时只有触发器会做出改变,变为黄色
node主机查看端口
测试:
当执行 ansible-playbook vsftpd.yml -e “state=YES” 时,为node主机安装下载vsftpd,并允许匿名用户能够登陆。
执行playbook,设定匿名用户可以访问
成功用匿名用户登陆且查看到信息
执行playbook,设定匿名用户不能访问;
可以看到触发器(两个)的触发情况
可以看到,此时匿名用户无法登录ftp
作用: 当play遇到任务失败时会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
例如,我们要为node主机安装一个不存在的服务westos
执行playbook会报错
加入ignore_errors参数
将会忽略任务失败使下面的任务继续运行
执行成功
作用: 当任务失败后play被终止也会调用触发器进程;
通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
去掉ignore_errors参数,加入force_handlers参数
可以看到执行playbook时会报错,但是仍然调用了触发器进程(restart vsftpd)
当我们再次执行playbook时,由于ftp已经安装,因此安装模块将不做改变(为绿色)
作用: 控制任务在何时报告它已进行更改;
在安装模块加入changed_when参数
此时再次执行playbook时,虽然ftp已经安装,但是安装模块为黄色
再次通过Ad-Hoc ,利用ansible命令直接删除node主机的ftp服务
设定changed_when为false,控制任务在进行更改时不报告;
当我们再次执行playbook时,虽然ftp在这之前未被安装,但安装模块仍然显示为绿色
作用:当符合条件时强制任务失败
继续编辑yml文件,加入shell指令
执行playbook
加入failed_when参数
此时再次执行playbook,报错
继续编辑yml文件,加上之前安装westos(不存在的包)模块;
设定failed_when参数未false
此时,执行playbook成功,无报错
继续编辑yml文件;
设定failed_when: “‘hello’ in westos.stdout”
执行playbook,报错
当设定输出的是westos时
执行playbook,成功
block: 定义要运行的任务
rescue: 定义当block句子中出现失败任务后运行的任务
always: 定义最终独立运行的任务
示例:
执行playbook,node1主机(170)的/mnt目录下不存在file文件,因此执行会报错,进入rescue模块