天天看点

《Ansible权威指南》一3.3 Ad-Hoc组管理和特定主机变更

本节书摘来自华章出版社《ansible权威指南》一书中的第3章,第3.3节,作者 李松涛 魏 巍 甘 捷 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 ad-hoc组管理和特定主机变更

3.2节为大家介绍了ansible模块列表及help说明获取方式。日常运维工作中,我们往往会将负责相同场景应用的主机划分为一个组,以方便统一管理。ansible也提供了简洁但强大的组管理功能。同时,我们也可能遇到只针对这组主机中一台或某些主机做变更的场景,针对这些复杂多变的企业场景,本节我们将深入了解ad-hoc组管理和特定主机变更,进一步了解ansible如何应对复杂多变的企业环境。

3.3.1 ad-hoc组定义

ad-hoc的组功能定义在inventory文件中,默认路径是etcansiblehosts,书写格式遵循ini风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,若目标主机使用了非默认的ssh端口,还可以在主机名称之后使用冒号加端口号来标明。下面通过实际案例来了解inventory文件的书写规则。

如下为inventory文件示例,包括了组定义及冒号加端口号功能的使用。

ntp.magedu.com

[webservers]

www1.magedu.com2222

www2.magedu.com

[dbservers]

db1.magedu.com

db2.magedu.com

db3.magedu.com

如果远程主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,如下案例为大家展示该写法。

www[0150].magedu.com

[databases]

db-[af].magedu.com

本次架构规划了前端proxy、web servers和后面db一套完整应用,以方便大家实际参考,拓扑规划请参考图3-5。图中共定义了proxy、app、nosql和db这4个组。组配置请编辑etcansiblehosts添加如下配置:

[proxy]

192.168.37.159

[app]

192.168.37.130

192.168.37.160

[nosql]

192.168.37.142

[db]

应用分布如下。

[proxy]组:nginx;

[app]组:nginx+php+django;

[nosql]组:redis;

[db]组:mariadb。

如图3-5所示的架构拓扑是简化后的互联网web服务架构,用户请求通过proxy转发至后端webservers响应,通过nosql服务缓冲后,最终将请求传送到db。我们本章的实战内容就是通过ansible来搭建这样一套web服务架构。

3.3.2 ad-hoc配置管理:配置proxy与web servers实践

本节通过配置proxy &web servers学习ad-hoc的组管理方式,前端proxy只用到nginx七层代理功能,将请求转发至后端web servers,web servers同时部署nginx、php和django应用,我们按proxy、webservers依次顺序部署应用。

(1)ad-hoc配置管理proxy(即nginx)

安装nginx,执行命令:

ansible proxy -m

yum -a name=nginx state=present

利用ansible安装nginx,如图3-6所示。

 changed true,    表示本次命令对执行的目标有变更,如再执行一次则为false,表示执行的目标没

                  有变更,这里的false和true不代表该命令执行成功或失败,只是表示执行目

                  标是否被变更

rc 0,           resultcode的简写,表示命令的执行结果状态返回,非0均为异常,命令执行失败

results [ 执行结果信息返回

如果我们要检查nginx正常安装,可以执行命令:ansible

proxy -m command -a nginx -v,如果正常则返回如下内容:

192.168.37.159  success 

rc=0

nginx version

nginx1.0.15

ansible的yum模块同样支持指定某版本安装,其name参数指定具体版本地址(网络或本地均可)。yum模块也支持从网络安装或从本地安装。

如果从网络安装,执行命令:

yum -a name=httpnginx.orgpackagescentos6noarchrpmsnginx-release-centos-6-0.el6.ngx.noarch.rpm

state=present

如果从本地安装,执行命令:

yum -a name=usrlocalsrcnginx-release-centos-6-0.el6.ngx.noarch.rpm

如指定网络安装,安装期间请保障网络畅通,并可以访问internet,具体安装时长视网络宽带质量而定,如100m带宽,该项安装进行了约2min。如图3-6为nginx安装的部分结果反馈,ansible在对执行结果返回提示做得确实不尽人意,虽为json格式输出,但换行和颜色标识功能仍有待改善。

(2)ad-hoc配置管理web servers

web servers需同时部署nginx、php和django,其中nginx、php依然通过yum模块实现,django推荐使用pip或easy_install方式。

1)nginx、php安装命令如下:

ansible app -m

yum -a name=php state=present

2)django安装命令如下:

步骤1:安装mysql-python和python-setuptools依赖包。

yum -a name=mysql-python state=present

yum -a name=python-setuptools state=present

步骤2:安装django。

pip -a name=django state=present

步骤3:检查django安装是否正常,执行命令如下:

command -a python -c 'import django; print django.get_version()'

其中django依赖python 2.7+版本,如执行报错如下,请检查python版本。

