自动化运维之Ansible

Ansible概述

由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行推护会使得工作效率低下。这时,部署自动化运维就可以尽可能安全、高效地完成这些工作。

一般会把自动化运维工具划分为两类:
一类是需要使用代理工具的,也就是基于专用的Agent程序来完成管理功能,如:Puppet、Func、Zabbix等;另处一类是不需要配置代理工其的,可以直接基于SSH服务来完成管理功能,如Ansible、Fabric等。下面介绍几款功能类似的自动化运维工具。

  • Puppet:Puppet基于Ruby开发,支持Linux、UNIX、Windows平台,可以针对用户、系统服务、配置文件、软件包等进行管理,有很强的扩展性,但远程执行命令相对较弱。
  • SaltStack:Salsaskk基于Python开发,允许管理员对多个操作系统创建统一的管理系统, 比Puppet更轻量级。
  • Ansible:Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令,部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。

Ansible核心组件

Ansible基本架构由六个部分构成:

  • Ansible核心引擎
  • Host inventory主机清单:用来定义Ansible所管理的主机,默认是在Ansible的hosts配置文件中定义被管理主机,同时也支持自定义动态主机清单和指定其他配置文件的位置。
  • Connection plugins连接插件:负责和被管理主机实现通信。除支持使用SSH连接被管理主机外,Ansible 还支持其他的连接方式,
    所以需要有连接插件将各个主机用连接插件连接到Ansible,
  • Playbooks (yaml, jinja2)剧本:用来集中定义Ansible任务的配置文件,即将多个任务定义在一个剧本中由Ansible自动执行,可以由控制主机针对多台被管理主机同时运行多个任务。
  • Core modules核心模块:是Ansible自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定的状态。
  • Custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能。

安装部署Ansible服务

案例环境

管理端:192.168.10.157
被管理端:192.168.10.179   组名:xxy1

1、安装Ansible

#使用源码进行安装
yum install -y epel-release      //安装epel源
yum install ansible -y       //安装Ansible

ansible --version          //查看ansible版本

2、树状结构查看Ansible相关配置文件

yum install tree -y

tree /etc/ansible/      //树状结构展示文件夹
/etc/ansible/
├── ansible.cfg       //ansible的配置文件
├── hosts           //ansible的主仓库,用于存储需要管理的远程主机的相关信息
└── roles          //角色

3、配置主机清单

Ansible通过读取默认主机清单/etc/ansible/hosts文件,自改主机与组配置后,可以同时连接到多个被管理主机上执行任务

cd /etc/ansible
vi hosts       //配置主机清单

[xxy1]
192.168.10.179

4、设置SSH无密码登录

为了避免Ansible下发指令时输入被管理主机的密码,可以通过证书签名达到SSH无密码登录的效果,使用ssh-keygen产生一对密钥,使用ssh-copy-id来下发生成公钥。

ssh-keygen -t rsa       //基于SSH密钥的连接
ssh-copy-id [email protected]    //下发公钥
#免密码的交互
ssh-agent bash
ssh-add


Ansible命令应用基础

1、Ansible命令格式

ansible [主机] [-m 模块] [-a 模块持有参数]

ansible-doc -l      //列出所有已安装的模块 注:按q退出
ansible-doc -s yum   //-s列出yum模块描述信息和操作动作
ansible all -a 'ls /'      //查看被控制端根目录下所有内容

2、command模块

使用-m选项来指定使用模块,默认使用command模块

ansible 192.168.10.179 -m command -a 'date'    //指定ip执行date命令

ansible xxy1 -m command -a 'date'       //指定分类执行date

ansible all -m command -a 'date'        //所有被控制端主机执行date命令

3、cron模块

cron模块用于定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。

ansible xxy1 -m cron -a 'minute="*/1" job="/bin/echo heihei" name="test cron job"'    //xxy1下的主机添加计划任务:每分钟输出一次“heihei”
ansible xxy1 -a 'crontab -l'      //查看xxy1下的主机的计划任务

ansible xxy1 -m cron -a 'name="test cron job" state=absent'     //移除计划任务,假如该计划任务没有取名字,name=None即可

4、user模块

用于创建新用户和更改、删除已存在的用户。user模块请求的是useradd, userdel, usermod三个指令

ansible xxy1 -m user -a 'name="test01"'    //xxy1下的主机创建用户test01
ansible xxy1 -m user -a 'name="test01" state=absent'    //xxy1下的主机删除用户test01

5、group模块

用于对用户组进行管理,group模块请求的是groupadd, groupdel, groupmod 三个指令。

