进入自动化部署的大门-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的日志系统与邮件系统,还有的插件有扩展内置连接方式、扩展变量定义方式、扩展内部循环语法、扩展新的过滤器等
InventoryAnsible 管理主机的清单

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_useransible_ssh_pass是ansible的内置变量,意思为该分组下所有主机的用户和和密码,当前了也可以单独指定某台主机只需要将这两个参数追加到ip的旁边就好。这里三台主机都是同一个用户名和密码,所以像这样配置。
  • 备注3:默认路径是在/etc/ansible/hosts,如果你不喜欢是可以修改的(修改配置文件/etc/ansible/ansible.cfginventory=/etc/ansible/hosts即可)

    2.2 执行命令

执行命令,输出test分组下的所有主机的主机名,-i指定主机或分组,-m指定使用的模块,-a指定传给模块的参数,这里command模块就是执行linux命令的模块缺省时默认使用该模块,相同作用的还有shell模块、raw模块、script模块(使用场景与部分细节上不同,后面探讨)
20180827230444.png

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

坚持原创技术分享,您的支持将鼓励我继续创作!