traceback (most

recent call last)

    file string, line 1, in module

    file

usrlibpython2.6site-packagesdjango__init__.py, line 1, in module

fromdjango.utils.version

import get_version

usrlibpython2.6site-packagesdjangoutilsversion.py, line 7, in module

fromdjango.utils.lru_cache

import lru_cache

    file usrlibpython2.6site-packagesdjangoutilslru_cache.py,

line 28

fasttypes =

{int, str, frozenset, type(none)},

                ^

syntaxerror

invalid syntax

pip和easy_install模块支持virtualenv虚拟多环境配置,该功能极为强大,是python应用者的必备利器。如上我们使用pip模块安装django,众所周知easy_install也是python安装软件包常用的工具之一,ansible同样支持easy_install,命令类同# ansible app -m easy_install -a name=django即可。两者相比较而言,pip的功能较easy_install更为强大,且支持卸载、指定版本号等。经过笔者亲测,建议使用pip模块安装python系列软件包,除功能强大外,我们发现pip模块的稳定性和速度也远胜easy_install模块(centos 6.5 final)。

截至目前,proxy & web servers部署完毕,通过数条语句即可完成。本示例中的服务器只有4台,如果是40、400、4000台,其带来的便利和节省的时间成本是不可估量的,更为重要的是,这在很大程度上,可以保障操作的正确性。

其实上面的这些变更通过ansible-playbook进行是更好的选择,在后面playbook章节的讲解与应用过程中大家会逐步有所体会。当然通过shell单独登录到对应的服务器也能实现我们想要完成的工作,但ansible为我们节省了海量的时间成本,这也是我们学习ansible的意义所在。

3.3.3 ad-hoc配置后端:配置nosql与database servers实践

3.3.2节我们使用ansible配置了proxy和web servers,接下来我们使用类似的方法配置nosql和db服务。我们使用redis配置nosql,我们使用mariadb配置db,之所以没有使用mysql是因为自从mysql被甲骨文公司收购后,虽埃里森宣称mysql依然免费,但随着时间的推移,mysql原班核心人马相继离开甲骨文,并创立mariadb及mysql社区,开发者对现有oracle举动感到不满,行业内不少企业已在考虑使用mariadb,或计划替换现有mysql。

具体操作步骤如下。

redis安装命令:ansibledb -m yum -a name=redis

state=present。

redis安装检查:ansibledb -m command -a redis-cli

--version。

mariadb安装步骤如下。

步骤1:添加yum源,vim编辑etcyum.repos.dmariadb.repo添加内容如下。

# mariadb 10.1

centos repository list - created 2016-02-13 0431 utc

#

httpmariadb.orgmariadbrepositories

[mariadb]

name = mariadb

baseurl =

httpyum.mariadb.org10.1centos6-x86

gpgkey=https

yum.mariadb.orgrpm-gpg-key-mariadb

gpgcheck=1

步骤2:安装mariadb-server,

ansibledb -m yum

-a name=mariadb-server state=present

步骤3:安装mariadb-client,

-a name=mariadb-client state=present

步骤4:开启防火墙3306访问权限。

ansible db -m

command -a iptables -a input -s 192.168.37.024 -p tcp -m tcp --dport 3306 -j

accept

截至目前,如图3-5所示的应用成功部署完毕。其实我们搭建一套主流web应用框架,期间无需登录远程主机,通过ansible的结果返回即可判断所有操作是否正确。

3.3.4 ad-hoc特定主机变更

前两节我们通过搭建了一套主流web应用框架熟悉了ansible的组管理,接下来为大家介绍如何针对特定服务器做变更,该情景在日常运维工作中很常见。

ansible有多种方式实现针对特定主机做变更。

1)--limit:通过--limit参数限定主机做变更。

情景:在app组中启动192.168.37.15的ntp服务。

命令用法:

command -a service ntpd status --limit 192.168.37.158

2)指定ip:通过指定具体ip限定主机做变更。

情景:启动192.168.37.158的ntp服务。

执行命令:

ansible

192.168.37.158 -m command -a service ntpd status

3)用“”作分隔符,指定多台机器做变更。

情景:启动192.168.37.158和192.168.37.161的ntp服务。

192.168.37.158192.168.37.161 -m command -a service ntpd status

4)通过“”泛匹配,更灵活地针对多台主机做变更。

情景:启动192.168.37.所有主机的ntp服务。

192.168.37. -m command -a service ntpd status

--limit在日常工作中经常用到,ansible-playbook也支持该参数。“”分隔指定多主机也是不错的办法,但记得要用引号将所有地址引起来。

到目前为止ad-hoc组管理及特定主机变更我们已经掌握,这对灵活管理海量服务器有很大帮助,关于组及指定主机管理介绍到此结束。接下来为大家介绍的是ad-hoc基于用户的管理。

继续阅读