Ansible一个IT自动化工具,用来配置系统部署软件

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 一些使用方法和应用场景,希望通过本文,能够让大家都爱上这个超级有能量的系统自动化管理工具。

时间: 2024-08-23 11:53:08

Ansible一个IT自动化工具,用来配置系统部署软件的相关文章

上位机-一个物联网方面的问题,做一个基于WiFi的楼宇能耗监测系统,软件部分怎么设计比较好,类似这个文档里的

问题描述 一个物联网方面的问题,做一个基于WiFi的楼宇能耗监测系统,软件部分怎么设计比较好,类似这个文档里的 http://www.docin.com/p-1224986285.html 之前并不知道上位机,也没学过C#.只学了一点php和J2EE.还需要做Android端,想问下各位前辈们的想法,是做成上位机吗?对WiFi那边的硬件也不是很了解, 本来是想做成网页或者客户端的,这个上位机是怎么做的? 怎么设计软件部分比较快一点... 还有APP怎么设计比较好? 解决方案 既然基于WI-FI,

自动化工具后起之秀Ansible的部署实践

本文讲的是自动化工具后起之秀Ansible的部署实践,从早期手动加脚本的部署方式,到后来自动化工具(chef, puppet, saltstack, ansible等)的出现,再到如今DevOps的盛行,企业应用部署正式进入平台部署阶段,CD(持续部署)已经成为企业对应用部署的标准需求,运维的交付也不再是以周或天为单位,而是以分钟为单位. 本文主要介绍自动化工具Ansible,及其在普元DevOps平台中的应用部署和日常应用部署中的实践. 本文目录: 一.如何选择合适的自动化工具? 二.Ansi

自动化领域:选择合适的自动化工具

在业务经营中,"少即是多"一般是常见的陈词滥调,IT也不例外.这意味着通过寻找更有效的方式利用现有资源以应对不断增长的需求.这通常是通过任务自动化和简化的过程与脚本和批处理作业来实现的.虽然这些方法是有效的单一的系统或任务,它们的范围有限,因为它们一般不延伸超过一个单一的系统.而为了使IT产业能够满足企业的需求,必须将脚本化使之成熟为一种能够跨越多个系统的自动化工具. 单个任务的自动化仅是自动化旅程的第一步.今天的IT基础架构必须无缝交互,使组织能够以难以置信的速度迁移多个系统的组合.

最值得考虑的Linux自动化工具:CFEngine

如果数据中心使用Linux系统,系统管理员有大量的可供选择的工具.在适当配置后,Linux工具可以在数据中心运营的几乎每个方面提供有效帮助. Linux数据中心的工具在使用上往往有一定复杂度,但是为此付出额外操作是值得的.因为这些复杂的工具能够提供一系列的具有很大灵活性的功能和服务.本文介绍最值得考虑的Linux自动化工具:CFEngine. Linux自动化工具CFEngine CFEngine介绍:CFEngine作为一个Linux自动化工具,可自动化大量的配置,并且保持配置的一致性和依从性

自动化工具——云与应用的桥梁

原先,在我们的想法中,尽管有自动化部署工具在部署应用时会很好,但并不是说就是必须的.但是现在随着组织目睹了自动化的好处,这种观念也在随之发生改变.专家说实际上,自动化应用部署工具在云中托管应用中是必需工具.用于本地部署的工具不一定适用于云部署,为此,我们就要考虑,组织领导在做出在本地还是云中托管的决策时应当考虑需要什么样的工具. 很多事情不到节骨眼上,是不会被重视的,除非准备要做这件事情了,否则组织也不会考虑到怎样把应用弄到云上面去."云中部署从属于云中运行应用,这整个想法.人们不会说'我该在云

Ansible :一个配置管理和IT自动化工具

Ansible :一个配置管理和IT自动化工具 今天我来谈谈 ansible,一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁.让 ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件.同时提供的一个优点在于,如果需要的话,你可以在不止一个地方控制你的整个基础架构.最后一点是它的正确性,或许这里有些争议,但是我认为在大多数时候这仍然可以

在 CentOS 7 中安装并使用自动化工具 Ansible

Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于Chef和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端.它使用SSH来和节点进行通信. 本篇中我们将在CentOS 7上安装并配置Ansible,并且尝试管理两个节点. Ansible 服务端 – ansible.linuxtechi.com ( 192.168.1.15 ) 节点 – 192.168.1.9 , 192.168.1.10 第一步: 设置EPEL仓库 Ansi

集群运维自动化工具ansible之使用playbook安装zabbix客户端_服务器其它

之前介绍了关于ansible的安装与使用(包括模块与playbook使用,地址是http://www.jb51.net/article/52154.htm),今天介绍一下如何使用playbook来部署zabbix客户端. ansible服务端的环境为centos 6.5 x86_64系统 ansible客户端环境为centos 6.3 x86_64系统 目前我的playbook只允许centos或redhat 6系列系统来安装zabbix客户端,并且客户端的版本是2.0.6. 下面是playbo

十个强大的DevOps基础设施自动化工具,不容错过

Devops基础设施自动化的工具 有许多工具用于基础设施自动化.使用哪个工具决定于体系结构和基础设施的需求.下面我们列出了一些伟大的工具,用于不同类别配置管理.编制.持续集成.监控等. 1.Chef Chef是一个基于ruby开发的配置管理工具.你可能会遇到"基础设施代码"这个词,这意味着配置管理.厨师烹饪书的概念,你的代码基础设施DSL(领域特定语言)和一个小的编程.chef规定和配置虚拟机根据规则中提到的食谱.代理将会运行在所有的服务器配置.代理将chef主服务器的cookbook