ansible的最强教程(一)

ansible简介

今天我打算讲讲ansible,从网络的角度去看看ansible到底为什么这么火,同时也结合笔者自己的一些经历来看ansible有哪些局限。

去网上看ansible的资料,基本都是互相抄来抄去,再举几个自己的例子。这次我希望能有所突破,给大家一个不同视角的ansible。

本来想写成一篇,结果发现越想写,很多细节和坑都想给大家讲明白,所以计划两期 3-5期

  • 先带大家看看ansible,以及如何用ansible的raw模块对网络设备批量执行单条命令。
  • 如何用各厂商对应的cli模块去执行命令
  • 如何用playbook编排任务
  • 复杂的playbook使用指南(这个就是简单引路了大家按需自己去学)
  • 本文是基于ansible2.9.9的版本,python3.8
  • 我的分享会从网工角度去分享如何使用
  • 从源码角度分析ansible为什么易上手,难在哪里,坑在哪里。总之就是多维度解读。
  • 渔与鱼并重

初识ansible

ansible是一个配置管理和应用部署工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric、SaltStack )的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

以上这段话,大家互相抄来抄去,本来也是我内部培训时的一段,这次我换个角度来解读一下

ansible是一个配置管理和应用部署工具

  • ansible可以去对服务器上(1-N台)的一些系统应用进行配置管理,更该部分参数。
  • ansible可以去安装一个新的软件应用,或者是一组软件应用。

以上本质是在多设备按情况(判断循环)指定每台设备要执行的命令(命令可封装成更加简单的模块,调用更方便)

集合了众多运维工具的优点

借鉴了很多的特

点,改善了很多缺点,

  • 轻量化:控制端无需安装一些数据库或者其他服务,被控制端无需安装agent。这点很重要,13年的时候我用过chef,安装不友好,被控制端配置的也很烦,非常重的一个东西。
  • 简单易学:通过yaml描述灵活调用模块、编排任务实现配置管理和部署应用,理论上不学开发也可使用。而其他或多或少依赖ruby、shell等,学习成本相对较少。
  • 可拓展性强,又可通过Python(或者其他语言,但肯定Python是最佳)二次开发实现很多自己的功能,编写自己的模块。

适用范围广

  • 功能:依托于ansible的模块(自带很多,又可定制)实现非常丰富的功能,比如安装数据库、配置交换机端口vlan等等。
  • 覆盖:可覆盖windows server 、linux 、网络设备。(理论上ssh可用,都可无侵入的使用ansible)

社区活跃,厂家支持

这点也很重要,从官方到社区、从民间到厂家都很支持,众多案例分享,资料多,发展快,这就是一个滚雪球的过程。

基于SSH,但是不止于SSH

基于ssh,致使适用范围广,但是自己写的接口只要对接上,也可以通过RESTful API 、Netconf等协议与设备交互。

以上是我对ansible的一些解读。

当然还有大家提到的安全可靠,幂等一致(执行一次和N次结果一样)。

插一句,名字来源:安德鲁的游戏,科幻小说,前几年的一部电影,是一个控制器可以控制XX光年以外的一些设备还是飞船之类的,很贴合运维。

有些资料提到可实现多级指挥,strong multi-tier solution。我理解的是付费版本可以实现类似多区域部署探针,由ansible tower统一控制。

架构组成

 

 

 

1.connectior plugins (连接插件):用于连接主机,用来连接被管理端

2.core modules (核心模块):连接主机实现操作,它依赖于具体的模块来做具体的事情

3.custom modules (自定义模块):根据自己的需求编写具体的模块。

4.plugins (插件):完成模块功能的补充

5.playbooks(剧本):ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。大家很大一部分都是在写playbook。

6.host inventory (主机清单):定义ansible需要操作主机(网络设备、控制器、可以对接ansible的第三方软件控制器)的范围,这个其实相当于一个简单文件描述的CMDB,可以对设备打标签、角色等等,可以在一些场景下筛选设备,不同设备执行不同的命令。这段大家可以细细看看ansible的一些官方文档

安装

