Ansible 是通过 Python 语言开发。当前使用 Ansible 的用户有:evernote、rackspace、NASA、Atlassian、twitter 等。
Ansible 的目标是操作的最简单和最易用。它也强烈关注安全和可靠性、精简性、OpenSSH 传输的运用(具有一个加速的套接字模式和推模式作为替代)以及语法的易读性。
Ansible 可以管理小型的网络环境,也可以用于管理上千人的企业级网络环境,它都能够游刃有余的完成您所交待的任务。
Ansible 管理机器上不需要安装代理客户端程序。这意味着 Ansible 管理工作中不会有升级远程代理客户端程序或不能管理系统的问题。Ansible 借助于开源组件 OpenSSH 来与远程机器通信。Ansible 采用分散性的管理,它依赖于您的系统凭据来控制和访问机器。当然,如果您需要,您也可以使用 Kerberos、LDAP 以及其它的集中式验证管理系统来轻易的完成连接。
安装
Ansible 默认通过 SSH 协议管理机器。在 Ansible 安装完后,不需要为它配置数据库,Ansible 不会以 daemons 方式来启动或保持运行状态。您仅仅需要安装 Ansible 在一台机器上,它就可以像中心服务器一样管理所有的远程机器,为了便于区分,笔者在本文中将安装 Ansible 的机器称为中心控制服务器,将被 Ansible 的机器统称为远程服务器。
该怎样选择 Ansible 的安装版本
如果您使用的是 RedHat Enterprise Linux(TM),CentOS,Fedora,Debian 或者 Ubuntu,并且您想要使用 Ansible 的最终版本的话,强烈推荐您使用 OS 的包管理器安装 Ansible ,例如 CentOS 的 YUM ,Debian 的 apt。如果您使用的是其它系统,那么推荐您使用"PIP" 。pip 是一个 Python 包安装和管理工具,功能类似 Node.js 的 npm、Ruby 的 gem。通过 pip 可以非常方便对 Python 包进行安装、升级、删除等管理操作。前面介绍过 Ansible 是使用 Python 开发,Ansible 也可以通过 pip 安装。在稍后的"安装中心控制管理服务器"一节会介绍如何通过 pip 安装 Ansible 。如想了解 pip 的更多详情,请访问 https://pypi.Python.org/pypi/pip/
安装 Ansibl 中心控制服务器需求:
当前 Ansible 可以运行在安装了 Python2.6 的任何机器上(暂不支持 Windows 机器做中心控制服务器),这包括 RedHat、Debian、CentOS、OS X、BSDS 等等。
被管理节点服务器需求
在被管理节点服务器上,需要安装 Python2.4 或更高的 Python 版本,如果在远程机器上运行的 Python 小于 Python2.5 的话,您将需要安装 Python-simplejson 。如果在远程机器的启用了 SELinux,您还需要安装 libselinux-Python 。
安装中心控制管理服务器
笔者使用的操作系统是 CentOS Linux 6.4 ,笔者在这里讲解通过 RPM 包与 PIP 的方式安装 Ansible。读者可以根据自己的喜好选择自己喜欢的安装方式。更多的安装方法读者可以参考 Ansible 的官方文档了解。
YUM 安装
Ansible 的 RPM 包现在是可以通过使用 EPEL 6 YUM 资源库获取并安装。首先请确保您的机器上是否已经安装了 epel6,通过 rpm 指令查询
rpm –qa | grep epel
如果没有安装,那么现在就开始安装
rpm –ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装 Ansible
yum –y install ansible
pip 安装
在使用 pip 之前,请确保您的系统已经安装 Python 的 setuptools 包
yum –y install Python-setuptools
安装 pip
easy_install pip
通过 pip 安装 Ansible
pip install ansbile
怎么样?通过 pip 安装 Ansible 是不是很简单,只要简单的三个步骤,就完成了操作。只要支持 Python 的操作系统,都可以使用 pip 安装。
好的,现在您如果照着做的话,您已经在您的电脑上安装好了 Ansible 。
在我们开始使用 Ansible,理解 Ansible 如何通过 SSH 协议与远程机器通信是非常重要的。
Ansible 使用一个高质量的 Python 实现的 OpenSSH 协议库"paramiko"。 Paramiko 遵循 SSH2 协议,支持以加密和认证的方式,进行远程服务器的连接。使用 paramiko 可以很好的解决以下问题:需要使用 Windows 客户端,远程连接到 Linux 服务器。如果读者对 paramiko 感兴趣,想了解更多关于 paramiko 的信息,请访问 paramiko 的官方网站:http://www.paramiko.org/
当中心控制服务器与远程机器通信时,Ansible 默认使用 SSH Keys 方式通信,这个也是官方推荐的方法,但是如果您想使用密码的话,也是可以的。为了启用密码验证,使用 –ask-pass 选项,如果使用 sudo,那么使用 –ask-sudo-pass 选项。在本文中,笔者采用密码验证方式进行演示,读者可以根据的需要选择使用密码验证还是密钥验证。
使用 Ansible 向远程机器执行第一条命令
如果您想要对远程机器进行管理,那么首先您需要将远程机器的主机名或 IP 写入 Ansible 清单文件/etc/ansible/hosts 中,在 Ansible 中称其为清单文件,里面包含了所有您要管理的机器。编辑 /etc/ansible/hosts,将远程主机的 IP 或主机名加入到文件中,如下
192.168.79.120
在将远程主机加入到清单文件,我们先用 Ansible 测试下与程主机的连通性,使用 Ansible 的模块 ping 来测试
ansible 192.168.79.120 –m ping –ask-pass
图 1.ansible ping 结果:
Ansible 将尝试使用您当前的用户连接到远程机器,就像我们平常使用的 SSH 一样。这里笔者使用的是密码验证。如果您想指定用户,使用"-u"参数加用户名。如下:
ansible 192.168.79.120 –m ping –ask-pass –u jack
通过以上的命令,我们知道 Ansible 机器与远程主机的通信是没有问题的,现在就在远程主机上执行一条命令
ansible 192.168.79.120–ask-pass –a "/bin/echo hello"
图 2.ansible 执行命令结果:
非常不错,Ansible 在远程主机上执行命令成功。
Ansible 的清单文件
Ansible 不善于同时处理多个不同的应用项目,为了有效区分多个不同的应用项目,通过选择在 Ansible 清单文件中列出的一部分应用项目,选择所要操作的系统。Ansible 的清单文件是默认是存放在/etc/ansible/hosts 。当然您如果想自定义清单文件的存放位置也是可以的。
Ansible 清单文件的格式与 INI 格式很相似。
图 3./etc/ansible/hosts 文件节选如下:
在中括号"[]"中的是组名。组名主要是用来对机器分类,并说明机器的用途。
同一台机器可以加入一个组,也可以加入多个组,例如一台机器可以同时在 webserver 组也以在 dbserver 组中。
如果有远程机器是使用的非标准的 SSH 端口(注:标准的 SSH 端口为 22),可以将端口号放在 IP 或主机名的后面,如某台远程机器的 IP 为 192.168.79.121,SSH 端口为 2080,那么可以这样写如下:
192.168.79.121:2080
如果您有大量的主机,它们的命名格式是:www1.example.com、www2.example.com、www3.example.com ……,那么您可以像下面这样在清单文件指出,而不是全部一个一个列出来:
[webservers]www[1:50].example.com
还可以定义字母范围,如下:
[databases]db-[a:f].example.com
您也可以基于每台机器选择连接类型和用户,如下
[targets]localhost ansible_connection=localother1.example ansible_connection=ssh ansible_ssh_user=jackother1.example ansible_connection=ssh ansible_ssh_user=liheng
以上是一些清单文件中的基本设置标准。
Anisble 命令行
Ansible 命令行可以快速的完成一些简单的工作。使用好 Ansible 命令行工具,对于今后学习 playbooks 语言提供了前提。
在前面笔者已经展示了如何使用 Ansible 在远程机器上执行命令。下面笔者再介绍一些 Ansible 命令行的其它功能
文件与目录管理
Ansible 可以传输文件到多个机器。为了传输文件到多个不同的机器:
ansible targets–m copy –a "src=/etc/hosts dest=/tmp/hosts"
图 4.ansible 命令行示例结果:
Targets 是主机的组名,-m 要执行的模块名,这里是使用 copy 模块,-a 模块参数。具体说明可以使用 anisble –h 查看。
您也可以在指定目标文件的所有者和权限,如下:
ansible targets -m copy -a "src=/etc/hosts dest=/tmp/hosts mode=600 owner=test group=test" --ask-pass
如果您想改变远程主机上的目录或文件权限,可以使用 files 模块,如
ansible targets –m file –a "dest=/tmp/hosts mode=600 owner=test group=test" –ask-pass
还可以通过 file 模块创建目录,类似于"mkdir -p":
ansible targets –m file –a "dest=/tmp/tmpdir mode=755 owner=test group=test state=directory" –ask-pass
当然还可以通过 file 模块删除目录
ansible targets –m file –a "dest=/tmp/tmpdir state=absent" –ask-pass
注意,file 模块是递归删除,类似于 rm –rf 。
包管理
Ansible 的 YUM、apt 模块可以用来管理 YUM、apt 包管理器。下面以 YUM 模块为例做介绍
检查包是否安装,如果没有安装,就安装,已安装的话,不会更新包。
ansible targets –m yum –a "name=gcc state=installed" –ask-pass
安装指定版本的包
ansible targets –m yum –a "name= gcc-4.4.7 state=installed" –ask-pass
安装最稳定的版本
ansible targets –m yum –a "name=gcc state=latest" –ask-pass
删除包
ansible targets =m yum –a "name=gcc state=removed" –ask-pass
用户和组管理
User 模块可以用来创建和维护已经存在的用户帐号,还可以用来删除已存在的用户帐号。
首先生成用户的加密密码
yum –y install Python-paslibPython -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('123456')"$6$rounds=40000$YFDgOuWb47e2xREt$87szy5qOrzU.MDwDc.\yEzTt7mkGSCKGh3NlBRTQXjbkKJZBOrlCBSGhl19VcHEvEBUjttcfah5VqlulkZS2Cc/
上面的指令生成了密码"123456"的加密密码
ansible targets –m user –a "name=bobo password=$6$rounds=40000$YFDgOuWb47e2xREt$87szy5qOrzU.MDwDc.\yEzTt7mkGSCKGh3NlBRTQXjbkKJZBOrlCBSGhl19VcHEvEBUjttcfah5VqlulkZS2Cc/" –ask-pass
删除用户
ansible targets –m user –a "name=bobo state=absent" –ask-pass
管理服务
在指定机器上启用 nginx 服务
ansible targets –m service –a "name=nginx state=started" –ask-pass
图 5.管理服务执行结果:
重启 nginx 服务:
ansible targets –m service –a "name=nginx state=restarted" –ask-pass
停止 nginx 服务
ansible targets –m service –a "name=nginx state=stopped" –ask-pass
ansible 有非常多的模块,笔者统计 ansible 支持的模块有 183 个之多,要查看可用的模块,使用指令
ansible-doc –l
Playbooks
Playbooks 相比较命令行模式来说,是采用一个完全不同的方式使用 Ansible 。简单来说,playbooks 是真正简化配置管理和多机器部署的基础,playbooks 非常适合部署复杂应用。Playbooks 可以声明配置,playbooks 推送您设置好的配置并保证配置推送到指定的远程主机上应用起来。
Playbooks 使用 YAML 格式,并具有简明易懂的语法应用,Anisble 为了保证 playbooks 的易配置性性和易读性,尽可能的使 playbokks 的语法不像程序语言或脚本语言,而更像是一个配置或处理模型。
每一个 playbook 将一个或多个'plays'组合成一个列表。通过组合一个 playbook 中的多个 plays,可以协调多台远程主机的部署,在所有指定的机器上同时运行某此定义好的操作指令。可以定义众多的 plays 应用到您管理的远程主机做许多不同的事情。
以下笔者以使用 Ansible 安装 nginx 来演示 playbooks 的简单示例:
图 6.目录结构示意图:
笔者在/etc/ansible 目录建立了一个 playbook 用于专门存放所有的 playbooks ,playbook 目录是各个应用的 playbook 文件,各目录以应用命名,templaes 目录存放所有 playbook 的模板。
以下是 nginx 的 playbook 文件 nginx.yml 内容:
---- hosts: webservers remote_user: root vars: connections : "65535" tasks: - name: ensure nginx is at the latest version yum: pkg=nginx state=latest - name: write the nginx config file template: src=/etc/ansible/playbook/templates/nginx/nginx.j2 dest=/etc/nginx/nginx.conf notify: - restart nginx - name: ensure nginx is running service: name=nginx state=started handlers: - name: restart nginx service: name=nginx state=restarted
文件的第 1 行是"---"这是 YAML 要求的文件解释符;
文件的第 2 行是"- hosts: webservers"指定了将要执行 playbook 的主机,可以是单台机器,也可以一组机器,这个名称是在 /etc/ansible/hosts 文件中定义。
文件的第 3 行是"remote_user: root"设定了执行 playbook 中操作的远程用户。
文件的第 4-5 行设置了一些相关的变量,您可以根据实际的需要设置配置文件中的值,这些变量会在模板文件中使用到。
文件的第 6 开始设置任务(task)从第 7-14 行设置的任务的具体内容,这里笔者设置了 3 个任务,包括安装 nginx;修改 nginx 配置文件,并在修改 nginx 时重启 nginx;启用 nginx 服务。这里有一点要注意,任务的执行是依序进行,一个只执行一个任务。在完成一个任务之后再接着执行下一个任务。
文件的第 15-17 行,在文件被修改时将也要执行的操作。细心的读者可能注意到在文件的 11 行的"notify:","notify"动作就是调用 handler 部分的操作,当客户端的/etc/nginx/nginx.conf 文件发生更改时,就会重启 nginx 。
以下 template/nginx/nginx.j2 文件的内容
user nginx;worker_processes {{ ansible_processor_count }};pid /var/run/nginx.pid;error_log /var/log/nginx/error.log;#error_log /var/log/nginx/error.log notice;#error_log /var/log/nginx/error.log info;events { worker_connections {{ connections }} ; # multi_accept on;}http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/x-javascript \ text/xml application/xml application/xml+rss text/javascript; ## # If HTTPS, then set a variable so it can be passed along. ## map $scheme $server_https { default off; https on; } ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf;}
在模板文件中,笔者使用了两个变量,分别是"{{ ansible_processor_count }}"与"{{ connections }}","{{ ansible_processor_count }}" 是 ansible 定义的变量,这个变量用来计算机器的处理器核数,"{{ connections }}"是笔者在 nginx.yml 文件中自定义的变量。
运行 ansible-playbook ,使配置生效
ansible-playbook nginx/nginx.yml --ask-pass
图 7.ansible-playbook 运行结果图:
从结果中我们可以看到 Ansible 对于每一个动作或任务都有较为详细的状态说明,从显示结果可以非常清楚到查看每一个动作或任务的最终结果,这对于我们推送服务器配置和远程服务器执行命令是非常有帮助的。
Ansible 与其它配置管理的对比
笔者选择了目前几款主流的与 Ansible 功能类似的配置管理软件 puppet、Saltstack,这里所做的对比不针对各个软件的性能作比较,只是对各个软件的特性做个对比。具体内容见表 1:
表 1.Ansible Vs. puppet Vs. Saltstack 对比
Puppet Saltstack ansible 开发语言 Ruby Python Python 是否有客户端 有 有 无 是否支持二次开发 不支持 支持 支持 服务器与远程机器是否相互验证 是 是 是 服务器与远程机器通信是否加密 是,标准 SSL 协议 是,使用 AES 加密 是,使用 OpenSSH 平台支持 支持 AIX、BSD、HP-UX、Linux、 MacOSX、
Solaris、 Windows 支持 BSD、Linux、Mac OS X、Solaris、 Windows 支持 AIX、BSD、 HP-UX、 Linux、Mac OSX、Solaris 是否提供 web ui 提供 提供 提供,
不过是商业版本 配置文件格式 Ruby 语法格式 YAML YAML 命令行执行 不支持,但可通过配置模块实现 支持 支持
结束语
Ansible 是一个新兴的 IT 自动化管理工具。目前它的下载量已经超过了 100 万。在 GitHub,它是排名前 10 位的 Python 项目。可以预见 Ansible 的发展是不可限量。笔者通过本文简单的向大家介绍了 Ansible 一些使用方法和应用场景,希望通过本文,能够让大家都爱上这个超级有能量的系统自动化管理工具。