Ansible(自动化运维工具)
自动化运维
自动化运维是指将运维中日常的、大量的重复性工作自动化,把自己或者多人执行的工作,通过梳理分析,借助平台或工具转为自动化操作。自动化运维不单纯是一个维护过程,而且是一个管理的提升过程,是运维的更高层次,也是未来的发展趋势。
常用的自动化运维工具
-
Ansible:python,Agentless,中小型应用环境 -
Saltstack:python,一般部署agent,执行效率搞 -
Puppet:ruby,功能强大,配置复杂,适合大型环境 -
Fabric:python,agentless -
chef:ruby,国内应用少 -
Cfengine -
runc
(一) 1、Ansible简介
Ansible自动化运维工具,基于python开发,集合了众多的运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架,主要包括:
? 1、连接插件connection plugins:负责和被监控端实习通信
? 2、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机
? 3、各种模块核心模块、command模块,自定义模块
? 4、借助于插件完成记录日志邮件等功能
? 5、playbook:剧本执行多个任务时,非必须可以让节点一次性运行多个任务
2、基本架构
核心:ansible
核心模块(Core Modules):这些都是ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
插件(Plugins):完成模块功能的补充
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
主机群(Host Inventory):定义ansible管理的主机
3、Ansible无需代理
Ansible 围绕无代理架构构建。通常而言,Ansible 通过 OpenSSH 或 WinRM 连接它所管理的主机并且运行任务,方法通常是将称为 Ansible 模块的小程序推送至这些主机。这些程序用于将系统置于需要的特定状态。在 Ansible 运行完其任务后,推送的所有模块都会被删除。
Ansible 不需要批准使用任何特殊代理,然后再部署到受管主机上。由于没有代理,也不需要额外的自定义安全基础架构,
Ansible 具有多个重要的优点:
0 1、跨平台支持:Ansible 提供Linux、Windows、UNIX和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
? 2、人类可读的自动化:Ansible Playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。
? 3、完美描述应用:可以通过 Ansible Playbook进行每种更改,并描述和记录应用环境的每一个方面。
? 4、轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制系统中。
? 5、支持动态清单:可以从外部来源动态更新 Ansible 管理的计算机列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。
? 6、编排可与其他系统轻松集成:能够利用环境中现有的 HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到 Ansible 工作流中。
4、Ansible优点
? 1、Ansible融合了总多老牌运维工具的优点,基本上pubbet和saltstack能实现的功能,ansible都可能实现
? 2、轻量级,无需在客户端安装agent,更新时,只要在操作机上进行一次更新即可
? 3、Ansible是一个轻量级的工具,Ansible不需要启动服务,仅仅只是一个工具,可以轻松实现分布式扩展
? 4、批量任务执行可以写成脚本,而且不用分发的远程就可以实现
? 5、Ansible时一致性的,高可靠性,安全性设计的轻量级自动化工具
? 6、使用python编写,维护更加简单
5、Ansible工作原理
管理端支持local、ssh、zeromq三种方式连接被管理端,默认使用基于ssh的连接,可以按应用类型等方式进行Host lnventory(主机群)分类,管理节点通过各类模块实现相应的操作,单个模块、单条命令的批量执行,我们可以称之为ad-hoc.管理节点可以通过playbooks实现多个task的集合实现一类功能,如web服务的安装部署,数据库服务器的批量备份等,playbooks可以简单理解为系统通过组合多条ad-hoc操作的配置文件。
6、Ansible的任务执行流程
? (1)读取配置
? (2)抓取全量机器&分组列表
? 可从多个静态文件、文件夹、脚本中读取机器,分组及其变关联量信息。
? (3)使用host-pattern过滤机器列表
? (4)根据参数确定执行模块和配置
? 从modules目录动态读取,用户可以自行开发模块。
? (5)Runner执行返回 Connection环节定义连接方式 => Action阶段机器列表(Lookup plugin Action变量/文件等资源的获取) Callback plugin各阶段的钩子调用
? (6)输出结束
? Filter plugin过滤算子,Callback plugin各阶段的钩子调用
7、Ansible命令
1、ansible
? ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。
2、ansible-doc
? 该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下:
? //列出所有已安装的模块
? # ansible-doc -l
? //查看具体某模块的用法,这里如查看command模块
? # ansible-doc -s command
3、ansible-galaxy
? ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip或easy_install 。
4、ansible-lint
? ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lintplaybook.yml 。
5、ansible-playbook
? 该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作,这个后面会做为一个重点来讲。
6、ansible-pull
? 该指令使用需要谈到ansible的另一种模式---pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;你要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。这部分也会单独做一节来讲。
7、ansible-vault
? ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 –ask-vault-pass参数,同样需要输入密码后才能正常执行。
(二)安装Ansible
1 控制节点
? Ansible 易于安装。 Ansible 软件只需要安装到要运行它的一个(或多个)控制节点上。由 Ansible管理的主机不需要安装 Ansible。
对控制节点的要求:
-
控制节点应是Linux或UNIX系统。不支持将Windows用作控制节点,但Windows系统可以是受管主机。 -
控制节点需要安装Python3(版本3.5或以上)或Python2(版本2.7或以上)。 ? 如果操作系统是红帽8.0,Ansible 2.9可以自动使用 platform-python 软件包,该软件包支持使用Python的系统实用程序。你不需要从 AppStream安装python37或python27软件包。 2 受管主机 ? Ansible的一大优点是受管主机不需要安装特殊代理。Ansible控制节点使用标准的网络协议连接受管主机,从而确保系统处于指定的状态。 ? 受管主机可能要满足一些要求,具体取决于控制节点连接它们的方式以及它们要运行的模块。 ? Linux和UNIX受管主机需要安装有Python2(版本2.6或以上)或Python3(版本3.5或以上),这样才能运行大部分的模块。 3 基于Windows的受管主机 ? Ansible有许多专门为Windows系统设计的模块。这些模块列在https://docs.ansible.com/ansible/latest/modules/list_of_windows_modules.html部分中。 ? 大部分专门为Windows受管主机设计的模块需要在受管主机上安装PowerShell 3.0或更高版本,而不是安装Python。此外,受管主机也需要配置PowerShell远程连接。Ansible还要求至少将.NET Framework 4.0或更高版本安装在Windows受管主机上。 4 受管网络设备 ? Ansible还可以配置受管网络设备,例如路由器和交换机。Ansible包含大量专门为此目的而设计的模块。其中包括对Cisco IOS、IOS XR和NX-OS的支持;Juniper Junos;Arsta EOS;以及基于VyOS的网络设备等。 ? 可以使用为服务器编写playbook时使用的相同基本技术为网络设备编写Ansible Playbook。由于大多数网络设备无法运行Python,因此Ansible在控制节点上运行网络模块,而不是在受管主机上运行。特殊连接方法也用于与网络设备通信,通常使用SSH上的CLI、SSH上的XML或HTTP(S)上的API。 5 安装Ansible
[root@localhost yum.repos.d]# ls #检查是否有epel源包
CentOS-Stream-AppStream.repo CentOS-Stream-Debuginfo.repo CentOS-Stream-HighAvailability.repo CentOS-Stream-PowerTools.repo liu.repo
CentOS-Stream-BaseOS.repo CentOS-Stream-Extras.repo CentOS-Stream-Media.repo CentOS-Stream-RealTime.repo
[root@localhost yum.repos.d]# yum -y install epel-release #下载epel源包
Repository baseos is listed more than once in the configuration
Repository appstream is listed more than once in the configuration
上次元数据过期检查:1:30:41 前,执行于 2021年07月13日 星期二 02时30分05秒。
依赖关系解决。
==================================================================================
软件包 架构 版本 仓库 大小
==================================================================================
安装:
epel-release noarch 8-11.el8 extras 24 k
安装弱的依赖:
epel-next-release noarch 8-11.el8 extras 11 k
事务概要
==================================================================================
安装 2 软件包
总下载:35 k
安装大小:38 k
下载软件包:
(1/2): epel-next-release-8-11.el8.noarch.rpm 2.1 kB/s | 11 kB 00:05
(2/2): epel-release-8-11.el8.noarch.rpm 4.4 kB/s | 24 kB 00:05
[root@localhost yum.repos.d]# ls
CentOS-Stream-AppStream.repo CentOS-Stream-Extras.repo CentOS-Stream-PowerTools.repo epel-next.repo epel.repo liu.repo
CentOS-Stream-BaseOS.repo CentOS-Stream-HighAvailability.repo CentOS-Stream-RealTime.repo epel-next-testing.repo epel-testing-modular.repo
CentOS-Stream-Debuginfo.repo CentOS-Stream-Media.repo epel-modular.repo epel-playground.repo epel-testing.repo
[root@localhost yum.repos.d]# yum makecache #验证yum源
Repository baseos is listed more than once in the configuration
Repository appstream is listed more than once in the configuration
CentOS Stream 8 - AppStream 4.4 kB/s | 4.4 kB 00:00
CentOS Stream 8 - BaseOS 543 B/s | 3.9 kB 00:07
CentOS Stream 8 - Extras 497 B/s | 3.0 kB 00:06
Extra Packages for Enterprise Linux Modular 8 - x 6.5 kB/s | 663 kB 01:42
Extra Packages for Enterprise Linux 8 - Next - x8 13 kB/s | 1.1 MB 01:28
Extra Packages for Enterprise Linux 8 - x86_64 645 kB/s | 10 MB 00:16
元数据缓存已建立。
[root@localhost yum.repos.d]# yum -y install ansible #安装ansible
[root@localhost yum.repos.d]# ansible --version #查看版本号
ansible 2.9.23
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Dec 3 2020, 18:11:24) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
[root@localhost yum.repos.d]# ansible -m setup localhost|grep ansible_python_version
"ansible_python_version": "3.6.8",
# 通过使用setup模块验证localhost上的ansible_python_version
(三)构建Ansible清单
定义清单
? 清单定义Ansible将要管理的一批主机,这些主机也可以分配到组中,以进行集中管理,组可以包含子组,主机也可以是多个组成员,清单还可以设置应用到它所定义的主机和组的变量
? 定义主机清单的两种方式:
? 静态主机清单:通过文本文件定义
? 动他主机清单:使用外部信息提供程序通过脚本或其它程序来生成
清单作用
? 定义Ansible管理的一批主机名单,通过执行Ansible模块,在调用过程中直接对清单中的主机进行批量管理。
使用静态清单指定受管主机
? 静态清单文件是指Ansible目标受管主机的文本文件,可以使用多种不同的格式编写文件,包括INI样式和YAML
? 通过主机组,可以更加有效的对一系列系统运行Ansible,每一部分的开头以中括号括起来的主机名称,其后面为改组中每一受管主机的主机名或IP地址,每行一个。
默认清单位置
? 默认位置:/etc/ansible/hos
? 使用规则:对于默认清单我们一般不适用,为了方便管理,管理者会在自己的文件夹目录中设置自己的清单目录
? 清单读取顺序:当前目录下的清单>该用户下的清单>全局用户的清单
语法
? [ceshi] ? 192.168.220.98 ? log ansible_ssh_host=192.168.220.116 ansible_ssh_port=10056 ansible_ssh_user=wwwad
名词解释:
? [ceshi] 这是主机组名
? log:192.168.220.116的别名
? ansible_ssh_port=10056:ansible远程控制的端口
? ansible_ssh_user=wwwad:远程控制的用户名
基本定义:每行一个主机名或者IP地址,批量格式
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
组定义:基本组定义
[webservers]
ip/servername
? 查看目录清单
列出清单中所有受管主机:ansible all --list-hosts
[root@localhost ansible]# ansible all --list-hosts
hosts (1):
192.168.240.40
列出不属于某个组的主机:ansible ungrouped --list-hosts
[root@localhost ansible]# ansible ungrouped --list-hosts
hosts (1):
192.168.240.41
列出不属于组的主机:ansible awebservers --list-hosts
[root@localhost ansible]# ansible awebservers --list-host
hosts (2):
192.168.240.40
192.168.240.44
列出指定清单所有主机:ansible all -i inventory --list-hosts
[root@localhost ansible]# ansible all -i cctv --list-hosts
hosts (1):
192.168.240.40
Ansible连接受管主机
[root@localhost ansible]# ansible all -m ping
192.168.240.40 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
生成密钥和传输密钥
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:Z3PyT7XhH6MOS/tzpyTmDjm90H2Q6nfsy08YRzuwTgk root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| E . .|
| . +o.|
| S = .+++o|
| o Ooo.*+|
| =oB.=*o|
| .B+B++B|
| +B==*B|
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.240.40
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.240.40's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.240.40'"
and check to make sure that only the key(s) you wanted were added.
|