Ansible自动化运维工具
1、为什么会有自动化运维软件的出现?
由于互联网的快速发展导致产品更新换代的速度逐渐加快,运维人员每天都要进行大量的维护操作,依旧按照传统的方式进行维护会使工作效率低下。这时候,自动化运维软件的产生很好的解决了这样的一个问题,尽可能的安全高效的完成运维工作。
2、自动化运维软件有哪些分类?
一般我们把自动化运维工具划分为两类:一类是需要使用代理工具,也就是基于专用的Agent程序来完成管理功能,如:Puppet,Func,Zabbix等;另一类是不需要配置代理工具的,可以基于SSH服务来完成管理功能,如:Ansible、Fabric等。
3、Ansible的什么优点能够脱颖而出?
ansible是基于Python开发,集合众多运维工具的优点,实现批量运行命令,部署程序,配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。
4、Ansible的核心组件
●ansible核心引擎
●host inventory主机清单:用于定于ansible所管理的主机,默认在ansible配置文件中定义被管理的主机,同时也支持自定义动态管理主机清单和指定配置文件的位置。
●connection plugins连接插件:负责和被管理的主机实现通讯。除支持使用SSH连接到主机外,ansible还支持其他连接的方式,所以需要有连接插件将各个主机用连接插件连接到ansible。
●playbook剧本:用于集中定义ansible任务的配置文件,即将多个任务定义在一个剧本中有ansible自动执行,可以控制主机针对多台被管理主机运行多个任务。
●core modules核心模块:是ansible自带的模块,使用这些模块将资源分发到被管理主机,是其执行特定的任务或匹配特定的状态。
●custom modules自定义模块:用于完成模块功能的补充,可以借助相关插件完成记录日志、发送邮件等功能。
5、Ansible架构
图片转自大佬博客:https://blog.51cto.com/191226139/2066936
安装部署Ansible服务
ansible案例环境
角色 | 操作系统 | IP地址 | 组名 |
控制主机 | Centos7 | 192.168.71.128 | |
被管理主机 | Centos7 | 192.168.71.129 | web |
被管理主机 | Centos7 | 192.168.71.130 | mysql |
1、安装ansible
本案例使用centos7操作系统,通过yum安装ansible,需要依赖第三方的epel源。
[root@bogon ~]# yum install epel-release -y
[root@bogon ~]# yum install ansible -y
[root@bogon ~]# ansible --version #查看ansible版本号
[root@bogon ~]# yum install tree -y #安装tree工具,查看ansible文件组成
[root@bogon ~]# tree /etc/ansible
2、配置主机清单
Asible通过读取默认主机清单 /etc/ansible/hosts文件,修改主机与组配置后,可同时连接到多个被管理的主机上执行任务。
[root@bogon ~]# vim /etc/ansible/hosts
3、设置SSH协议生成秘钥连接
[root@bogon ~]# ssh-keygen -t rsa #设置rsa不对称秘钥
Generating public/private rsa key pair. #回车
Enter file in which to save the key (/root/.ssh/id_rsa): #秘钥保存位置在root目录下,使用ls -la命令可查看到./ssh文件
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #输入秘钥密码
Enter same passphrase again: #再次确认密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hZDkiN37NzohGKRu+Z+eoRXozPnOOhjQFYyBHGNOwTA root@bogon
The key's randomart image is:
+---[RSA 2048]----+
|EB++.oo. |
|=+oo++.. . |
| o.+o o . . |
|. o .. . . |
| o ..oo S |
| =+...o. |
| . += o...o |
| . o= +.o . |
| o*O .. |
+----[SHA256]-----+
4、推送秘钥到被管理主机
[root@bogon ~]# ssh-copy-id [email protected] #使用ssh-copy-id命令进行推送
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.71.129 (192.168.71.129)' can't be established.
ECDSA key fingerprint is SHA256:xN0OXAGFTp+l2+pApp3nbZOERwU80gPh38NZZWat55w.
ECDSA key fingerprint is MD5:59:30:06:88:69:6f:4b:ae:dc:35:50:f1:a6:51:d6:4a.
Are you sure you want to continue connecting (yes/no)? yes #是否建立连接,yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: #输入被控制主机的密码
5、使用ssh-agent代理免密操作
[root@bogon ~]# ssh-agent bash
[root@bogon ~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa: #秘钥密码
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
Ansible应用命令基础
1、查看模块及相关模块命令
[root@bogon ~]# ansible-doc -l #查看ansible所有模块,q退出
[root@bogon ~]# ansible-doc -s command #查看command模块的用法
2、conmand模块
格式:ansible+组名 -m 指定模块 -a '命令’
[root@bogon ~]# ansible web -m command -a 'date' #使用command查看web组下的主机的时间
192.168.71.129 | CHANGED | rc=0 >>
2018年 10月 19日 星期五 22:34:23 CST
3、cron模块
Ansible中cron模块用于定义任务计划。其中有两种状态(state):present表示添加,absent表示移除
[root@bogon ~]# ansible web -m cron -a 'minute="*/1" job="/usr/bin/echo hello" name="test"' #每一分钟输出一个hello,人物名为test
192.168.71.129 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"test"
]
}
[root@bogon ~]# ansible web -m cron -a 'name="test" state=absent' #移除任务
192.168.71.129 | CHANGED => {
"changed": true,
"envs": [],
"jobs": []
}
4、user模块
Ansible中的user模块用于创建新用户和更改、删除已存在的用户。其中name选项用来知名创建用户的名称。
[root@bogon ~]# ansible all -m user -a 'name="test01" system=yes' #all指定所有组,name=test01,system=yes固定参数。
192.168.71.129 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 985,
"home": "/home/test01",
"name": "test01",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 990
}
192.168.71.130 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 985,
"home": "/home/test01",
"name": "test01",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 990
}
[root@bogon ~]# ansible web -m user -a 'name="test01" state=absent' #state=absent,删除test01用户。
192.168.71.129 | CHANGED => {
"changed": true,
"force": false,
"name": "test01",
"remove": false,
"state": "absent"
}
5、group模块
group模块请求的是groupadd,groupdel,groupmod 三个指令
[root@bogon ~]# ansible mysql -m group -a 'name=mysql system=yes' #创建mysql组
192.168.71.130 | CHANGED => {
"changed": true,
"gid": 984,
"name": "mysql",
"state": "present",
"system": true
}
[root@bogon ~]# ansible mysql -m user -a 'name=test02 uid=1001 group=mysql system=yes' 创建用户,name指定用户名称,uid自定义,加入group组中。
192.168.71.130 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 984,
"home": "/home/test02",
"name": "test02",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 1001
}
6、copy模块
可以用来copy文件和写入信息到指定文件中
[root@bogon ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bk owner=test02 mode=644' #复制/etc/fstab文件到被控制主机下的/opt目录下改名为fstab.bk 属主为test02 权限644
192.168.71.130 | CHANGED => {
"changed": true,
"checksum": "e8641c5e427d241ea0cc641d8545b86205b803a8",
"dest": "/opt/fstab.bk",
"gid": 0,
"group": "root",
"md5sum": "3394e646a6032f7fcb08007f466bac35",
"mode": "0644",
"owner": "test02",
"secontext": "system_u:object_r:usr_t:s0",
"size": 617,
"src": "/root/.ansible/tmp/ansible-tmp-1539933819.19-164467458307203/source",
"state": "file",
"uid": 1001
}
[root@bogon ~]# ansible mysql -m copy -a 'content="this is test" dest=/opt/fstab.bk' #写入一段话到被控制主机/opt/fstab文件中
192.168.71.130 | CHANGED => {
"changed": true,
"checksum": "b6794b2000d94d348203d0279c2e7322b922cb16",
"dest": "/opt/fstab.bk",
"gid": 0,
"group": "root",
"md5sum": "8c6d115258631625b625486f81b09532",
"mode": "0644",
"owner": "test02",
"secontext": "system_u:object_r:usr_t:s0",
"size": 12,
"src": "/root/.ansible/tmp/ansible-tmp-1539933966.74-136016829845719/source",
"state": "file",
"uid": 1001
}
7、file模块
用来创建文件、目录和修改属主属组及权限
[root@bogon ~]# ansible web -m user -a 'name="test" system=yes' #创建test用户
[root@bogon ~]# ansible web -m group -a 'name="test" system=yes' #创建test组
[root@bogon ~]# ansible web -m file -a 'path=/opt/fstab.bk owner=test group=test mode=666' #修改控制主机下/opt/fstab.bk文件属主属组和权限
192.168.71.129 | CHANGED => {
"changed": true,
"gid": 984,
"group": "test",
"mode": "0666",
"owner": "test",
"path": "/opt/fstab.bk",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 617,
"state": "file",
"uid": 989
}
[root@bogon ~]# ansible web -m file -a 'path=/opt/file.txt state=touch' #创建空文件file.txt
192.168.71.129 | CHANGED => {
"changed": true,
"dest": "/opt/file.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 0,
"state": "file",
"uid": 0
}
[root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=directory mode=755' #创建目录
192.168.71.129 | CHANGED => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/opt/temp",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=absent' #删除目录,删除文件同理
192.168.71.129 | CHANGED => {
"changed": true,
"path": "/opt/temp",
"state": "absent"
8、yum模块
用yum模块给被控制主机一键安装众多服务
[root@bogon ~]# ansible all -m yum -a 'name=httpd' #所有被控制主机yum安装httpd
ansible web -m yum -a 'name=httpd state=absent' #卸载服务
9、service模块
启动、关闭、查看服务状态
ansible web -a 'systemctl status httpd' #查看服务状态
ansible web -a 'systemctl start httpd' #开启服务
ansible web -a 'systemctl stopped httpd' #关闭服务
10 shell模块
[root@bogon ~]# ansible web -m user -a 'name=jerry' #创建jerry用户
192.168.71.129 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/jerry",
"name": "jerry",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
[root@bogon ~]# ansible web -m shell -a 'echo 123123 | passwd --stdin jerry' #使用shell模块更改jerry用户密码
192.168.71.129 | CHANGED | rc=0 >>
更改用户 jerry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
11、script模块
vim /opt/abc.txt #创建一个shell脚本
#!/bin/bash
echo "this is test"> /opt/abc
ansible mysql -m script -a '/opt/abc.sh' #使用script模块可以让被控制主机去执行该shell脚本
12、setup模块
ansible mysql -m setup #查看被控制主机信息
13、ping模块
[root@bogon ~]# ansible web -m ping #查看被控制主机网络情况
192.168.71.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}