自动化运维之ansible——小白学习之路
学习目标:
1、ansible的安装与概念
2、了解并熟悉主机清单
3、了解并熟悉点对点模式
4、熟悉角色扮演
1、ansible简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible可以简化管理员的自动化配置管理和流程控制方式。它利用推送方式对客户系统配置,这样所有的工作都可以在主服务器上完成。Ansible本身不能进行任何操作,只是提供一个框架,它是依赖模块来进行工作。
运行ansible的服务器叫做”管理节点”,通过ansible进行管理的服务器叫做“受控节点”。以下是ansible的原理拓扑图:
Ansible还是一款轻量级应用,去中心化并且功能强大,模块丰富还操作简单深受广大运维工程师喜爱。
2、ansible部署
(1)dns 解析
环境:ansible服务器1台
Ansible客户机若干台(不少于2台)
在ansible服务器上做域名解析,一般情况下解析配置会在ansible服务器的/etc/hosts文件中进行配置,用vim编辑器进入/etc/hosts文件,在文件下方添加客户机ip及主机名,如下所示:
[root@ansible ~]# cat /etc/hosts
192.168.77.133 ansible
192.168.77.134 host1
192.168.77.135 host2
192.168.77.136 host3
在文件中添加的时候,每一行只允许添加一台机器的信息
之后,保存退出。
我们做域名解析之后就可以不使用IP地址就可以进行命令操作。
(2)安装 ansible
EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.我们只需要安装epel-release软件包就可以自动配置yum仓库。
第一步,在ansible服务器上安装epel源
或者下载使用阿里源
这里我们用wget命令去下载阿里源,wget可以直接根据网址链接去网站下载我们需要的文件,下载的文件路径可以添加一个-O的参数来指定。
第二步,配置好epel源之后就可以直接使用yum安装ansible
Ansible安装完成后让我们看一下可以用它来干什么吧
rpm -ql ansible 列出所有文件
rpm -qc ansible 查看配置文件
ansible --help 查看ansible帮助
ansible-doc -l 看所有模块(A10,华为,docker,EC2,aws等等广大厂商设备)
ansible-doc -s yum 看yum模块,了解其功能
3、ssh-key
为了在我们使用ssh远程登陆时减少繁琐的操作步骤,我们一般会在服务器添加ssh密钥对来进行免密登录。SSH密钥对通过加密算法生成一对密钥,默认采用RSA 2048位的加密方式。
首先,在ansible服务器使用ssh-keygen命令随机生成一个密钥对
在生成密钥对过程中,体统会询问保存密钥的文件路径,这里直接按回车密钥会默认保存到/root/.ssh/目录下。接着输入两次密码,注意两次输入密码一样,也可以是空密码。然后它会保存你的密钥到指定文件路径中,并且显示你的密钥指纹与艺术图像。
接着,我们把生成的密钥备份到另外的客户机,注意命令结尾添加被控主机的IP。
这里它会显示命令的文件路径与密钥的文件路径,并且在备份之前会告诉我们主机的真实性无法确定,询问是否继续连接目标主机。输入‘yes’之后开始使用密码去连接该主机进行备份,备份之后会提示我们登陆该主机去查看是否成功。
如此一来,就建立了ansible服务器与被控主机的免密登录,更加便于我们批量去管理服务器集群。
4、ansible基础操作
(1)定义主机清单
为了便于管理大批量服务器我们一般会把需要进行管理的服务器写出到一个清单里,这就是主机清单。
首先,使用vim编辑器在默认的ansible配置文件/etc/ansible/hosts中添加我们将要进行管理的服务器
这里同样每一行只添加一台主机的信息,由于我们之前已经做过域名解析所以只添加主机名就可以。
(2)测试连通性
有了之前的铺垫,现在ansible才真正开始干活了。我们可以通过ansible的ping模块去测试与客户机的连通性,出现“SUCCESS”即表示成功
我们也可以选择简洁的输出,在命令行添加一个-o的参数即可
-m参数用来指定模块,不同的模块功能也不同,ping只是其中的一个模块,还有其他模块后边我们会讲到。
还有一点需要我们注意的就是未在主机清单中标注的客户机不能进行操作。
在刚才建立连接过程中,被控主机的公钥已经存放到我们控制主机的~/.ssh/known_hosts文件中了。并且也可以使用普通用户进行连接,前提条件是这个普通用户是shdo用户。使用时添加-u参数就可以指定我们想要的用户。关于ansible的操作命令我们可以将它理解为,ansible让谁用什么模块去做什么操作或是达到某种状态。
(3)know_hosts
我们在使用ping模块测试的时候会发现系统会询问是否确定继续连接,为了更加便捷的操作我们将使用以下方法来取消来自系统的询问。
在/etc/ssh/ssh_config 文件中找到#StrictHostKeyChecking一行,去掉注释并将行尾ask改为no
接着我们再执行命令
这里的参数-u用来指定用户,-k表示输入密码,-o表示简洁的输出。现在再使用ping模块的时候已经不会出现询问了。
(4)ping和ssh
将host1的sshd进程关闭之后,再进行ping模块测试其连通性。
测试之后得出的结论是,ansible是依赖ssh协议去通信的,想要使用它必须先让ansible服务器与被控(机器)节点的ssh保持连通性,ping模块可用于探测服务器ssh程序是否连接。
5、Inventory -主机清单
(1)增加主机组
在批量运行命令与批量部署服务时如何指定一批机器去运行呢?这时主机组的优势就体现出来了。在主机清单中,将所有机器分成不同的组并定义不同的组名,运行命令时只需要指定特定的组名就能达到批量操作的目的。
例如:
接着用ping模块去测试新建组的机器
(2)增加用户名与密码
接下来我们将客户机的用户名与密码填入主机清单中,如此一来命令行就不需要-o与-k两个参数了。
这里所添加的内容表示host1到host3,三台机器使用ansible连接的ssh协议的用户是root,密码是1。需要注意,每个人的密码是不同的。
接着开始测试
测试成功
思考:假设每个客户机的用户和密码都不同,此时我们该如何设置?
如上图,将用户与密码不用的机器分别列出,即可达到我们想要的目的。
(3)增加端口
当我们用ping模块去ping客户机的ssh连接状态时,找的是ssh协议的默认端口。假设某些机器为防止入侵修改了默认端口时,我们怎么办?接下来我们就来解决这个问题。
首先我们将其中一台客户机的默认端口修改为任意端口,在/etc/ssh/sshd_config中找到port一行,接着去掉注释修改端口
现在我们将默认端口改为2222,再去测试机器的ssh协议,这时命令结果是失败的。打开主机清单将修改过的端口信息标注进去就可以了。
这里新增的内容表示的是ansible连接的ssh协议所用的端口是2222,即之前再配置文件中所修改的端口号。
(4)变量
在ansible中的变量分为内部变量与自定义变量,我们先来了解内部变量。ansible内部变量可以帮助我们简化主机清单的设置。
例如:
配置文件中加入以上变量之后,如果所创建的主机组中含有与之相同的用户名或密码,不用每台机器都写入一行,直接调用这里的数据即可。
以下是我们经常会用到的一些变量
(5)子分组与自定义主机列表
子分组就是将不同的分组进行组合。
如上图所示,webserver组中包含了apache组和nginx组,apache组和nginx组同时存在于webserver组中,三个组名可以随意调用。
在我们需要分批操作大量机器时,我们还可以自定义主机列表,将主机清单添加到不同的文件路径中。
6、Ad-Hoc-点对点模式
我们经常提及的移动通信网络一般都是有中心的,要基于预设的网络设施才能运行。但对于有些特殊场合来说,有中心的移动网络并不能胜任,于是就有了ad-hoc网络来满足能够临时快速自动组网的移动网络的需求。在ansible中临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook(剧本)。
(1)shell模块
在我们了解一个模块的时候可以使用ansible-doc命令,在其后加上-h或者–help直接获取帮助信息,比如现在我们查看shell模块
了解shell模块之后,现在我们试试看它可以用来干什么了
获取主机名
或者
注意,在我们使用模块时须要添加一个-a参数来指定我们将要调用的模块或者要使用的命令。这里的-f用来指定ansible一次命令执行并发的线程数。
部署apache
查询系统负载
(2)复制模块
Copy模块的作用是往客户机上备份文件,在使用之前可以ansible-doc查看了解该模块。
例如:
其中,src代表需要备份的文件路径,dest代表要备份到的文件路径,owner与group分别代表备份文件的属主与属组,mode代表权限。
完成备份之后我们可以在客户机上查看是否备份成功
如果文件有多份可以使用以下命令
(3)用户模块
用户模块,顾名思义就是帮助我们管理用户的模块,一般可以用来对用户进行创建、删除、修改等操作。
例1、创建用户
创建用户时我们须要指定用户名与状态,这里name表示指定的用户名,state表示指定用户的状态。
例2、删除用户
这里同样我们也需要指定用户名与状态
例3、修改密码
为了系统安全性,在修改密码之前需要先生成加密密码
这里‘777’是要修改的密码,管道符后边表示标准的加密密码
加密密码生成后,将其添加到以下命令中
(4)软件包管理模块(yum模块)
例1、升级所有包
使用ansible在host1中使用yum模块更新最新的包
例2、安装apache
使用ansible再host2中使用yum模块使用最新的包安装apache
7、YAML-YAML Ain’t Markup Language-非标记语言
YAML是“YAML不是一种标记语言”的外语缩写,它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多,接下来要学习的剧本就将用它来实现。
语法:
YAML的语法有两种,一种是列表,一种是字典。
列表:
fruits:
- Apple
- Orange
- Strawberry
- Mango
字典:
martin:
name: Martin D’vloper
job: Developer
skill: Elite
示例:
接下来通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程。
在这之前须要先清理一下环境,用ansible把所有的主机上的apache都卸了,以免和前边的实验产生冲突。
再在ansible服务器上安装一个web服务,比如apache,不启动这个服务,我们真正需要的是它的配置文件,因为我们修改主机的时候一般都修改它的配置文件。
接着在当前目录下创建一个文件夹
进入到刚创建的目录下,从将apache配置文件拷贝到当前目录下
将该文件中的端口号改为任意端口号,这一步的目的是象征性的修改了服务配置
这里grep是过滤的意思,将端口号过滤出来查看
现在环境已经部署好了,接下来可以进入正题了编写剧本了。
创建一个剧本文件并在文件中使用yaml添加剧本内容
Yaml语言是由-号开头的,注意-号后边一定要打空格,它对空格的要求十分严格,我们在使用的时候要特别注意。
配置好剧本内容之后先去从语法、任务、主机检查剧本是否有误
检验语法
使用剧本命令时末尾需添加–检验方式。
列出任务
现在看到的是之前写入剧本的任务
列出主机
显示只有一台host2
这些都没问题我们执行一下剧本
执行之后查看客户机服务是否起来
服务并没有起来是因为之前我们修改了服务配置
接着我们来处理这种情况,这时候在剧本中我们可以通过一个关键属性handlers触发器来解决问题,一般我们不去触发它就不会执行。
在剧本中设置触发器
Notify代表通知,handlers代表触发器。上边框中notify在copy模块中代表如果备份配置文件时发生改变就去通知重启apache服务,这里的重启apache服务代表下方触发器中的任务名称。下边框中表示如果触发成功就使用服务模块去重启apache服务,这里的触发器任务是自定义的。由于配置文件需要重启服务才能生效,所以我们修改配置文件之后要apache。
配置好触发器之后再次执行剧本
触发成功
8、Role-角色扮演
roles则是在ansible中,playbooks的目录组织结构。而模块化之后,成为roles的组织结构,易读,代码可重用,层次清晰。
(1)目录结构
创建一个roles目录结构
先创建目录
再在目录下创建所需文件
创建完成
在roles/nginx/files/目录下创建一个文件并追加一些内容
注意文件格式,这里所创建的文件叫做主页文件
安装nginx并将nginx配置文件/etc/nginx/nginx.conf 拷贝到新建目录结构roles/nginx/templates/nginx.conf.j2下
想要查看目录结构须要使用yum源安装一个roles命令
安装成功之后查看之前创建的目录结构
看到roles目录结构中有六个目录六个文件的时候目录结构就准备完成了。那这些目录都是用来存放什么的呢
tasks: 存放 task 任务
handlers: 存放 handlers 任务
files: 存放 task 中引⽤的⽂件
templages: 存放 task 中引⽤的模板
meta: 存在 role 的依赖role(这个role 执⾏前,要先执⾏那个role)
vars: 存放 role 的变量
defaults: 存在 role
(2)编写任务
在剧本文件中编写要执行的任务
其中—作为yaml语言的头部信息。
以上内容的大意是:调用yum模块安装最新的epel源和nginx包,再拷贝主页文件index.html到其他主机的/usr/share/nginx/html/index.htmlf中,拷贝nginx主配置文件到其他主机的/etc/nginx/nginx.conf中,如果配置文件发生改变就通知触发器重启nginx,调用服务模块确保nginx是运行状态。
须要注意的是,在Ansible中变量名仅能由字母,数字和下划线组成,并且只能以字母开头,变量引用格式必须是“{{变量名}}”。这里拷贝著配置文件调用的是template模块,template模块是基于模板方式生成一个模块复制到其他主机。copy模块只能用于简单的复制,遇到含j2(jinja)的文件就需要用到它来拷贝。
(3)使用变量
在配置文件roles/nginx/templates/nginx.conf.j2中找到worker_processes auto;一行将其修改为worker_processes {{ ansible_processor_cores }};使它调用这个内部已知变量
再找到worker_connections 1024;一行修改为worker_connections {{ worker_connections }};这个变量是自定义的变量
接着将自定义好的变量写入到roles/nginx/vars/main.yaml文件中
10240是自定的数字
(4)编写处理程序
之前将触发器通知写入到了roles/nginx/tasks/main.yaml任务文件中并没有写入触发命令,现在将触发命令写入到roles/nginx/handlers/main.yaml文件中
命令名称是restart nginx,调用服务模块将nginx服务重启。
(5)编写剧本
将剧本主文件写在roles/site.yaml文件中
执行命令、变量与触发器已经写到了其他文件中,在这里我们只定义须要进行操作的机器与服务。这样一来剧本主文件就把每个对象跟每个任务捆绑在了一起。
(6)实施
之前所做的已经写好了一个完整的剧本,再实施之前先对它进行测试
移动到剧本主目录下使用语法检查命令测试剧本文件语法是否有误
语法无误,实施剧本
剧本实施完成,访问执行主机IP
Role不能直接执行,须要剧本的调用。在使用ansible大批量服务器操作中,role是将执行命令、变量、触发器与主剧本文件分别写到不同的文件中的,这样方便修改与管理。甚至在须要管理不同类型应用时,可以针对每个不同的类型去单独写一个role分给不同的人去管理,这样工作效率也会增加。