系统要求:server端只能是Linux。windows端可以通过wsl,调用linux系统然后安装ansible(香,我用的是这种方法)
软件要求:python>=2.6 目前已经支持3.X版本,也强烈建议大家使用3.6及以上版本。不要使用过老的Python版本。不要提上古版本2.X了。
安装命令:yum install ansible 或者是pip install ansible。推荐大家pip安装,同时强烈建议大家关注一下你的pip在你安装的哪个Python路径下。

其他软件要求:Linux可能需要安装sshpass(因为ansible默认使用ssh进行连接)

配置文件

所在位置:/etc/ansible/ansible.cfg

可以通过ansible --version看默认的配置路径和版本信息、查找核心模块modules路径。

Ansible中的某些设置可通过配置文件(ansible.cfg)进行调整。对于大多数用户来说,库存配置应该足够了,但可能有其他原因要更改它们。比如主机清单的位置,系统默认的ssh端口号都可以设置,单一般默认的足够了。

我在使用旧版本的时候会自动生成一个配置文件,后面的新版本没有再生成,我怀疑是写死在了ansible的Python脚本之中。

当然我们可以用命令生成到指定位置

比如我这个是把整个配置导出到一个文件中,大家也可以导入到默认的位置(如果默认位置无)

ansible-config dump 命令导出

关于字段的解读大家可以去搜搜,给大家一个比较全的参考。

还是看官网吧,也可以自己百度,但是不保证版本升级,很多参数能对上。敏捷的原因,和新的考虑,导致向下兼容总有一些取舍。

官方文档实在是学习的一个非常好的途径,Python、netmiko、requests、django、drf(非常优秀的RESTful框架)、ansible等等很多官方文档都写的很详细。每次读起来都觉得酣畅淋漓。

言归正传,我的稍微修改了一下配置。

  • 第一个是关闭第一次使用ansible连接客户端是输入命令提示,省事。
  • 第二个是执行命令的超时时间,比如保存配置,设备比较老旧或者网络不太好(我用的devnet的实验环境)会超时,避免这种情况。

安装好,根据情况调整配置后,我们可以开始写ansible了。

基于Ad-hoc运行批量执行命令

ad-hoc是一种快速模式,用于快速执行ansible的功能模块,执行的部分不用保存到文件(相对于playbook编排任务的文件)。

在执行之前,首先你需要一个主机清单,用于指定在哪些主机上运行ansible,刚才也说了,这是ansible的一个CMDB资产库,描述了你有哪些设备、类型、角色、厂商、用户名密码等等。

主机清单inventory

所在位置:/etc/ansible/hosts,也可以根据自己的需求更改位置)。

既然是批量管理主机,那么就需要有管理对象,主机清单里写的都是被管理的主机,而且可以分组,每组都可以传递指定参数。
样例:

复制代码
[root@master / 22:48:58]#cat /etc/ansible/hosts

[ceshi]   -->【分组,组名】 
10.0.0.11  # 一律使用默认的参数
10.0.0.13
10.0.0.14

[ceshi2]   -->【分组,组名】
10.0.0.15
10.0.0.16
10.0.0.17

[ceshi2:vars]   -->【可传一些变量,有一些系统变量,也可以自定义变量】
ansible_password='密码' -->【加上这个就不用输入密码,也不用密钥,但是真心不建议密码明文写在这里】
ansible_port=22
ansible_user='test'可设置登录用户

[ceshi3]   -->【分组,组名】
10.0.0.18 ansible_password='密码' ansible_port=22
10.0.0.19 ansible_password='密码' ansible_port=22
10.0.0.20 ansible_password='密码' ansible_port=22
ceshi2的变量会与ceshi2的设备相互关联。
复制代码

inventory支持的内置参数,一些基本的连接用的。

ansible_port # 端口号默认是22
ansible_user # ssh连接时默认使用的用户名
ansible_password # ssh的密码

同时主机清单可以通过文件夹目录的方式保存,可以通过脚本动态获取。非常灵活。

网络设备配置还有其他需要注意的参数,我们一会介绍。

