初识Ansible自动化运维工具

29次阅读

共计 2823 个字符,预计需要花费 8 分钟才能阅读完成。

前言

2010 年左右 1,当时系统多数运行在小型机上,如 HP、Sun、IBM 小型机,如某系统当时使用 10 台小型机,但随着业务量不断增长,前几年去IOE 的火热进行,开源技术的不断发展,原先使用 10 台小型机的系统在如今可能已暴涨似增涨到使用百来台 X86 Linux 主机。

如何运维成百上千台的主机成为一个挑战,本人经历过如下 3 阶段:

  1. 延用管理小型机时的方法:编写 shell 脚本,而后通过 scp 拷贝到各台主机,最后 ssh 远程执行脚本,但此方法的弊端是:shell 脚本很难重复运行,如若脚本中间环节报错,则脚本前面所做的事情需清理,费时费力;
  2. 使用 puppet 自动运维工具,其提供了一系列常用模块可用,但此工具过于复杂,其需在被管理主机安装 agent,如其提供的模块未能满足管理需求,则扩展模块比较难2
  3. 使用 ansible 自动运维工具,其同样提供了常用模块可用,但较于 puppet 轻量,无需在被管主机安装 agent,其核心是通过 ssh 登录主机执行命令,使用方式简单,学习成本低。

最近一项目作者使用 ansible 批量管理了 200 多台PC Server,所做事情简单描述如下:

  • 配置网卡主备绑定(bonding)并进行切换测试;
  • 配置主机磁盘 Raid,格式化磁盘,挂载文件系统,创建用户;
  • 主机安装 Jdk、Oracle 客户端、TimesTen 等客户端;
  • 配置 ZK、Weblogic、Redis 等集群;

ansible为何如此强大且好用,作者决定使用实战方式带领初学者迅速掌握此工具,从入门到精通。

环境描述

本示例准备了两台虚拟机,操作系统版本为 Centos 7.6,主机均采用 最小化模式 安装。

% cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

% cat /root/anaconda-ks.cfg
...
%packages
@^minimal
@core
kexec-tools
...

两主机 IP 地址如下:

% cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

okd-l01 192.168.18.2
okd-i01 192.168.18.3

Ansible安装

对于非 RHEL 系列主机安装 ansible 可参考官方文档 Installation Guide。

控制节点

okd-l01 主机能连接英特网,下面将在此主机上安装 ansible 软件。

  1. ansible 在 epel 源里,故先为系统配置 epel 源:
% rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm
  1. 安装 ansible:
% yum -y install ansible
  1. 执行如下命令查看当前版本:
% ansible --version
ansible 2.7.5
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr  9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

被控节点

okd-l01 与 okd-i01 均作为 ansible 被管主机,需满足如下条件:

  1. 机器必须开启 ssh 服务,控制节点必须能通过 ssh 连接到被控节点,而对于任何 Linux 发行版本来说,ssh 都是默认开启的;
  2. 机器必须安装有 python 命令,索性的是 centos 7 即使最小化安装也会安装 python 2.7;
  3. 主机若关闭了 selinux(/etc/selinux/config文件中设置 SELINUX=disabled 并重启)则无需安装 libselinux-python 软件包,否则需安装此软件包以避免 copy/file 等模块报错。

    % yum -y install libselinux-python

运行第一个任务

假设我们需在远程主机 okd-i01 上创建 /test 目录,若采用 ssh 方式,我们可在 okd-l01 执行命令:

ssh 192.168.18.3 'mkdir /test'

那么,采用 ansible 如何做同样的事情呢?首先需将被控主机的主机名或 ip 地址写入到 清单文件 inventory)中,作者在 okd-l01 上使用 root 用户3 为本实验在 /root/test 目录下创建清单文件 hosts4

% mkdir /root/test && cd /root/test
% echo 192.168.18.3 > hosts

如同 ssh 命令类似,我们其替换为 ansible 后执行如下命令即可:

  1. ssh命令替换为 ansible 命令;
  2. -i hosts参数指定清单文件名为 hosts,而后紧接着输入 ansible 管理的被控主机 ip 地址;
  3. -a参数后接执行的命令mkdir /test
  4. -k参数提示输入被控主机的用户密码。
% ansible -i hosts 192.168.18.3 -a"mkdir /test" -k
# 因作者采用 root 用户执行,故默认此命令将使用 root 连接到远程主机,# 此处需输入被控主机的 ssh 密码:SSH password:  
# 告警信息:[WARNING]: Consider using the file module with state=directory rather than running mkdir. If you need to use command because file is insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to
get rid of this message.
# 命令返回结果:192.168.18.3 | CHANGED | rc=0 >>

如上为最简单的 ansible 使用方式,其仅是替换为之前运行的 ssh 命令,接下来作者将详细讲解用于生产时所需知晓的必要知识。


  1. 本人从 10 年进入电信业工作,经历过系统从几十台小型机迁移到上百台 X86 PC Server 或云计算虚拟化主机上的过程。↩
  2. 需掌握 ruby 语言知识。↩
  3. 可使用任何用户运行 ansible 命令。↩
  4. 文件名称随意,但建议名为 hosts 或 inventory。↩

正文完
 0