我们发现分布式是一个发展的趋势,无论是大型网站的负载均衡架构还是大数据框架部署,以及云存储计算系统搭建都离不开多台服务器的连续部署和环境搭建。
当我们的基础架构是分散式或者基于云的,并且我们经常需要处理在大部分相同的服务器上频繁部署大致相同的服务时,我们就应该考虑自动化配置和维护了。
————————————————
大牛张小凡的Ansible与其他几个自动化运维工具的对比文章:
Ansible官网
本文参考文章
Ansible介绍:
ansible是一个轻量级的运维自动化配置管理和配置工具,基于Python研发。集合了众多老牌运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible原理:
这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配置好的任务,服务器上不用安装任何多余的软件,只需要开启ssh,所有工作都交给client端的ansible负责。因为基于SSH,所以不需要像Salt这些同类工具一样需要在每台机器上安装agent,因此添加机器几乎不需要进行额外的操作。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。ansible基于 paramiko 开发的,它是一个纯Python实现的ssh协议库。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible架构及组件:
Host Inventory
定义ansible管理的主机,可以进行分组管理。
Core Modules
Ansible核心模块,ansible中模块就是用来指定对远程主机具体的操作,比如执行命令模块command、创建文件模块file等(ansible自带的模块)。
Custom Modules
自定义模块,如果核心模块不足以完成某种功能就可以使用任何语言自定义模块。
Connection Plugins
连接插件是Ansible用来连接被管理端的一种方式,比如客户端运行了SSH服务,Ansible利用SSH服务跟客户端进行通信,Ansible是通过Python编写的,而Python有一个模块paramiko支持并行连接SSH。Ansible事实上就是使用paramiko进行连接被管理端。但是它还支持其他的连接方法需要插件(如zeroMQ就是C/S模式工作)。
Plugins
第三方插件支持,如email、logging模块,只要有Python编写能力就可以自行编写插件。
Playbooks
剧本或编辑是Ansible的任务配置文件、将多个任务定义在剧本中由Ansible自动执行,Playbooks最大的好处就是支持幂等,也就是说相同的任务不管执行多少次其结果是不变的,带来的好处也就是持续可维护性。
选择Ansible的原因【优点】:
1.基于SSH,无客户端,部署便捷。
2.完全基于python开发,python门槛较低,方便对Ansible二次开发
3.Ansible内含丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能的需求。
4.Ansible无中心节点,简单的复制操作即可完成中心节点迁移。
Ansible安装与配置:
管理主机需要安装python2.6/2.7及以上版本。
以及ansible,在rhel系统中,python是被集成自带的,所以这里我只是安装了Ansible。下面是安装以及解决依赖性所用到的包。
安装完成后可以执行:ansible --version
来查看其版本
为了管理的方便,以及权限的安全,在使用ansible时,建议在普通用户下去使用。所以下面我将建立普通用户devops,来进行ansible的使用。同时为了ssh连接时的免密方便,我在server2与server3上同样建立了devops用户,并改了密码。
useradd devops #建立用户
passwd devops #改密码
su - devops #切换到普通用户 #默认进入其家目录
mkdir ansible #建立新的目录,将在该目录下写ansible文件
cd ansible #进入刚建立的目录
vim ansible.cfg #写主配置文件
vim inventory #解析文件
普通用户在对一些root权限的目录进行操作时,是不能直接操作的,所以这里我再赋予devops免密root权限
!!所有的主机上都要赋予,因为现在我们都是在普通用户下。这也是将所有用户建立成一样的用户名的好处,方便管理。
vim /etc/sudoers
可以在配置文件中提前做好权限工作,在主配置文件中写入-b参数的功能
vim ansible.cfg
SSH免密
ssh-keygen 密钥生成
ssh-copy-id server2
#将公钥发送给server2
#默认发送给server2的普通用户,我们只建立了devops,则会发给idevops。
#这里需要我们输入server2的devops用户密码,所以上面一定要改密码
ssh-copy-id server3
在免密以及上面的inventory文件和主配置文件完成后,就可以简单测试ansible的通信是否正常了。
ansible all -m ping #会ping所有在inventory文件中写入的主机 #-m指定模块【ping模块】
这里可以看一下devops用户对ansible现在的影响:-u指定用户,因为密钥是在devops用户下,所以连接是只有devops用户免密
简单的Ansible指令
Ansible提供了两种方式去完成任务,一是ad-hoc命令,二是playbook。
ad-hoc注重于用简单的指令完成简单的操作。
playbook则适合解决复杂或者需要固化的人物,类似于脚本。
Ansible-doc的说明工具:ansible-doc
ansible-doc -l #显示所有可用模块
ansible-doc yum #获取yum模块的使用帮助
ansible-doc copy #获取copy模块的帮助
ansible test -m copy -a "src=/etc/passwd dest=/tmp/passwd"
# 默认会对inventory文件中的第一个主机执行操作
ansible test -m command -a "ls /tmp"
# 使用command模块,可以直接执行shell命令
ansible test -a "ls /tmp"
# 默认-a后接要执行的动作
!!!一定要注意权限问题,如果上面没有给devops这个普通用户sudo免密的话,在执行-b操作时,可能会出错。
细心的人一定注意到了,上面执行过程中出现了三种颜色,红色代表错误;绿色代表正常,没有改变;黄棕色代表正常,但是有变化。
以上就是Ansible简单使用的一些过程了。Ansible功能模块众多,详细的学习一定要参考官网的说明手册哦~
大大的小小阳