前言2010年前后,大部分系统都运行在小型机上,比如HP、Sun、IBM小型机。比如当时一个系统用了10台小型机,但是随着业务量的不断增长,这几年IOE如火如荼,开源技术也在不断发展。原本使用10台小型机的系统可能会暴涨到使用数百台X86Linux主机。如何运维上百台主机成为挑战。经历了以下三个阶段:继续使用管理小型机的方法:写一个shell脚本,然后通过scp拷贝到各个主机,最后通过ssh远程执行脚本,但是这种方法的缺点是:shell脚本很难重复运行。如果脚本中途报错,脚本之前做的事情需要清理,费时费力;使用puppet自动化运维工具提供了一系列可用的常用模块,但是这个工具过于复杂,需要在宿主机上安装agent进行管理。如果其提供的模块不能满足管理要求,则很难扩展模块1。使用ansible自动化运维工具,也提供了常用的模块,但是比puppet更轻量,不需要在托管主机上安装agent。其核心是通过ssh登录主机执行命令。简单易用,学习成本低。为什么ansible这么强大好用,笔者决定用实用的方法带领初学者快速掌握这个工具,从入门到精通。环境说明本例中准备两台虚拟机,操作系统版本为Centos7.6,主机采用最小化安装。%cat/etc/redhat-releaseCentOSLinuxrelease7.6.1810(Core)%cat/root/anaconda-ks.cfg...%packages@^minimal@corekexec-tools...两者的IP地址hosts如下:%cat/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6okd-l01192.168.18.2okd-i01192.168.18.3AnsibleinstallationFornon-RHEL主机安装ansible,请参考官方文档安装指南。控制节点okd-l01主机可以上网,下面会在这台主机上安装ansible软件。Ansible在epel源中,所以先配置系统的epel源:%rpm-ivhhttps://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm安装ansible:%yum-yinstallansible执行以下命令查看当前版本:%ansible--versionansible2.7.5configfile=/etc/ansible/ansible.cfg配置模块搜索路径=[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules']ansiblepython模块位置=/usr/lib/python2.7/site-packages/ansible可执行文件位置=/usr/bin/ansiblepython版本=2.7.5(default,Apr92019,14:30:50)[GCC4.8.520150623(RedHat4.8.5-36)]受控节点okd-l01和okd-i01都是ansible的托管主机,并且必须满足以下条件:机器必须启用ssh服务,控制节点必须能够通过ssh连接到被控节点,对于任何Linux发行版,ssh都是默认启用的;机器必须用python命令安装,干脆centos7就算最小化也会安装安装python2.7;如果主机关闭了selinux(在/etc/selinux/config文件中设置SELINUX=disabled并重启),则不需要安装libselinux-python包,否则需要安装该包避免模块报错例如复制/文件。%yum-yinstalllibselinux-python运行第一个任务假设我们需要在远程主机okd-i01上创建一个/test目录,如果我们使用ssh,我们可以在okd-l01上执行命令:ssh192.168.18.3'mkdir/test'那么你如何用ansible做同样的事情呢?首先,需要将被控主机的主机名或ip地址写入清单文件(inventory)。笔者在okd-l01上使用root用户2在/root/test目录下创建一个清单文件hosts3用于本次实验:%mkdir/root/test&&cd/root/test%echo192.168.18.3>hosts类似于ssh命令,我们可以将其替换为ansible,执行如下命令:将ssh命令替换为ansible命令;-ihosts参数指定列表文件的名称为hosts,然后输入ansible管理的受控主机的ip地址;-a参数后跟执行的命令mkdir/test;-k参数提示输入受控主机的用户密码。%ansible-ihosts192.168.18.3-a"mkdir/test"-k#因为笔者使用root用户执行,所以该命令默认会使用root连接远程主机,#这里需要进入ssh受控主机的密码:SSH密码:#警告信息:[WARNING]:考虑使用state=directory的文件模块而不是运行mkdir。如果因为文件不足需要使用command可以在这个command任务中加上warn=False或者在ansible.cfg中设置command_warnings=False来去掉这个信息。#Commandreturnresult:192.168.18.3|改变|rc=0>>以上是ansible最简单的使用方式,只是将之前运行的ssh命令换成而已,接下来笔者将详细讲解生产所需的必要知识。需要Ruby语言知识。?任何用户都可以运行ansible命令。?文件名随意,但建议命名为hosts或inventory。?
