ansible简介
今天我打算讲讲ansible,从网络的角度去看看ansible到底为什么这么火,同时也结合笔者自己的一些经历来看ansible有哪些局限。
去网上看ansible的资料,基本都是互相抄来抄去,再举几个自己的例子。这次我希望能有所突破,给大家一个不同视角的ansible。
本来想写成一篇,结果发现越想写,很多细节和坑都想给大家讲明白,所以计划两期 3-5期
- 先带大家看看ansible,以及如何用ansible的raw模块对网络设备批量执行单条命令。
- 如何用各厂商对应的cli模块去执行命令
- 如何用playbook编排任务
- 复杂的playbook使用指南(这个就是简单引路了大家按需自己去学)
本文是基于ansible2.9.9的版本
初识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的一些官方文档
执行流程
这个图也是网上找的。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端口号都可以设置,单一般默认的足够了。
pip安装不会生成这些默认的配置文件,参数都是内置在包里的,但是我们可以用命令生成到指定位置
比如我这个是把整个配置导出到一个文件中,大家也可以导入到默认的位置(如果默认位置无)
ansible-config dump >> /etc/ansible/ansible.cfg
关于字段的解读大家可以去搜搜,给大家一个比较全的参考。
还是看官网吧,也可以自己百度,但是不保证版本升级,很多参数能对上。敏捷的原因,和新的考虑,导致向下兼容总有一些取舍。
https://docs.ansible.com/ansible/latest/reference_appendices/config.html
官方文档实在是学习的一个非常好的途径,Python、netmiko、requests、django、drf(非常优秀的RESTful框架)、ansible等等很多官方文档都写的很详细。每次读起来都觉得酣畅淋漓。
言归正传,我的稍微修改了一下配置。
- 第一个是关闭第一次使用ansible连接客户端是输入命令提示,省事。
- 第二个是执行命令的超时时间,比如保存配置,设备比较老旧或者网络不太好(我用的devnet的实验环境)会超时,避免这种情况。
安装好,根据情况调整配置后,我们可以开始写ansible了。
基于Ad-hoc运行批量执行命令
ad-hoc是一种快速模式,用于快速执行ansible的功能模块,执行的部分不用保存到文件(相对于playbook编排任务的文件)。
在执行之前,首先你需要一个主机清单,用于指定在哪些主机上运行ansible,刚才也说了,这是ansible的一个CMDB资产库,描述了你有哪些设备、类型、角色、厂商、用户名密码等等。
主机清单inventory
所在位置:/etc/ansible/hosts,也可以根据自己的需求更改位置)。大家可以看看官方文档 https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html 有很详细的说明。
既然是批量管理主机,那么就需要有管理对象,主机清单里写的都是被管理的主机,而且可以分组,每组都可以传递指定参数。样例:
[root@master / 22:48:58]#cat /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_port # 端口号默认是22
ansible_user # ssh连接时默认使用的用户名
ansible_password # ssh的密码
同时主机清单可以通过文件夹目录的方式保存,可以通过脚本动态获取。非常灵活。
可以使用IP也可以使用主机名,使用主机名要保证dns能映射成功。
网络设备配置还有其他需要注意的参数,我们一会介绍。
网络设备不同于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]
[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模块的描述,就知道怎么用了。
描述:
使用例子:
使用ansible-doc 命令
ansible-doc raw就可以查看模块的内容了,但是我觉得 不如看源文件舒服。
更多
更多参数
执行命令就可以看到ad-hoc下支撑的参数。
enable模式
网络设备如果需要用到enable的话可以使用become 指定命令
具体的命令可以用ansible-doc -t become -l
网络设备是enable(主要是思科设备),对应的用户名和密码也需要传入。大写K是enable的密码。
总结
以上就是今天的分享,本来打算用以前的教材简单写写复制粘贴,没想到用了一个周末的下午和晚上,很多东西都想写的细致一些。
同时时间所限,有些东西难免有纰漏,望大家谅解。
下一期我们讲讲network_cli模块,与设备交互,并简单引入playbook的概念。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net