开发者学堂课程【自动化运维工具 Ansible 实战: Ansible 工作架构和原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/577/detail/7974
Ansible 工作架构和原理
内容介绍
一、常用自动化运维工具
二、Ansible 发展史
三、Ansible 特性
四、Ansible 架构
五、Ansible 主要组成部分
六、安装
七、安装实例
八、相关文件
九、主机清单 inventory
一、常用自动化运维工具
在安装系统时,可以实现操作系统的自动部署自动安装,但在生产中的环境是多变的,之后要根据不同的环境来加装系统软件,那自动化运维工具就派上了用场。
IAAS 是买虚拟机时给了一个虚拟机的硬件环境,相当优越,只需在上面部署希望部署的系统,后续的安装以及软件的配置都需要自己操作,
PAAS 是硬件和开发环境都给提供,这样可以直接在上面做相应的开发做一些相应工作,不需要从头到尾去部署系统,相对而言也是比较方便。
SAAS 是包括硬件、软件、操作系统、开发环境都做完,甚至软件都做好了就拿过来用就行,目前很多软件都是基于 SAAS。
首先配置两台虚拟机,当在多个虚拟机中要执行某一操作,如想在两个虚拟机中执行ls命令,在不用 ansible 时可以右键最下面窗口选择 command window,会新生成一个窗口,在窗口中输入 ls 右键选 send commands to all sessions 就可以在窗口所有虚拟机中执行,这样虽然可以批量执行,但是有些不通虚拟机的细微操作无法完成,至就要用到 ansible。
常用运维工具如下:
1、Ansible:python,Agentless,中小型应用环境(一般主机少)。
2、Saltstack:python, 一般需部署 agent(需要代理),执行效率更高(一般适合主机多)。
3、Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境。
4、Fabric:python, agentless。
5、Chef:ruby,国内应用少。
6、Cfengine
7、func
Ansible 是基于 python 来开发的,它与 Saltstack 区别是一般不需要配置代理,之前学过软件是基于 c/s 结构的,有客服端和服务器,有多个客户端访问服务器,现在运维工具是一个主机去控制多个主机,这一个主机就是主控端,被控制的就是被控端,被控端实现控制要么靠被控制软件就是代理,要么就是用无代理程序(如Ansible 的 SSH 服务),Saltstack 需部署代理 agent,但 Saltstac 功能要更强大,这就是为什么 Ansible 适合中小型应用环境。
思考若公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。
公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的解决方案?
这时 ansible 就发挥了巨大作用。
二、Ansible 发展史
Ansible 创始人, MichaelDeHaan ( Cobbler 与 Func 的作者)
2012-03-09,发布0.0.1版,红帽收购,2015-10-17,Red Hat 宣布收购。
三、Ansible 特性
现大部分软件都是模块化的,都是一个个模块开发出来的,基于什么功能,提供一个什么框架,需要用到什么功能单独针对这样的功能开发一个模块关联到系统上就行了,目前 ansible 模块现在已经1000多个,可以理解成 ansible 的模块当于 Linux 里的命令,一个模块相当于一个命令,当然每个命令有好多参数选项,ansible 的模块也是有选项的,
但常用的也就二三十个,另外还有三个关键模块,Paramiko(基于 python 开发基于 SSH 的远程通讯模块),PyYAML(YAML 语言,剧本编写就是借助于这种语言),Jinja2 (模板语言)三个关键模块。不同的语言他就是不同语法而已,功能上都有类似。
我们用单条模块或者是单个命令去执行操作就像在 Linux 里执行单挑命令一样那显而易见它只是临时性的,做一些是临时性,如果说是例行性的周期性的定时的要去执行某个操作这时单条命令太麻烦,所以要编写 playbook,这里面还有有一个非常重要的特性叫幂等性,幂等性就是一任务执行一遍和执行 n 遍效果是一样的不会因为重复执行带来错误,ansible 执行的命令如果是重复的,ansible 就不会执行,而不是执行后报错。
特性如下:
1、模块化:调用特定的模块,完成特定任务。
2、有 Paramiko(基于 python 开发基于 SSH 的远程通讯模块),PyYAML(YAML语言),Jinja2 (模板语言)三个关键模块。
3、支持自定义模块。
4、基于 Python 语言实现。
5、部署简单,基于 python 和 SSH (默认已安装),agentless
6、安全,基于 OpenSSH。
7、支持 playbook 编排任务。
8、幂等性:一个任务执行1遍和执行 n 遍效果一样,不因重复执行带来意外情况。ansible 执行重复后就不会执行,而不是执行后报错。
9、无需代理不依赖 PKI( 无需 ssl)。
10、可使用任何编程语言写模块(当然用 Python 更契合)。
11、YAML 格式,编排任务,支持丰富的数据结构。
12、较强大的多层解决方案。
ansible 用单一模块的命令执行,playbook 编排多个命令,更多的操作就编辑角色来实现各种功能操作。
四、Ansible 架构
如图看到 users(用户)用 Ansible 去控制多个 host(主机),在控制时有 host inventory(主机清单)来明确控制哪些主机,控制是可以用单一的模块控制,但如果是例行性的经常性的命令时可用 playbooks 来控制,实现与各主机的连接用的 connection plugins。
Ansible 工作原理
五、Ansible 主要组成部分
1、ANSIBLEPLAYBOOKS :
任务剧本(任务集),编排定义 Ansible 任务集的配置文件,由 Ansible 顺序依次执行,通常是 JSON 格式的 YML 文件。
2、INVENTORY:
Ansible 管理主机的清单 /etc/anaible/hosts。
3、MODULES:
Ansible 执行命令的功能模块,多数为内置核心模块,也可自定义。
4、PLUGINS:
模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
5、API:
供第三方程序调用的应用程序编程接口。
6、ANSIBLE:
组合 INVENTORY、API、MODULES、PLUGINS 的绿框,可以理解为是 ansible 命令工具,其为核心执行工具。
7、Ansible 命令执行来源:
USER,普通用户,即 SYSTEMADMINISTRATOR。
CMDB (配置管理数据库) API 调用。
PUBLIC/ PRIVATECLOUDAPI 调用。
USER->Ansible Playbook->Ansible
。
8、利用 ansible 实现管理的方式:
Ad-Hoc 即 ansible 命令,主要用于临时命令使用场景。
Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划。9、Ansible-playbook (剧本)执行过程:
将已有编排好的任务集写入 Ansible-Playbook。
通过 ansible-playbook 命令分拆任务集至逐条 ansible 命令,按预定规则逐条执行。
10、Ansible 主要操作对象:
HOSTS 主机。
NETWORKING 网络设备。
11、注意事项:
执行 ansible 的主机一般称为主控端,中控,master 或堡垒机。
主控端 Python 版本需要2.6或以上。
被控端 Python 版本小于2.4需要安装 python-simple json。
被控端如开启 SELinux 需要安装 libselinux -python。
windows 不能做为主控端。
六、安装
最简单可以直接去官网下载
1、rpm 包安装:EPEL 源
yum install ansible
2、编译安装:
yum-y install python- jinja2PyYAML python-paramiko python-babel python-crypto tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup. py build
python setup,py install
mkdir/etc/ansible
cp-r examples/*/etc/ansible
3、Git 方式:
gitclone git:// github.com/ansible/ansible.git--recursive cd./ansible
source./hacking/env-setup
4、pip 安装:pip 是安装 Python 包的管理器,类似 yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install-upgrade pip
pip install ansible--upgrade
5、确认安装:ansible--version
七、安装实例
建立一个主机192.168.30.7和三个被控主机192.168.30.101(hostname noda1)、192.168.30.102(hostname noda2)、192.168.30.103(hostname noda3)。
在要安装的主机上接入 EPEL 源,输入 yum info ansible 可看到版本号此时在EPEL源里是2.5.3,是基于 ssh 实现配置管理部署任务执行任务系统。
继续输入 yum install ansible -y 便开始安装。安装完成后,可以输入 rpm -ql ansible | less 查看文件列表:
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
/usr/bin/ansible
/usr/bin/ansible-2
/usr/bin/ansible-2.7
/usr/bin/ansible-config
/usr/bin/ansible-connetion
/usr/bin/ansible-console
/usr/bin/ansible-console-2
/usr/bin/ansible-console-2.7
/usr/bin/ansible-doc
/usr/bin/ansible-doc-2
/usr/bin/ansible-doc-2.7
/usr/bin/ansible-galaxy
/usr/bin/ansible-galaxy-2
/usr/bin/ansible-galaxy-2.7
/usr/bin/ansible-inventory
/usr/bin/ansible-playbook
/usr/bin/ansible-p1aybook-2
/usr/bin/ansible-p1aybook-2.7
/usr/bin/ansible-pull
/usr/bin/ansible-pu11-2
/usr/bin/ansible-pull-2.7
/usr/bin/ansible-vault
/usr/bin/ansible-vault-2
/usr/bin/ansible-vault-2.7/usr/1ib/python2.7/site-packages/ansible
等等很多文件各有各的用处。
输入 ansible
-version
可以查看到一些信息,配置文件,模块文件的路径等等。
八、相关文件
1、配置文件:
/etc/ansible/ansible. cfg 主配置文件,配置 ansible 工作特性。
/etc/ansible/hosts 主机清单。
/etc/ansible/roles/ 存放角色的目录。
2、程序
/usr/bin/ansible 主程序,临时命令执行工具。
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具。
/usr/bin/ansible-galaxy 下载/上传优秀代码或 Roles 模块的官网平台。
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具。
/usr/bin/ansible-pull 远程执行命令的工具。
/usr/bin/ansible-vault 文件加密工具。
/usr/bin/ansible-console 基于 console 界面与用户交互的执行工具。
九、主机清单 inventory
1、Inventory 主机清单
ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file 中将其分组命名。
如 [
root@ansible ~]#ansible help
执行的单一命令。
2、默认的 inventory file 为 /etc/ansible/hosts。
3、inventory file 可以有多个,且也可以通过 Dynamic Inventory 来动态生成。
模块实例:
ansible 来测试三台主机是否存活,用到 ansible –help 模块里的 m 选项,从主机发出 ping 指令,接收服务器会收到响应会回 pong 消息,输入ansible 192.168.101 -m ping,此时发现不能得到响应,需要把它加入清单里去:
vim /etc/ansible/hosts 将192.168.30.101、192.168.30.102、192.168.30.103三个主机放入,
同时要加上口令 k,输入 ansible 192.168.101 -m ping -k,就可得到回应 pong,但三台主机时,各主机口令不同无法实现回应 pong。
inventory file 中分组:
[
websrvs]
1
92.168.30.101
1
92168.30.102
[
dbsrvs]
1
92.168.30.101
1
92.168.30.103
用 [ ] 括起开就是实现了分组。
4、/etc/ansible/hosts 文件格式。
5、inventory 文件遵循 INI 文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;
此外,当如若目标主机使用了非默认的 SSH 端口,还可以在主机名称之后使用冒号加端口号来标明
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
6、如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
示例:
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com