1. 什么是ansible
ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。
所有的这几个目标本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。——批量的在远程服务器上执行命令 。
Ansible提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。
基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。不需要在远程主机上安装client/agents,因为它是基于ssh来和远程主机通讯的。
2. 快速安装
因为ansible是python开发的,因此可以这么安装:
sudo esay_install ansible
or
sudo pip install ansible
你也可以从github上clone最新版本,然后安装。
另外需要注意的是,控制服务器(Master)需要安装Python2.6/7,windows上无法使用ansible。被管理的服务器(Managed Node)需要安装Python2.4以上的版本,如果低于2.5,需要安装python-simplejson。
3. 配置
安装完成之后,先来配置下配置项——.ansible.cfg。ansible执行的时候会按照以下顺序查找配置项:
* ANSIBLE_CONFIG (环境变量)
* ansible.cfg (当前目录下)
* .ansible.cfg (用户家目录下)
* /etc/ansible/ansible.cfg
还有一个重要的配置是hosts的配置,所有的远程主机需要在hosts中配置,可以分组。当然hosts也可以执行时指定。先来一个简单的例子,在家目录下新建一个hosts文件:
[local]
127.0.0.1
4. Ad-Hoc
ad hoc——临时执行命令,在ansible中是指需要快速执行,并且不需要保存的命令。就是执行简单的一条命令。
对于复杂的命令用playbook。
ad hoc 和 playbook 的关系相当于 shell命令和shell脚本的关系
那么这个Ad-Hoc命令怎么用呢?在ansible中还有一个Module(模块)的概念,这个模块可以理解为一个库,所有的命令都需要通过模块来执行,比如
命令: ansible -i ~/hosts all -a ‘who’ ,其实是调用了默认的command模块: ansible -i ~/hosts all -m command -a ‘who’ ,除了command模块还有其他很多模块,比如你就想ping下这个服务器是不是还存在可以通过ping模块: ansible -i ~/hosts all -m ping 。
参数介绍
-i 指定host文件
-m 指定模块
-a 指定参数(一般为需要执行的命令)
-u username # 指定ssh连接的用户名
-f 10 # 指定并发数
–sudo [-K] # 如果需要root权限执行的话,-K参数是用来输入root密码的
5. 简单Playbook
上面的ad hoc是指执行一条临时的不需要保存的命令,那么复杂的命令怎么执行呢?因此也就有了playbook这个命令: ansible-playbook 。
playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好做什么。一个简单的playbook是这样的,把当前用户名输出到whoami.rst文件中:
# playbook.yml
---
- hosts: local # hosts中指定
remote_user: the5fire # 如果和当前用户一样,则无需指定
tasks:
- name: whoami
shell: 'whoami > whoami.rst'
执行完这个命令后,你可以在local所代表的服务器的用户目录下发现这么个文件。这个配置文件是yaml格式的,因此你可能需要去了解下YAML
简单解释下上面的playbook,hosts后面根据local是从hosts中读取的,tasks是是关键词,指明了要执行哪些任务;下面的name是任务的名称,shell是前面提到的module(模块),单引号中是命令。
除了tasks之外,还有一个handlers的命令,handlers是在执行tasks之后服务器发生变化之后可供调用的(一般用于重启服务)
handler,使用起来如下:
# playbook.yml
---
- hosts: local # hosts中指定
remote_user: the5fire # 如果和当前用户一样,则无需指定
tasks:
- name: whoami
copy: src=~/hosts dest=~/hosts.dest # 本地拷贝到远端
notify: # 如果copy执行完之后~/hosts.dest文件发送了变化,则执行
- clear copy # 调用handler
handlers:
- name: clear copy
shell: 'mv ~/hosts.dest hosts.del' # 假装删除
上面只是一个演示,再来一个真实的功能——在local服务器上,从git上clone下来我的blog源码,然后创建虚拟环境,创建数据库,最后运行:
# deploy-blog-simple.yml
---
- hosts: local # hosts中指定
remote_user: the5fire # 如果和当前用户一样,则无需指定
tasks:
- name: check out django_blog
git: dest=~/demos/django_selfblog repo=https://github.com/the5fire/django_selfblog
update=yes
- name: make virtualenv
shell: 'virtualenv ~/demos'
- name: install requirements
pip: requirements=~/demos/django_selfblog/requirements.txt
virtualenv=~/demos
- name: init database
shell: . ./bin/activate && cd django_selfblog/selfblog && ./init_database.sh chdir=~/demos
- name: run manage.py
shell: . ./bin/activate && cd django_selfblog/selfblog && ./run.sh chdir=~/demos
如果你已经配置好ssh账户免密码登录之后,直接执行: ansible-playbook deploy-blog-simple.yml 就可以在你指定的服务器上部署,并启动blog了。
原文地址:自动化工具——ansible中文指南
可参考以下文章:Ansible :一个配置管理和IT自动化工具