一、Ansible概述
Ansible是近年越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为的失误。Ansible通过本身集成的非常丰富的模块实现各种管理任务,其自带模块超过上千个。更为重要的是,它的操作非常简单,即使新手也比较容易上手,但它提供的功能却非常丰富,在运维领域,它几乎可以做任何事情。
1. Ansible特点
- Ansible基于Python开发,运维工程师对其二次开发相对较容易
- Ansibled丰富的内置模块,基本可以满足一切需求
- 管理模式非常简单,一条命令可以影响上千台机器
- 无客户端模式,底层通过SSH通信。
- Ansible发布后,也陆续被AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接纳并投入使用。
2. 使用者
Ansible 使用者可以采用多种方式和Ansible交互,图中为我们展示了四种方式:
-
CMDB:CMDB存储和管理着企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标。
-
PUBLIC/PRIVATE方式:Ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行。
-
AD-Hoc命令集:Users直接通过AD-Hoc命令集调用Ansible工具集来完成任务。
-
PlayBooks:Users预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集,按序执行任务。
3. Ansible工具集
Ansible工具集包含Inventory、Modules、Plugins和API。其中,Inverntory用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins提供了各种附加功能;API为编程人员提供一个接口,可以基于此做Ansible的二次开发。具体表现如下。
- Ansible Playbooks:任务脚本,编排定义Ansible 任务集的配置文件,由Ansible按序依次执行,通常是JSON格式的yml文件。
- Inventory:Ansible管理水机清单
- Modules:Ansible执行命令功能模块,多数为内置的核心模块,也可以自定义。
- Plugins:模块功能的补充,如连接类型插件,循环插件、变量插件、过滤插件等,该功能不常用。
- API:供第三方程序调用的应用程序编程接口
- Ansible:该部分图中表示得不明显,组合Inventory、API、Modules、Plugins可以理解为是Ansible命令工具,其为核心执行工具。
4. 作用对象
Ansible的作用对象不仅仅是Linux和非Linux操作系统的主机,也可以作用于各类Public/Private,商业和非商业设备的网络设施。
二、Ansible的配置
演示环境
主机 | 系统 | 网卡 | IP |
---|---|---|---|
Ansible | Centos7 64bit | vmnet1,桥接 | vmnet1:192.168.100.100,Bridge:dhcp |
Client | Centos7 64bit | vmnet1,桥接 | vmnet1:192.168.100.101,Bridge:dhcp |
- 注:因安装Ansible采用网络源安装,所以需要网络支持
Ansible安装
#1.通过网络yum安装Ansible
#备份系统中的yum源
[root@ansible ~]# cd /etc/yum.repos.d/
[root@ansible yum.repos.d]# mkdir bak
[root@ansible yum.repos.d]# mv *.repo bak/
#下载阿里源
[root@ansible yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
#下载epel源
[root@ansible yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#YUM安装Ansible
[root@ansible yum.repos.d]# yum -y install ansible
创建SSH免交互登录
# 创建SSH密钥对
[root@ansible ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //密钥对存放位置,默认回车
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:2Rkt6cIRSlmwYwi1OOpoY/HrknxbcEnO32L/j6W2xbM root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| ... o+o |
| o +.o . o |
| o o.= . + . |
| . .+..o = + |
|.. . = S + |
|o o o . .. . |
|o=.. . + . = |
|o+..o . o .= o |
| ++. .o=oE |
+----[SHA256]-----+
#复制秘钥对到客户端
[root@ansible ~]# ssh-copy-id root@192.168.100.101
#登录验证
[root@ansible ~]# ssh root@192.168.100.101
Last login: Tue Dec 1 16:32:18 2020 from 192.168.100.1
[root@client ~]#
到此,已经完成Ansible的部署,下面就可以通过Ansible对设备进行管理了。
Ansible配置
Inventory 是Ansible管理主机信息的配置文件,相当于系统Hosts文件的功能,默认存放在/etc/ansible/hosts。在hosts文件中,通过分组来组织设备,Ansible通过Inventory来定义主机和分组,通过在Ansible命令中使用选项
-i
或--inventory-file
指定Inventory
可以将同一个主机同时归置在多个不同的组中
Inventory配置
#更改客户端分组
[root@ansible ~]# vim /etc/ansible/hosts
......//省略部分内容
[testhost] //分组名称
192.168.100.101 //客户端ip,也可以写主机名
192.168.100.102 //不存在的客户端,用于测试
Inventory使用
#指定Invertory配置文件
[root@ansible ~]# ansible -i /etc/ansible/hosts testhost -m ping
192.168.100.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.100.102 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.102 port 22: No route to host",
"unreachable": true
}
#默认文件位置/etc/ansible/hosts,可省略
[root@ansible ~]# ansible testhost -m ping
192.168.100.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.100.102 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.102 port 22: No route to host",
"unreachable": true
}
#只对192.168.100.101主机操作,通过IP限定主机的变更
[root@ansible ~]# ansible testhost -m ping --limit "192.168.100.101"
192.168.100.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping":