【Linux学习笔记】十七、自动化工具:Ansible的安装及使用

本文介绍了Ansible的安装过程,包括通过yum安装、配置SSH免密登录、HostInventory管理和playbook脚本的使用。重点讲解了Ansible的连接方式、ssh密码验证、免密登录配置以及两种管理模式:ad-hoc模式和playbook模式的应用。
摘要由CSDN通过智能技术生成

十二、自动化工具:Ansible的安装及使用

早期我们会用ssh免密登录以及shell脚本来完成自动化部署操作,但是这也非常不方便。因为ssh虽然可以免密登录,但之后的比如配置管理系统、执行命令、安装服务、启停服务等都是人工操作,如果有几百台服务器就累死了。后来虽然可以用shell脚本批量操作,但是当非常多的操作,就需要非常多的脚本,而且每个人写的脚本代码风格不同,你得先读懂别人的shell脚本,你才能知道是怎么操作的,所以难以阅读难以维护难以管理。所以我们需要自动化管理工具。有需求就有人做这件事情,所以后来也诞生了很多开源原件,比如:fabric,puppet,saltstack, chef, Ansible。本次我们主要学习ansible。
saltstack和ansible都是基于python编写的,所以我们了解这个软件后,就可以针对这个软件进行二次开发。devops就是开发和运维的结合。

A:DEV-QA-UAT-PROD表示的是各种环境
  DEV表示开发环境,是开发人员在本地进行网站后台代码的编写用到的环境,比如他写代码要用到mysql、nginx的反向代理服务器、python解释器等都得在dev开发服务器上部署并调试好这些环境,开发人员才能敲代码开发。
  QA表示测试环境,就是开发人员在DEV下运行好的代码,需要再次放到QA服务器上进行测试,看是否正常运行,QA就是看开发人员的代码、程序依赖、环境等是否能结合工作。所以QA环境和DEV环境中的系统版本号、软件版本、软件的配置文件等都得一致,不然就可能不能正常运行。
  UAT是预生产环境,就是prod环境一模一样了,就是没有任何配置上的区别C。
  Prod是线上服务器,就是生产环境,也叫生产服务器,这里是严禁出现错误得,如果出错很可能会出现金钱受损、重大损失等严重后果。
  C:没有配置上的区别是因为:prod是正式生产环境,这种环境的服务器一般配置都非常高,比如64核、内容200多Gd的配置。而开发环境、测试环境为了节省成本肯定低于生产环境的配置,因为DEV和QA只进行代码编写和测试,都是公司内部开发及测试人员检查程序是否正常,没有外部客户访问。
B:Host Iventory用户定义主机类的文件。比如有一台服务器是管理机,其他300台服务器是被管理机,那我们首先是将被管理机的的p地址或者是进行了域名解析后的主机名先写入到host inventory文件中。这样管理机通过host inventory文件就知道它能管理谁,管理是默认通过ssh协议,而且也是提前设定好的免密登录。
playbook就是你要批量执行的操作,其实就是部署的一个脚本。

ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的被管理机,如果被管理机不允许ssh登录就没法管理了。因为ansible是通过ssh协议实现管理机与被管理机之间的通信的。只要能通过ssh协议登录的主机,就可以完成例如:批量文件分发、批量数据复制、批量数据修改、删除、批量自动化安装软件服务、批量服务启停、脚本化的自动批量服务部署等操作。

ansible是不需要安装客户端的。就是以前管理机和被管理机都是要安装一个服务,才能实现管理与被管理,但ansible不需要客户端也安装服务。因为ansible是通过ssh协议进行批量管理的,而任何一个被管理机在安装系统的时候就默认配置好了ssh服务并且打开了22号端口,所以基于ssh通信是不需要安装客户端的no agent,所以也是不占用客户端的其他端口的,仅仅是使用ssh服务即可。但是有的公司为了安全,把远程登录的端口给改了,此时用ansible对它进行管理就需要指定端口,也是可以的。所以ansible逐渐称为自动化运维的主流工具。

ansible使用yaml配置文件语法。
ansible是基于python语言开发的,所以主要由python的两个ssh处理模块、paramiko模块、PyYAML模块。paramiko模块是一个封装了ssh协议的模块,通过它就可以免密登录操作。

ansible的工作流程:

 

1、Ansible部署

  • 首先我们要准备几个linux虚拟机,把其中一个当master管理机,其他几个当被管理机

 

我这里准备了三台linux虚拟机,其中basenode做管理机,allnode和clearning-node作为被管理机。要知道如何准备可以参考我的linux学习笔记(一)里面有虚拟机克隆步骤,按步骤操作即可。记得一定要把被管理机的ip也从动态改成静态的,还有关闭防火墙,这些操作都在学习笔记一里面。
现在我们这3台机子在同一个局域网中

  • 查看本机IP: ip addrz或者ip a
  • 修改主机名:hostnamectl set-hostname xxx 即可
  • 测试三台机器是否能相互通信:ping 192.168.133.xxx即可
  • 在管理机上安装ansible软件
    我们可以源代码编译,rpm包安装,也可以yum工具自动化安装。由于这个工具没有太多的自定义功能,所以这里我们yum工具安装。yum安装的前提是我们已经把阿里的yum源和epel源都配置好了。
    如果你没有epel,你可以手动这样安装一下:yum install epel-release -y 这是安装epel源的命令。
    (1)yum install ansible libselinux-python -y 安装ansible以及安装一个系统依赖的工具libselinux-python,就是一个相关的开发库
    (2)检查ansible软件的安装情况:rpm -ql ansible | grep -E '^/etc|^/usr/bin'就是查询一下ansible的配置文件和可执行命令
      检查linux安装的软件包用rpm -ql ansible,就是查看ansible软件包的所有相关目录
      再通过管道符|过滤一下,用grep提取我们想要的信息,-E表示要支持后面的两个正则条件。
      第一个正则条件是以/etc,就是以etc开头的相关文件,因为yum安装的配置文件一般都会在etc文件夹里。所以这个正则条件就是etc里面的相关配置信息。
      第二个正则条件是以/usr,就是以根下的usr开头的相关文件,找到这里的相关命令,就是/bin
      两个正则条件中间的|是and的意思,并且的意思。
    (3)检查ansible版本:ansible --version

A:表示引用的配置文件默认是/etc/ansible/ansible.cfg ,就是我们上面rpm -ql ansible | grep -E '^/etc|^/usr/bin'命令查找的文件!
B:因为ansible是以模块化进行工作的,这里就是提示它的模块是放在/root/.ansible/plugins/modules里,和/usr/share/ansible/plugins/modules里面
C:因为ansible是依赖python解释器执行的,所以还有Python模块,而且python的版本是2.7.5

  • Ansible命令及参数

这里只贴出一部分命令和参数,非常多,到时现查现用。

  • 准备ansible被管理机
    前面讲了ansible是基于ssh协议的方式来管理被管理机的,所以被管理机是不需要安装ansible这个服务的,而且对被管理机的要求也不是很多。但是被管理机至少还是要有ansible所依赖的系统模块的。这里有很多坑,如果这里设置不好的话,到后面会有各式报错。我个人认为,如果你的被管理机如果太简单,仅仅是安装了一个mini版的linux是不行的。你至少要配置好yum源、epel源,至少要有wget命令、有ifconfig命令等、有用过ssh localhost登录过localhost。所以这里我们至少要把被管理机的epel源更新一下,并且再装一个libselinux-python包

看,我们就是更新了一下被管理机的epel,安装了一个libselinux-python,没有安装ansible!
至此,我们ansible的部署就完成了,下面看ansible的连接方式。

2、Ansible连接方式
ansible批量管理主机的方式主要有两种:传统的输入ssh密码验证、密钥管理

(1)传统的输入ssh密码验证

  • 配置ansible的配置文件,添加被管理机器的ip地址或者主机名
    前面我们已经知道了ansible的配置文件是在/etc/ansible/这个文件夹下面:

 先看一眼ansible的配置文件:/etc/ansible/ansible.cfg,这个文件里就是定义一些功能参数,打开这个文件看一下,有490行:

 再看一眼前hosts文件,这个文件是用来填写被管理机信息的:

先备份一下hosts配置文件: 

我们用的命令是cp /etc/ansible/hosts{,.ori} 这个命令其实就等价于cp /etc/ansible/hosts /etc/ansible/hosts.ori这条命令,只是第一种写法要简单一些,是用了shell语法,{,}表示把前面的路径/etc/ansible/hosts再取一遍,后面的.ori表示把.ori加到hosts这个文件名后面,就是拼接一下文件名。
在hosts文件中添加ansible要管理的机器地址,可以填写主机名也可以填写ip地址。这里我们填ip地址。在hosts文件的最后一行写下面的信息: 

至此,我们就配置好被管理的机器了,下面就可以用ansible命令进行远程操控了。

  • ssh密码认证方式管理机器
    在basenode上执行如下命令:ansible liyy -m command -a 'hostname' -k -u root
    ansible是一个命令,后面liyy是一个参数,就是要操控的对象,或者你要操控的主机列表。语法是ansible 主机列表
    liyy就是主机列表,意思就是ansible默认会读取hosts文件,让liyy下面的2台主机都去执行后面的命令,后面的命令是-m comand -a 'hostname' -k -u root

-m表示指定功能模块,默认是command模块,这个模块是ansible执行linux命令的模块。
-a表示指定模块执行时使用的参数,a是args的首字母,表示执行command模块中的hostname这个命令。
hostname这个命令就是让allnode和clearn-node给我输出一下它们的主机名。
-k表示要询问一下连接的密码,也就是需要密码验证
-u root指定运行的用户,就是指定远程主机以哪个用户执行这个命令,这里指定root用户。

 A:有的同学执行ansible liyy -m command -a 'hostname' -k -u root会出现红色报错,那是因为它的basenode和allnode,以及basenode和clearn-node从来就没有ssh连接过,所以第一个用这个命令就会报错,报错的意思是:当你用密码方式登录时,在主机Host Key检查激活情况下,sshpass不支持该用法,你得在管理机的~/.ssh/known_hosts文件中,添加客户端机器的指纹密钥。意思就是如果你们是第一相连,管理机的known_hosts里面还没有被管理机的密钥,这2台机器就没法用ansible命令连接的。此时我们就得在basenode上手动对allnode和clearn-node执行如下操作:ssh root@192.163.101和ssh root@192.163.102,就是手动ssh对被管理机进行一次连接。就是只要手动连接过一次,basenode的known_hosts文件就自动保存了被管理机的密钥,此时我们再使用这个命令就正常了。

 (2)配置免密登录
如果每台被管理机的密码都不一样,每次都要输入ssh认证密码就很麻烦!所以我们要配置免密登录。但是免密登录,一是你可以修改hosts文件,把每个被管理机的登录密码、登录用户、主机名、端口号都配置好,如下图所示:

这样虽然可以免密登录,但是如果hosts文件一旦暴露,被管理机的ip及登录密码就全被暴露了。
所以我们要用ssh密钥方式批量管理主机,这种方式更安全。
这种方式用到公私钥加解密,这部分知识点参考学习笔记(一),你要先对非对称加解密原理有了解。操作方式如下:

  • 先在basenode上创建密钥对儿:ssh-keygen -f ~/.ssh/id_rsa -P ""
    ssh-keygen表示key generate, 生成密钥,密钥生成命令;-f指定一个文件;~/.ssh/id_rsa指定文件的路径和文件名,就是把生成的密钥写入id_rsa文件中。rsa是一种非对称加密算法。-P ""表示生成密钥对儿的时候要输入的一个密码去生成,这里后面跟一个""表示是一个空字符串,意思就是什么都不用填就使用默认方式生成公钥和私钥。

 这样虽然生成了公私钥,但是生成的过程也展示出来了,如果别人知道我们的加密算法,就也可以照样生成一个一模一样的公私钥,所以最好用下面的命令:

公私钥的作用是:比如管理机要和被管理机通信时,管理机是先请求被管理机的公钥,被管理机把自己的公钥发给管理机,管理机把信息用公钥加密后再传给被管理机,被管理机收到密文后先用自己的私钥解密。这样信息在传输中即时丢包了,黑客没有私钥也不知道密文是什么意思。
所以,上面的生成公私密钥对儿是管理机和每台被管理机都要生成的。而且两台免密通信的机器之间是彼此保存了对方的公钥了的,这样每次通信时就不必每次都先请求一下对方的公钥。当彼此保存了彼此的公钥后,彼此之间的通信就自动先用对方的公钥加密后再传输,对方用私钥校准,就免密通信了。
但是如果都是上面的手动操作方法就非常麻烦。所以我们现在要编写一个公钥分发脚本,让被管理机自动生成公私钥并且相互保存对方的公钥。
(3)编写公钥分发脚本 

然后运行脚本,再登录被管理机看看: 

我们再用ansible命令进行连接: 

至此,我们已经可以进行免密远程管理了。但是在生成环境中,最好是配置ssh公私钥免密登录。如果对安全性要求更高,可以用普通用户去执行,再提权操作,比如sudo命令。
当我们用密钥管理时,对管理机器的安全性就需要严格把控,最好是禁止ssh外网登录,启用内网vpn连接。不然一旦管理机入侵,被管理机就非常危险。

3、Ansible实现批量化主机管理的模式
有两种管理模式:
(1)ad-hoc模式,就是利用ansible的纯命令行实现批量管理。这种管理模式是用shell命令对服务器进行基本的简单的管理,比如仅仅针对单台服务器进行增删改查、改改配置文件、改个文件名、移动个目录、查看一下被管理机器的内存情况、磁盘使用情况、磁盘的IO情况等简单少量的操作。所以又叫shell命令管理。
(2)playbook剧本模式,就是利用ansible的playbook模块来实现批量管理。对于一些复杂的、大的需求,比如对多台被管理机器一键部署LAMP环境、一键编译安装mysql、或者临时批量查看被管理机的内存情况、CPU负载情况、网络情况、分发配置文件等操作就需要这种管理模式,也就是要写很多很多命令才能实现,此时就把这些命令整合成一个.sh脚本,通过执行脚本实现管理。所以又叫shell脚本管理。

  • ad-hoc命令解释

ansible:是自带的操作命令
liyy:是我们前面展示过的、在/etc/ansible/hosts文件中定义的主机组。当然这里的liyy参数你也可以直接写你要操作的主机ip地址、或者用通配符*都是可以的。

-m command:表示指定ansible的command模块
-a 表示指定给command模块哪个参数,就是让command模块做什么事情,这里就是hostname, 就是让它返回主机名。

  • ansible-doc命令查看ansible支持的模块
    ansible仅仅是一个工具,这个工具能干什么,本质上都是通过调用它的模块来实现的,所以我们先看一下ansible都有哪些模块:

可以看到有非常多模块,这里我只截屏了一小部分。

4、command模块
下面看看ansible的command模块,这个模块的作用是在远程节点上执行一个命令:

 再看看这个模块的参数的具体用法:

creates参数表示在创建一个文件之前,先判断这个文件是否存在,如果存在了就跳过前面的东西,如果不存在则执行前面的东西。后面有个这个参数的案例,结合例子更清晰些。
free_form参数表示可以输入任何的系统命令,实现远程执行和管理。
remove参数和creates参数是相反的,这两个参数一般都是和创建和删除命令搭配用的。就是在删除一个文件之前先判断一下这个文件是否存在,如果不存在就不执行这个动作,如果存在再执行删除动作。这样当我们要删除一个文件,如果文件不存在,就会给我们一个报错:这个文件不存在。
warn参数表示是否提供告警信息
说明:command模块是ansible的默认基本模块,所以也可以省略不写,但是:使用command模块不得出现shell变量,比如$name;也不支持特殊符号,比如<>|;&等都不支持。

  • command模块案例

让客户端机器,先切换到/tmp目录下,然后打印当前的工作目录 

练习creates参数: 

练习removes参数: 

练习warn参数:

全是---说明文件权限最低。

5、shell模块
由于command模块不支持shell变量,也不支持特殊符号,那么shell命令就收到很大限制,因为shell命令就是依靠各种特殊符号的花式组合来实现的。那此时我们就要用shell模块,这个模块可以支持复杂的命令。

  • 查看shell模块的参数:

 

  • 远程批量查询被管理机器的进程信息:

首先在两台客户机上生成一些进程,然后在管理机上查询: 

 批量写个文件:

  • 批量远程执行脚本:

说明ansible有专门执行脚本的模块叫script模块,但是shell模块也可以执行脚本。但是用shell模块执行脚本必须是:要执行的脚本在客户机上是存在的才能执行,否则会报错。而script模块执行脚本不用每台客户机都有一份脚本才能执行。
这里我们的脚本要完成下面功能:
a.创建文件夹
b.创建.sh脚本文件,并且用shell语句写入脚本内容
c.赋予脚本可执行权限
d.执行脚本
f.或略warning信息
思路:由于shell模块执行脚本,需要客户机上都存在脚本,但是如果有100台客户机我们不可能一台台手动去创建这个脚本,所以所有的功能还是得在管理机上批量操作实现。 

6、script模块
shell模块写脚本很麻烦,因为每台被管理机节点上都要有一份脚本才能执行。而script模块可以把管理机上的脚本远程传输到被管理机节点上去执行。就是说只要在管理机本地上写好一份脚本,就可以通过一条命令,让所有被管理机都执行这个脚本,而无需所有被管理机都有这个脚本文件。

  • script模块的参数:

 

  • 案例 

 

 自动化运维的工具介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值