自动化运维工具-Ansible基础
CMDB资产管理系统
Ansible基本概述
什么是Ansible
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
Ansible同款软件
- Ansible Python2 基于SSH协议
- Saltstack Python2和Python3 可以基于SSH协议也可以基于客户端TCP协议
- Puppet Ruby
Ansible的优点
- 远程执行
- 批量执行远程命令,可以对多台主机进行远程操作
- 配置管理
- 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
- 事件驱动
- 通过Ansible的模块,对服务进行不同的事件驱动
- 比如:
- 1)修改配置后重启
- 2)只修改配置文件,不重启
- 3)修改配置文件后,重新加载
- 4)远程启停服务管理
- 管理公有云
- 通过API接口的方式管理公有云,不过这方面做的不如saltstack. saltstack本身可以通过saltcloud管理各大云厂商的云平台。
- 二次开发
- 因为语法是Python,所以便于运维进行二次开发。
- 任务编排
- 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
- 跨平台,跨系统
- 几乎不受到平台和系统的限制,比如安装
apache
和启动服务 - 在Ubuntu上安装apache服务名字叫apache2
- 在CentOS上安装apache服务名字叫httpd
- 在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
- 在CentOS7上启动服务器使用命令:systemctl start nginx
- 几乎不受到平台和系统的限制,比如安装
Ansible的架构
1、连接插件connection plugins
用于连接主机 用来连接被管理端
2、核心模块core modules
连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块custom modules
根据自己的需求编写具体的模块
4、插件plugins
完成模块功能的补充
5、剧本playbookansible
的配置文件,将多个任务定义在剧本中,由ansible
自动执行
6、主机清单inventor
定义ansible
需要操作主机的范围 最重要的一点是 ansible
是模块化的 它所有的操作都依赖于模块
Ansible的执行流程
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
安装Ansible
环境准备
主机名 | WanIP | LanIP | 角色 |
---|---|---|---|
m01 | 10.0.0.61 | 172.16.1.61 | Ansible控制端 |
web01 | 10.0.0.7 | 172.16.1.7 | Ansible被控端 |
web02 | 10.0.0.8 | 172.16.1.8 | Ansible被控端 |
... | ... | ... | Ansible被控端 |
# 1.安装ansible(m01)
yum install -y ansible
# 2.ansible版本信息
[root@m01 ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
# 3.修改配置文件
vim /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts // 主机清单
#library = /usr/share/my_modules/ // 库文件路径
#module_utils = /usr/share/my_module_utils/ // 模块文件
#remote_tmp = ~/.ansible/tmp // 远端临时文件
#local_tmp = ~/.ansible/tmp // 本地临时文件
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml // 插件配置文件
#sudo_user = root // 远程执行用户
#remote_port = 22 // 远端端口
host_key_checking = False // 指纹检测(只修改这一条)
# 4.编写主机清单(inventor)
vim /etc/ansible/hosts
[lb_group]
10.0.0.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.6 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
[web_group]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
# 5.检查ansible主机是否通
[root@m01 ~]# ansible web_group -m ping
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
##ansible默认所有分组是否通
[root@m01 ~]# ansible all -m ping
## 使用主机名编写主机清单
[lb_group]
lb01 ansible_ssh_host='10.0.0.5' ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
lb02 ansible_ssh_host='10.0.0.6' ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
## 使用密钥连接
[root@m01 ~]# rm -fr ~/.ssh
[root@m01 ~]# ssh-keygen
### 跳过指纹验证
[root@m01 ~]# yum install -y sshpass
ssh -o StrictHostKeyChecking=no 10.0.0.5
## 免密发送公钥脚本
[root@m01 ~]# cat ssh_key.sh
#!/bin/bash
. /etc/init.d/functions
for num in 5 6 7 8 9 31 41 51 61;do
ping -W1 -c1 10.0.0.$num &>/dev/null
if [ $? -eq 0 ];then
sshpass -p '1' ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub root@10.0.0.$num &>/dev/null
action "主机:10.0.0.$num" /bin/true
else
action "主机:10.0.0.$num" /bin/false
fi
done
## 免密后编写主机清单(终级)
[lb_group]
lb01 ansible_ssh_host='10.0.0.5'
lb02 ansible_ssh_host='10.0.0.6'
[web_group]
web01 ansible_ssh_host='10.0.0.7'
web02 ansible_ssh_host='10.0.0.8'
# 主机清单使用分组
vim /etc/ansible/hosts
[lb_group]
lb01 ansible_ssh_host='10.0.0.5'
lb02 ansible_ssh_host='10.0.0.6'
[web_group]
web01 ansible_ssh_host='10.0.0.7'
web02 ansible_ssh_host='10.0.0.8'
[db_group]
db01 ansible_ssh_host='10.0.0.51'
[wd:children] (总分组)
web_group
lb_group
# 只需使用wd就可以使用web与lb组
ansible wd -m ping
ansible命令的选项
--version : 查看版本信息
-m : 指定模块
-a : 指定动作
-C : 测试命令执行
-i : 指定主机清单
-T : 指定超时时间
[root@m01 ~]# ansible webs -m ping -i /opt/zjqd (从/opt下的zjqd清单,获取主机清单)
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web01_zls | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": false,
"ping": "pong"
}