ansible xxy1 -m group -a 'name=xxy gid=306 system=yes'       //xxy1下的主机创建xxy组,指定gid,属于系统组
ansible xxy1 -m user -a 'name=xxy01 uid=306 system=yes group=xxy'    //xxy1下的主机创建xxy01永不,指定uid,加入xxy组,属于系统用户
ansible xxy1 -a 'id xxy01'    //xxy1下的主机查看xxy01用户信息

6、copy模块

用于实现文件复制和批量下发文件,src定义本地源文件路径,dest定义被管理主机文件路径,使用content通过指定信息内容来生成目标文件

ansible xxy1 -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640'       //xxy1下的主机将/etc/fatab文件复制到/opt目录下命名为fatab.back,并设置所有者为root,权限为640
ansible xxy1 -a 'ls -l /opt'      //xxy1下的主机查看/opt目录下的信息
ansible xxy1 -a 'cat /opt/fstab.back'       //xxy1下的主机查看/opt/fstab.back文件内容

ansible xxy1 -m copy -a 'content="hello heihei!" dest=/opt/fstab.back' 
 //xxy1下的主机将hello heihei!写入/opt/fstab.back文件中
ansible xxy1 -a 'cat /opt/fstab.back'     //xxy1下的主机查看/opt/fatab.back文件内容

7、file模块

设置文件属性,使用path指定文件路径,使用src定义源文件路径,使用name或dest来替换创建文件的符号链接

ansible xxy1 -m user -a 'name=lisi system=yes'      //xxy1下的主机创建lisi用户
ansible xxy1 -m group -a 'name=lisizu system=yes'     //xxy1下的主机创建lisizu组
ansible xxy1 -m file -a 'owner=lisi group=lisizu mode=644 path=/opt/fstab.back'        //xxy1下的主机将/opt/fstab.back文件所有者改为lisi,属于lisizu,644权限

ansible xxy1 -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link'      //xxy1下的主机给/opt/fstab.back文件创建链接文件/opt/fstab.link
ansible xxy1 -m file -a "path=/opt/fstab.back state=absent"               //xxy1下的主机删除/opt/fstab.back文件
ansible xxy1 -m file -a "path=/opt/test state=touch"             //xxy1下的主机在/opt目录下创建test文件

8、ping模块

使用ping模块检测所有被控制端主机的连通性

ansible all -m ping       //使用ping模块检测所有被控制端主机的连通性

9、shell模块

可以在被管理主机上运行命令,并支持像管道符等功能的复杂命令

ansible xxy1 -m user -a 'name="zhangsan"'      //xxy1下的主机创建用户zhangsan
ansible xxy1 -m shell -a 'echo abc123|passwd --stdin zhangsan'       //xxy1下的主机使用无交互模式给zhangsan用户设置密码

10、script模块

可以将本地脚本复制到被管理主机上进行运行,需使用相对路径指定脚本

#在本地编辑一个简单的脚本
vi test.sh

#!/bin/bash
echo "hello ansible from script"> /opt/script.txt

#给脚本可执行文件
chmod +x test.sh

ansible xxy1 -m script -a 'test.sh'      //将本地脚本复制到xxy1下的主机上运行

#到192.168.10.179上查看,可查看到脚本已经执行,并文件下有内容
cat /opt/script.txt

11、yum与service模块

yum模块负责在被管理主机上安装与卸载软件包,但是需要提前在每个节点配置自己的YUM仓库。使用name指定要安装的软件包,不带软件包版本号则安装最新软件包,使用state指定安装包状态,present、latest用来表示安装,absent表示卸载
service模块控制管理服务的运行状态。使用enabled表示是否开机自启动,取值为true或者false;使用name定义服务名称;使用state指定服务状态,取值分别为started、stoped、restarted。

ansible xxy1 -m yum -a 'name=httpd'           //xxy1下的主机安装httpd服务

ansible xxy1 -a 'systemctl status httpd'        //xxy1下的主机查看httpd服务运行状态
ansible xxy1 -m service -a 'enabled=true name=httpd state=started'        //开启xxy1下的主机的httpd服务

ansible xxy1 -a 'systemctl status httpd'       //xxy1下的主机查看httpd服务运行状态,已开启

ansible xxy1 -m yum -a 'name=httpd state=absent'     //xxy1下的主机卸载httpd服务

12、setup模块

使用setup模块收集、查看被管理主机的facts(facts是ansible采集被管理主机设备的一个功能)。每个被管理主机在接收并运行管理命令前,都会将自己的相关信息(操作系统版本、IP地址等)发送给控制主机。

ansible xxy1 -m setup           //获取xxy1下的主机的facts信息

你可能感兴趣的:(运维管理)