简介
配置管理、应用部署、临时任务等功能的开源软件工具。开发语言Python。协调器配置文件Playbook使用YAML格式。默认使用SSH管理远端服务器,因此不需要额外安装代理。对比
和puppet,saltstack的简单对比ansible | saltstack | puppet | |
---|---|---|---|
历史 | 始于2012,由Puppet前雇员、Cobbler的作者、Func的联合作者米高迪翰(Michael Dehaan)开发 | 始于2011,作者是汤玛士S赫奇(Thomas S Hatch)。新型项目,活跃,不稳定,BUG多 | 始于2005,历史悠久,成熟,稳定 |
主要功能 | Configuration, State Management, Software Installation, Orchestration,Command Execution | 配置管理,状态管理,软件安装,协调,远程执行 | 配置管理。MCollective模块负责Orchestration和远程执行 |
语言 | Python | Python | Ruby |
拓扑结构 | CS结构(control machine, managed node) 不需要安装客户端代理 |
CS结构(master, minion, syndic) 必须安装代理(0.17.0+版本增加了salt-ssh,可以通过SSH通信,无需部署minion) |
CS结构() |
通信层协议 | SSH2 (Python paramiko模块) 1.3之后旧的Fireball模式已不再使用,新增新的加速模式 1.5之后支持SSH pipeline模式 |
ZeroMQ (PUB/SUB模式)。速度快,有时执行丢机器 | REST |
安全 | 通信、认证基于SSH | 支持外部认证、授权,如PAM, LDAP。通信不加密? | |
输出格式 | json | 格式有raw, text, yaml, json 等 结果数据还可以通过Returner导入其它外部存储,如Redis, MongoDB, MySQL等 |
|
配置文件 | Playbook剧本(YAML, jinja2模板引擎) 按剧本顺序执行 没有依赖关系? |
sls状态文件 默认Renderer是YAML+jinja2模板引擎 执行顺序不以sls中定义的为准。0.17.0增加state_auto_order选项,按照sls中定义的顺序执行 执行任务、顺序受依赖关系影响 |
pp(DSL) |
开发 | 有API | REST API,目前是个独立的项目 | |
客户 | EverNote, Rackspace, Fedora, Care.com, ... | LinkedIn, Hulu, Rackspace, Mulesoft, Affirm, Comcast, Clemson University, ... |
环境要求
管理端(Control Machine):- Python 2.6
- Python模块:python-pip python-simplejson python-paramiko PyYAML python-jinja2 python-httplib2
- Python 2.4+
- Python 2.4版本需要安装Python模块:python-simplejson
- 不支持Python 3.x
- Solaris系统默认不带Python,默认不能支持ansible。需要手工安装Python2.4+,并指定Python解释器(设置变量ansible_python_interpreter)
- RHEL4.x系统自带Python版本是2.3,因此默认也不能支持ansible。操作同Solaris
- #script模块和#raw模块不需要被管理端安装Python解释器和python-simplejson模块
模块
模块 | 被管理端是否安装Python环境 | 控制端显示格式 | 是否支持SHELL变量、重定向等 |
---|---|---|---|
command | 是 | 原始 | 否 |
raw | 否 | 原始 | 是 |
script | 否 | json | 是 |
shell | 是 | 原始 | 是 |
command模块
执行一条命令,后面跟着以空格分开的参数不通过SHELL解释器执行命令,所以不支持SHELL变量和重定向符号等,比如$HOME变量,"<"、">"、"|"、和"&"等操作符(如有此需求,请使用#shell模块)
举例:
$ ansible bai -m command -a "hostname" 10.11.12.1 | success | rc=0 >> sns1.cp.sohu.com 10.11.12.2 | success | rc=0 >> sns2.cp.sohu.com ...被管理端必须安装Python解释器和python-simplejson模块
raw模块
raw模式下,不经过其它模块子系统,执行原始的SSH命令被管理端服务器无需安装任何Python解释器及Python模块
使用raw模式通常有2个目的:1.初始化(Bootstrap)被管理端的Python环境,2.管理一些无法安装Python的特殊设备(如路由器)。其它情况建议使用#script模块或#command模块
举例:
$ ansible bai -m raw -a "hostname" 10.11.12.1 | success | rc=0 >> sns1.cp.sohu.com 10.11.12.1 | success | rc=0 >> sns2.cp.sohu.com ...
script模块
将一个本地脚本传输到远程服务器上,执行此脚本,脚本后面可以带一系列参数和#raw模块一样,被管理端服务器无需安装Python环境
举例:
$ echo 'hostname; echo $1' >/tmp/z $ ansible bai -m script -a "/tmp/z haha" 10.11.12.1 | success >> { "rc": 0, "stderr": "", "stdout": "sns1.cp.sohu.com\nhaha\n" } 10.11.12.2 | success >> { "rc": 0, "stderr": "", "stdout": "sns2.cp.sohu.com\nhaha\n" } ...
shell模块
同#command模块,只不过通过/bin/sh解释器执行命令举例:
$ ansible bai -m shell -a "echo \$HOME" 10.11.12.1 | success | rc=0 >> /home/bai 10.11.12.2 | success | rc=0 >> /home/bai ...
临时任务
临时任务(Ad hoc task)通常是一次性执行、比较简单的命令剧本通常用于配置管理和发布
不写-m参数,默认以#command模块执行临时命令