1、定义
基于python开发的一个配置管理和应用部署工具,在自动化运维中异军突起,类似于xshell一键输入的工具,不需要每次都切换主机进行操作,只要有一台ansible的固定主机,就可以实现所有节点的操作。不需要agent客户端,只需要一台主机上配置ansible即可。ansible基于模块进行工作,只是提供一种运行架构,真正执行操作、变更的是asible的模块来实现的
2、作用
①远程操作主机功能
②自动化运维
③批量配置、部署、管理上千台主机
3、如何实现通信
asible默认通过ssh的密钥对实现通信(可以改)
4、ansible的另一个特点
所有模块都是幂等性
幂等性:多次操作或多次执行对系统资源的影响是一致的
是幂等性 | 不是幂等性 |
http get …… | http post(多次执行相同的post可能会创建相同的资源) …… |
systemctl stop firewalld …… | systemctl restart firewalld …… |
只要发现要停止的目标服务已经停止了,后续同样的操作,不会改变任何结果,什么也不做 |
ansible的幂等性,决定了可以放心大胆使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况下)
5、ansible的四大组件
(1)inventory主机清单(主机组):定义ansible可以远程操作的服务器
(2)模块:13个常用的模块。通过模块实现远程配置和操作
(3)Plugins插件
(4)Playbook剧本(shell脚本):yaml格式
6、ansible的优点
(1)部署简单,只要在控制主机部署即可,被控制主机需要有ssh和python2.5以上版本,基本上linux都是自带的这两个条件
(2)ansible只能控制linux系统,windows系统不行
(3)基于模块工作,可以使用任意语言开发模块(二次开发底层架构)
安装ansible实验
主机名 | 作用 | IP地址 | 服务 |
test1 | 管理端 | 20.0.0.10 | ansible |
test2 | 被管理端 | 20.0.0.20 | / |
test3 | 20.0.0.30 | / |
1、安装epel源、ansible、tree服务
ansible.cfg | ansible的主配置文件(一般不动) |
hosts | 主机组,声明可以被控制的主机 |
roles | 公共角色目录(一般不用) |
2、修改ansible配置文件
配置主机有两种方式:
①直接声明主机的IP地址(最常用)
②主机名(一定要在/etc/hosts中做映射)
3、生成密钥对
ssh-keygen -t rsa
4、把密钥对传给对应主机
被管理端同样如此
ansible安装完成
5、测试
ansible 20.0.0.20 -m command -a 'date'
tail -f /var/log/messages
①指定IP地址(只会在目标主机执行)
ansible 20.0.0.20 -m command -a 'ls /opt'
②指定执行组(组内所有声明的主机都会执行)
ansible dbservers -m command -a 'ls /opt'(dbservers是组名)
③所有声明的主机都会执行
ansible all -m command -a 'ls /opt'
ansible 20.0.0.20 -a 'ls /opt'
#不加-m也就是不声明使用的模块,默认是command模块
7、ansible的命令格式
ansible 组名/IP地址 -m 模块名称 -a ‘参数列表(执行命令)’
8、ansible的13个模块
(1)模块1:command模块:默认模块。在远程主机执行linux命令,不支持管道符及重定向输出
command常用参数 | |
chdir | 在远程主机上运行命令,提前进入目录(先进入目录再执行命令) |
creates | 判断指定文件是否存在,若存在不执行后续操作 |
removes | 判断指定文件是否存在,若存在执行后续操作 |
(2)模块2:shell模块:在远程主机执行命令,相当于调用远程主机的shell进程,支持管道符和重定向
实题1:创建用户并加密
测试:
实题2:过滤出IP地址
注意:在ansible中,多个引号要做隔离
&&表示逻辑且,前一个命令执行成功才会执行后一个命令
;表示逻辑或,前面成功与否,后面的命令都会执行
实题3:指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash
ifconfig,然后运行这个脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/jiaoben.sh ; sh /opt/jiaoben.sh'
-e 表示换行
实题4:两个数相加,运行脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/jiaoben.sh ; sh /opt/jiaoben.sh'
(3)模块3:cron模块:远程给主机设置定时任务
两种状态:
①present表示添加(默认,可以省略)
②absent表示移除(absent在整个ansible语法中都表示移除)
分 | 时 | 日 | 月 | 周 |
minute | hour | day | month | weekday |
job | 任务执行的命令 |
name | 任务计划的名称(可以不加) |
实题1:创建定时任务,每隔5分钟执行ls /opt,任务名称test1
ansible 20.0.0.20 -m cron -a 'minute="*/5" job="ls /opt" name="test1"'
实题2:9月1号早上8点三十分,执行ls /opt,任务名称test3
ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test3"'
实题3:周三下午14:30分,执行ls /opt
ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="*/3" job="ls /opt"'
实题4:删除定时任务
ansible 20.0.0.20 -m cron -a 'name=test1 state=absent'
ansible 20.0.0.20 -m cron -a 'name=None state=absent'
注意:多个计划任务,如果不指定名称,一旦删除None,多个None均删除,不建议使用,一定要指定任务名称
(4)模块4:user模块:用户管理模块
user模块常用参数 | |
name | 指定用户名(必须加) |
state | =present创建用户(默认,可以不加) =absent删除用户(必须加) |
system | =yes用户是一个程序用户 n=o用户不是一个程序用户 |
uid | 用户的唯一标识 |
group | 用户所在组 |
create_home | =yes替换用户的家目录 =no不替换用户的家目录(可以不加) |
password | 创建用户的密码 |
comment | 用户的注释信息(可有可无) |
remove | =yes删除用户的家目录(相当于userdel -r) 不需要删除用户的家目录,可以不写 |
注:使用ansible的user模块创建用户时,若创建普通用户可以不加system=yes和shell类型,默认是/bin/bash;若创建程序用户,一定要声明system=yes和shell=/sbin/nologin,也可以指定uid方式,给用户分配一个uid |
实题1:创建一个程序用户yyy
程序用户uid范围1-999
普通用户1000开始
注意:在创建用户时,虽然声明一个程序用户,但默认的登录shell没有额外声明,但还是默认的/bin/bash,uid还是会安装程序用户来指定
实题2:远程创建用户,指定uid,创建密码和家目录
实题3:修改用户的家目录
实题4:删除用户并删除其家目录
ansible 20.0.0.20 -m user -a 'name=ttt remove=yes state=absent'
测试
(5)模块5:group模块:用户组的管理模块
group常用参数 | |
name | 指定名称(必须加) |
gid | 设置组的id |
实题1:创建用户添加到指定组中
ansible 20.0.0.20 -m user -a 'name=rrrrr uid=1011 group=ppp'
实题2:删除组(若组里有用户,先删除用户再删除组)
ansible 20.0.0.20 -m group -a 'name=ppp state=absent'
(6)模块6:ping模块:测试主机之间的连通性
ansible all -m ping