网络设备不同于Linux,所以很多网上的例子(最简单执行命令的那种)放在网络设备上也是行不通的。很多博文其实没讲清楚。

今天我们来讲讲其中的坑,这可得打好多字…今天也是豁出去了

SSH设备用RAW模块执行命令

我们首先有一个设备清单。

文件名:hosts (没有后缀)

[cisco_nxos]
sbx-nxos-mgmt.cisco.com ansible_port=8181  ansible_user=admin
[cisco_nxos]
sbx-nxos-mgmt.cisco.com

[cisco_nxos:vars]
ansible_port=8181
ansible_user=admin

两种写法,大家按需选取。

我们实际运行的清单如下:

复制代码
[cisco_nxos]
sbx-nxos-mgmt.cisco.com


[cisco_ios]
sbx-iosxr-mgmt.cisco.com



[cisco_nxos:vars]
ansible_port=8181
ansible_user=admin
ansible_password=XXX

[cisco_ios:vars]
ansible_port=8181
ansible_user=admin
ansible_password=XXX
复制代码

我们执行了命令:

ansible -i hosts_v2 all  -m raw -a "show version"   -k

ansible 代表用了ad-hoc模式

-u admin 可以指定用admin登录,由于我们配置文件里已经写了,大家按需用默认的或者自己指定的。

-i 指定设备清单文件,默认是使用ansible.cfg中的路径文件。后面跟的是hosts文件,我们故意写了一个不是hosts的。all代表的是所有设备。也可以指定分组。

-m 是调用模块的意思,module。我们调用了raw模块,一会我们细细聊聊这个raw模块。

-a 是arguments,给模块传入参数的意思。我们传入的是一个命令。

-k 是代码ask-pass ,询问密码,输入密码执行。也可以写在hosts中ansible_password,这个和密码是否一致有关系。网络设备我们极少配置密钥。

 执行所有设备 host文件后跟all

 

 执行某组设备,后跟cisco_nxos分组名

绿色代表是成功但没改变配置黄色是代表成功状态配置改变红色代表失败

网络设备在raw模式下,返回是有问题的,认为每条命令都发生了变化。但是实际上show是不会发生变化的。

 

 返回的数据看起来是有字段的,如果再Python里执行会返回结构化数据(host 状态 回显等字段,但是show的内容不是结构化的,还是文本。)

其他说明

以上我们学习了如何批量执行网络设备的命令。调用了raw模块。

我们来看看raw模块,在对应得到Python路径下,我们看到了raw还有其他很多模块。

其中Linux用的最多的是command、shell 、script。

 

 我们来简单唠唠其中的分别。

  • raw相当于ssh到设备执行命令, Executes a low-down and dirty command,是比较通用低级的。不局限于Linux Windows 网络设备,只要支持ssh理论上都是可以用ansible管理的,这也是ansible被广泛使用的原因之一,覆盖范围很广,老旧通吃。
  • 其他几种(command、shell 、script)是基于Linux的内核设计使用的,command最常用,是执行命令的,但也受限制,比如不能使用一些环境变量,无法使用一些管道符之类的。shell弥补了这部分。script专职执行脚本的。
  • windows可以用raw和win_command和psexec等模块。

我们使用的时候

ansible -i hosts_v2 all -m raw -a "show version" -k

调用了raw模块,传入了参数即执行的命令,一次一条。借助playbook可以实现多条

这个ad-hoc模式每次只能执行一个ansible模块,raw这个模块我暂时没找到一次传入多条的方式。这种只是适合演示一下,我们可以和网络设备交互。实际上还是需要借助playbook模式去执行多行命令。但是也有坑,比如有时候保存的时候让你输入yes 、no(raw模块) 就不行了。

当然我们有其他方法。

raw模块我传入一个带换行的文本执行多条命令在nxos上也是执行失败的。

raw只是认识ansible路上的一个指路明灯,让我们快速执行命令,看到阳光。

查看模块使用说明:

看Python源文件

我们可以全局搜对应模块名.py,锁定路径,进去看看Python模块的描述,就知道怎么用了。

描述:

 

 使用例子:

 

posted @   Tracydzf  阅读(9878)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示