最近纠结于在Puppet、Chef、SaltStack、Ansible等一干配置管理工具中如何选择。考虑到一旦开始没有选好,以后更改又是一堆麻烦事,所以就稍微有些慎重。
Puppet和SaltStack曾用过,但不是十分符合预期,所以先行排除。至于Chef,虽然老早就听说过,但却一直没有找到机会尝试。翻了翻文档,Chef跟Puppet及SaltStack也是一样采用服务端/客户端模式,对于在现有一定数量的机器上部署仍然有些麻烦。最后落单到Ansible上。经过对Ansible的测试,感觉Ansible于我比较相投。喜欢Ansible的方面包括:
充分利用现有设施。使用Ansible无需安装服务端和客户端,只要SSH即可。这意味着,任何一台装有Ansible的机器都可以成为强大的管理端。人个觉得,这种去中心化的思路显得更为灵活。可能有人会担心SSH的效率,Ansible的并行执行及加速模式或许可以打消你的顾虑。
使用简单,快速上手相当容易。在用Puppet之前,就没少花时间钻研它。想想吧!使用这类自动化管理工具不就是想把自己从重复的、复杂的事情中解放出来么?为了简化一件事,而沉入另一件复杂的事,是不是有些不划算?从我的体验来看,Ansible上手十分快,用Ad-Hoc可以应付简单的管理任务,麻烦点的也可以定义Playbook文件来搞定。
采用人类易读的格式。Ansible的主机定义文件使用INI格式,支持分组,能够指定模式;此外也能动态生成,这对管理云主机应当很有用。而Playbook则是YAML格式,觉得它比 Puppet的DSL要易读易写多了。
能够使用你熟悉的语言来编写模块。虽然Ansible是使用Python开发的,但它不会将你限制到某种具体的编程语言,Bash、Python、Perl、Ruby 等等都可以,你擅长什么就用什么。
一言以蔽之,Ansible背后的简单化哲学深得我心。这也比较符合我选择软件的一贯原则。
可能还有人会比较关心目前Ansible都有谁在用。毕竟,榜样的力量是无穷。Puppet不正是因为Google在用而吸引了不少眼球么?据我所知,当前使用Ansible较为知名的用户包括 Fedora、Rackspace、Evernote等等。
安装Ansible
Ansible能够安装到Linux、BSD、Mac OS X等平台,Python版本最低要求为2.6。
常用Linux发行一般可以通过其自带的包管理器安装Ansible:
yum install ansible # RHEL/CentOS/Fedora,需要配置EPEL
apt-get install ansible # Debian/Ubuntu
emerge -avt ansible # Gentoo/Funtoo
如果你在所用Linux发行版的包仓库中找不到Ansible,那么也可以通过pip来安装Ansible,同时也会安装paramiko、PyYAML、jinja2等Python 依赖库。
pip install ansible
准备Inventory
Inventory 文件用来定义你要管理的主机。其默认位置在/etc/ansible/hosts ,如果不保存在默认位置,也可通过-i选项指定。
被管理的机器可以通过其IP或域名指定。未分组的机器需保留在hosts的顶部,分组可以使用[]指定,如:
[web]
example.cn
同时,分组也能嵌套:
[vps:children]
web
db
此外,也可以通过数字和字母模式来指定一系列连续主机,如:
[1:3].example.cn # 等价于 1.example.cn、2.example.cn、3.example.cn
[a:c].example.cn # 等价于 a.example.cn、b.example.cn、c.example.cn
小试牛刀
现在,执行以下命令来看看Ansible是否能正常工作:
ansible -i hosts all -m ping -u www
该命令选项的作用分别为:
-i:指定inventory文件,使用当前目录下的hosts
all:针对hosts定义的所有主机执行,这里也可以指定组名或模式
-m:指定所用的模块,我们使用Ansible内置的ping模块来检查能否正常管理远端机器
-u:指定远端机器的用户
如果返回如下结果:
example.cn | success >> {
"changed": false,
"ping": "pong"
}
则说明一切正常。
下面再看看远端机器的uptime:
ansible vps -a 'uptime'
这将输出:
example.cn | success | rc=0 >>
11:23:16 up 177 days, 21:19, 0 users, load average: 0.55, 0.45, 0.39
此处省略了-m,Ansible 默认使用command 模块;-a指定模块的参数,即执行uptime 命令。
使用Ad-Hoc管理简单任务
执行Ad-Hoc就跟在Linux下执行单行命令差不多,用来快速完成简单的任务十分方便。比如:如果被管理端的Python为2.4,那么需要python-simplejson这个包。可以通过以下命令在所有CentOS主机上安装它:
ansible all -m raw -a 'yum -y install python-simplejson'
花时间看看Ansible的模块非常值得,你将明白它能干什么。创建用户及组、安装软件包、分发配置文件、管理服务等等不一而足。在命令行下,可通过ansible-doc查询模块文档,如:
ansible-doc raw
使用Playbook管理复杂任务
对于需反复执行的、较为复杂的任务,可以通过定义Playbook来搞定。Playbook是Ansible真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色及包含指令来重用既有内容。
来看一个简单的例子,该例子在远端机器上创建一个新的用户:
---
- name: create user
hosts: vps
user: root
gather_facts: false
vars:
- user: "toy"
tasks:
- name: create {{ user }} on vps
user: name="{{ user }}"
首先,给Playbook指定了一个名称;接着,通过hosts让该Playbook仅作用于vps组;user指定以root帐号执行,Ansible也支持普通用户以sudo方式执行;gather_facts 的作用是搜集远端机器的相关信息,稍后可通过变量形式在 Playbook 中使用;vars定义变量,也可单独放在文件中;tasks指定要执行的任务。
要执行Playbook,可以敲入:
ansible-playbook user.yml
执行结果为:
PLAY [create user] ************************************************************
TASK: [create toy on vps] *****************************************************
changed: [linuxtoy.org]
PLAY RECAP ********************************************************************
linuxtoy.org : ok=1 changed=1 unreachable=0 failed=0
关于Playbook的详细用法,推荐阅读 Ansible 的官方文档,并参考官方示例。
总结
Ansible由Puppet的前雇员所创建,使用起来真的很简单。不仅仅是配置管理,远程执行、应用部署等任务皆能完成,而且便于利用自身所熟悉的语言扩展,确为不可多得的好工具。