进入自动化部署的大门-ansible
摘要:ansible是运维与实施人员的福音,其优雅的结构,丰富的模块库,简单的编程方式都让其成为自动化部署的不二语言。现在就让我们了解ansible,并使用ansible来做一些简单的任务
一、基本概念
Ansible是一款开源软件,可自动执行软件供应,配置管理和应用程序部署。Ansible通过SSH,远程PowerShell或其他远程API连接。----选自wikipedia
简介:ansible有两种服务器类型,控制机器与节点。控制机器就是安装ansible服务的机器,我们在上面编写和运行ansible的程序代码,并在控制机器上通过ssh远程操作机器(下发上传、执行命令)。当ansible脚本不运行的时候,不会占用任何资源(比如saltstack在运行的时候就会启动进程来监控4505/4506端口),也正由于ansible的这个特点,每次ansible发布更新的时候,只需要更新控制机器就可以了。
1.1 如何安装及安装要求
要求:
- 控制机是linux系统,需要有python2.6/2.7
- linux系统打开文件数量设置大一些(方法自行百度)
- 节点要求,python2.4以上版本
安装方法(有很多,在此只列出常用的方法,具体安装步骤不做赘述):
- 源码安装 git://github.com/ansible/ansible.git
- yum 方式 / apt 方式 / emerge 方式 或其他linux系统的系统安装方式
- pip 方式
1.2 专有名词解释
关键字 | 释义 |
---|---|
playbook | 剧本,将要执行的步骤全部放到playbook里面 |
modules(通常指core modules) | 核心模块,用于执行某些任务的已有内置插件 |
roles | 角色,像演戏一样,剧本中指定在什么时候哪个角色来做什么操作,所以剧本包含角色,角色就有自己的台词,不过ansible里面的角色特殊的地方是,剧本只知识角色是干什么的,具体操作步骤是在角色本身管理(无厘头) |
custom modules | 自定义模块,在核心模块不够用的时候可以自定义编写模块 |
plugins | 插件,常用于ansible的日志系统与邮件系统,还有的插件有扩展内置连接方式、扩展变量定义方式、扩展内部循环语法、扩展新的过滤器等 |
Inventory | Ansible 管理主机的清单 |
1.3 原理图
1.4 连接机制
ansible通常使用的是ssh协议(或者Kerberos、LDAP)来进行连接(在openssh不支持的操作系统或ansible比较老的版本,ansible使用paramiko),ansible支持的连接方式有三种SSH、Local、ZeroMQ,在规模比较大的情况下使用ZeroMQ连接方式对执行速度有显著提高
1.5 常用文件及配置位置
文件 | 位置 |
---|---|
ansible应用程序的主配置文件 | /etc/ansible/ansible.cfg |
定义管控主机 | /etc/ansible/hosts |
二、简单的例子
这里我们来实现在所有被管控机器上执行hostname
命令输出主机名
2.1 配置被管控机器的连接信息
- 备注1:在
/etc/ansible/hosts
位置写入一个主机组(分组名为test
),以后针对这个分组操作就视为对分组内的所有主机操作。 - 备注2:
[test:vars]
标签下为test
分组的变量,ansible_ssh_user
和ansible_ssh_pass
是ansible的内置变量,意思为该分组下所有主机的用户和和密码,当前了也可以单独指定某台主机只需要将这两个参数追加到ip的旁边就好。这里三台主机都是同一个用户名和密码,所以像这样配置。 - 备注3:默认路径是在
/etc/ansible/hosts
,如果你不喜欢是可以修改的(修改配置文件/etc/ansible/ansible.cfg
的inventory=/etc/ansible/hosts
即可)
2.2 执行命令
执行命令,输出test
分组下的所有主机的主机名,-i
指定主机或分组,-m
指定使用的模块,-a
指定传给模块的参数,这里command
模块就是执行linux命令的模块缺省时默认使用该模块,相同作用的还有shell
模块、raw
模块、script
模块(使用场景与部分细节上不同,后面探讨)
2.3 讨论执行命令的四个模块有什么区别
每次在使用的时候都会有一些迷惑,为什么非要弄四个执行命令的模块出来,一开始决定没有必要,但是到后来才明白存在既合理,这里和大家探讨一下
模块 | 解释 |
---|---|
command模块 |
是为了安全的执行linux命令,所以不支持"<", ">", "|", 和 "&" 等符号(没有shell注入风险),如果要一定要使用这些,则使用shell模块 |
shell模块 |
通过/bin/sh 来执行,其他都和command一样 |
raw模块 |
用来执行低版本的linux命令,可以不需要python来执行命令,甚至支持windows命令,带来的问题是很多很特性是不能用的 |
script模块 | 其原理是先将脚本,复制到远程主机,再在远程主机上执行,所以要指定脚本路径以及操作方法 |
结论:要安全用command,要方便用shell,要操作写好的shell脚本或者其他脚本就用script、要是以上操作都跑不了的机器就用raw
三、 完成复杂的ansible操作
未完待续--
引用
Ansible插件扩展 https://blog.csdn.net/yongchaocsdn/article/details/79271870
资源
插件 https://github.com/ansible/ansible/tree/stable-2.4/lib/ansible/plugins
评论