自动化运维工具-Ansible基础
自动化运维工具-Ansible基础
Ansible基本概述
什么是Ansible?
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率
同类型软件对比
-
puppet
- 学习难,安装ruby环境难,没有远程执行功能
-
ansible
- 轻量级,大规模环境下只通过ssh会很慢,串行的
-
saltstack
- 一般选择salt会使用C/S结构的模式,salt-master和salt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消息队列
自动化运维时代
应用一:批量命令执行
应用二:批量安装服务
应用三:批量配置同步
应用四:批量任务执行
应用五:批量代码部署
自动化运维工具的优势
- 提高工作效率
- 提高工作准确度
- 减少维护成本
- 减少重复性工作
Ansible的功能及优点
1.远程执行
批量执行远程命令,可以对多台主机进行远程操作
2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack
.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。
5.二次开发
因为语法是Python,所以便于运维进行二次开发。
6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务
在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd
在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx
缺点
1.受到ssh服务的限制
2.串行处理,规模较大时速度较慢
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
环境准备
主机名 | 角色 | 外网IP | 内网IP |
---|---|---|---|
m01 | Ansible管理端 | 10.0.0.61 | 172.16.1.61 |
web01 | Ansible被管理端 | 10.0.0.7 | 172.16.1.7 |
web02 | Ansible被管理端 | 10.0.0.8 | 172.16.1.8 |
lb01 | Ansible被管理端 | 10.0.0.5 | 172.16.1.5 |
lb02 | Ansible被管理端 | 10.0.0.6 | 172.16.1.6 |
db01 | Ansible被管理端 | 10.0.0.51 | 172.16.1.51 |
安装Ansible
# 管理端安装
[root@m01 ~]$ yum install -y ansible
# 检查版本
[root@m01 ~]$ ansible --version
ansible 2.9.23
# ansible配置文件
[root@m01 ~]$ vim /etc/ansible/ansible.cfg
Ansible配置文件读取顺序
[root@m01 ~]$ rpm -ql ansible
[root@m01 ~]$ zcat /usr/share/man/man1/ansible-config.1.gz
#要查看完整列表,请访问https://docs.ansibe.com/或使用ansibe-config命令。
For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the \fIansible\-config\fP command.
#/etc/ansible/ansible.cfg 默认配置文件,如果存在则使用
/etc/ansible/ansible.cfg \-\- Config file, used if present
#~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
~/.ansible.cfg \-\- User config file, overrides the default config if present
#\&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。
\&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present.
#如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all others.
1、$ANSIBLE_CONFIG:环境变量
2、./ansible.cfg:当前工作目录(配置ansible的目录,自定义)中配置文件
3、~/.ansible.cfg:当前用户家目录中配置文件
4、/etc/ansible/ansible.cfg:默认配置文件目录
Ansible配置文件详解
[root@m01 ~]$ vim /etc/ansible/ansible.cfg
文件中的注释表示的是默认配置,去掉注释可以手动配置
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户(用其他用户容易出现权限不足的情况)
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码(不用关闭,后面可配置)
#ask_pass = True #每次执行是否询问ssh密码(不用关闭,后面可配置)
#remote_port = 22 #远程主机端口
# 优化ansible配置文件
host_key_checking = False #跳过检查主机指纹(类似利用ssh远程连接时的交互)
log_path = /var/log/ansible.log #打开ansible日志
配置Ansible清单文件
/etc/ansible/hosts是ansible默认主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。Inventory文件中填写需要被管理的主机与主机组信息。还可以自定义Inventory主机清单的位置,使用-i指定文件位置即可。
场景一:基于密码连接
[root@m01 ~]$ vim /etc/ansible/hosts
# 方式一:IP+端口+用户+密码
## 被管理主机组名
[wj_web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
[wj_db]
172.16.1.51 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
[wj_lb]
172.16.1.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.6 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
缺点:密码明文,且实际生产中主机密码不可能一样
-------------------------------------------------------------------------------
# 方式二:主机名+密码
[webs]
## 表示web01:web02
web0[1:2] ansible_ssh_pass='123456'
-------------------------------------------------------------------------------
# 方式三:主机+端口+密码
[webs]
web0[1:2]
## 表示定义一个变量,webs这个组所有主机均调用
[webs:vars]
ansible_ssh_pass='123456'
ansible_ssh_port=22
ansible_ssh_user=root
场景二:基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端
# 1.创建密钥对
[root@m01 ~]$ ssh-keygen
# 2.将公钥推送至被管理端
[root@m01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5
[root@m01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.6
[root@m01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51
# 方式一、主机+端口+密钥
[root@m01 ~]$ vim /etc/ansible/hosts
[webs]
10.0.0.7:22
10.0.0.8:22
## 远程控制执行命令时,还是会显示IP,服务器数量很多时根本分不清IP对应的机器
[root@m01 ~]$ ansible webs -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"
}
------------------------------------------------------------------------
# 方式二、别名+主机+密钥
[root@m01 ~]$ vim /etc/ansible/hosts
## 这里需要注意:被管理主机组名不能和主机名一样
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[lb_group]
lb01 ansible_ssh_host=172.16.1.5
lb02 ansible_ssh_host=172.16.1.6
[db_group]
db01 ansible_ssh_host=172.16.1.51
## 远程控制执行命令时,显示的就是主机名了
[root@m01 ~]$ ansible web_group -m ping
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
场景三:主机组使用方式
[root@m01 ~]$ vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[lb_group]
lb01 ansible_ssh_host=172.16.1.5
lb02 ansible_ssh_host=172.16.1.6
[db_group]
db01 ansible_ssh_host=172.16.1.51
# 查看指定被管理组内的主机数
[root@m01 ~]$ ansible web_group -m ping -i /etc/ansible/hosts --list-host
hosts (2):
web01
web02
# 定义多组整合
## lnmp组包含了两个子组[web,lb]
[root@m01 ~]$ vim /etc/ansible/hosts
[lnmp:children]
web_group
lb_group
## 查看整合后的组内主机数
[root@m01 ~]$ ansible lnmp -m ping -i /etc/ansible/hosts --list-host
hosts (4):
web01
web02
lb01
lb02
# 最终配置文件
[root@m01 ~]$ vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[lb_group]
lb01 ansible_ssh_host=172.16.1.5
lb02 ansible_ssh_host=172.16.1.6
[db_group]
db01 ansible_ssh_host=172.16.1.51
[lnmp:children]
web_group
lb_group