自动化运维—Ansible工具的使用

Posted 丁CCCCC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维—Ansible工具的使用相关的知识,希望对你有一定的参考价值。

Ansible

一、概述

1.1 特点

  • Ansible 是一个基于 Python 开发的配置管理和应用部署工具,融合了众多老牌运维工具的优点, Pubbet 和 saltstack 能实现的功能,Ansible 基本上都可以实现
  • Ansible 能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用 Ansible 只需在固定的一台 Ansible 控制节点上去完成所有主机的操作
  • Ansible 是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是 Ansible 的模块
  • Agentless,即无 Agent 的存在,它就像普通命令一样, 并非C/S软件,也只需在某个作为控制节点的主机上安装一次 Ansible 即可,通常它基于 ssh 连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务
  • 使用者在使用时,在服务器终端输入命令或者playbooks.会通过预定好的规则将playbook拆解为play.再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SsH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
  • Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幕等性(idempotence)…所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行systemctl stop xxx命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。
  • Ansible的很多模块在执行时都会先判断日标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。

1.2 优点

  • 轻量级,更新时,只需要在操作机上进行一次更新即可
  • 采用 SSH 协议
  • 不需要去客户端安装 agent
  • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
  • 使用 python 编写的,维护更简单
  • 支持 sudo 普通用户命令
  • 去中心化管理

二、服务搭建

管理者(ansible):192.168.253.11

被管理者:192.168.253.22

被管理者:192.168.253.33

2.1 准备工作

安装ansible(管理端)

yum -y install epel-release		#需要先行安装epel源

yum -y install ansible

  • tree /etc/ansible/
    • ansible的目录结构

2.2 ansible端设置

配置主机清单

  • cd /etc/ansible/
  • vim hosts

生成密钥对

  • ssh-keygen -t rsa
sshpass -p '123456' ssh-copy-id root@192.168.253.22
sshpass -p '123456' ssh-copy-id root@192.168.253.33

三、ansible 命令行模块

命令格式:ansible <组名> -m <模块> -a <参数列表>

  • ansible-doc -l
    • 查看已安装的模块,q退出

3.1 command 模块

概述

在远程主机执行命令,不支持管道、重定向等shell部分的特性

-s表示列出指定模块的描述信息和操作动作
ansible-doc -s command

命令使用

#all表示全部,选定全部主机执行date命令
ansible all -m command -a 'date'

#也可以选择IP来执行
ansible 192.168.253.22 -m command -a 'date'

#组名同样可以
ansible webservers -m command -a 'date'

#不选择-m默认运行的就是command这个模块
ansible all -a 'ls /'

常用参数

  • chdir
    • 在远程主机上运行命令前提前进入目录
  • creates
    • 在命令运行时创建一个文件,如果文件存在,则不会创建任务
  • removes
    • 在命令运行时移除一个文件, 如果文件不存在,则不会执行移除任务
  • executeble
    • 指明运行命令的shell程序
ansible all -m command -a "chdir=/opt ls ./"
查看所有主机的opt目录

3.2 shell 模块

概述

在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个shell运行命令(这个支持管道符合功能)

  • ansible-doc -s shell
  • 列出模块的信息和操作动作

命令

查看webservers远程主机的ip
ansible webservers -m shell -a 'ifconfig ens33 | awk "/init/print $2"'

3.3 cron 模块

概述

在远程主机定义任务计划,有两种状态(state):present表示添加、absent表示移除

  • ansible-doc -s cron

常用参数命令

  • minute/hour/day/mouth/weekday
    • 分/时/日/月/周
  • job
    • 任务计划执行的命令
  • name
    • 任务计划的名称
#在webservers主机内设置计划任务,时间为每分钟,内容是输出“haha”,任务名是test01
ansible webservers -m cron -a 'minute="*/1" job="/usr/bin/echo haha" name="test01"'

#移除这个计划任务
ansible webservers -m cron -a 'name=test01 state=absent'

#可以远程查看计划任务内已经移除
ansible webservers -a 'crontab -l'

PS:如果任务没有取名字,删除的时候直接使用 name=None 就行

3.4 user 模块

概述

用户管理的模块

  • ansible-doc -s user

常用参数命令

参数定义
name用户名:必选参数
state=present l absent创建账号或者删除账号,present 表示创建,absent 表示删除
system=yes I no是否为系统账号
uid用户uid
group用户基本组
shell默认使用的shell
move_home=yse l no如果设置的家日录已经存在,是否将已经存在的家目录进行移动
password用户的密码,建议使用加密后的字符串
comment用户的注释信息
remove=yes I no当state=absent时,是否删除用户的家目录
#在web主机创建用户cc200
ansible webservers -m user -a 'name="cc200"'

#使用命令查看是否创建成功
ansible webservers -m command -a 'cat /etc/passwd'

#删除该用户
ansible webservers -m user -a 'name="cc200" state=absent'

3.5 group 模块

概述

用户组管理的模块
请求的是 groupadd、groupdel、groupmod模块

  • ansible-doc -s group

命令

#创建mysql
ansible webservers -m group -a 'name=mysql gid=1234 system=yes'

#查看是否创建
ansible webservers -a 'cat /etc/group'

#创建test01用户,添加到mysql组内
ansible webservers -m user -a 'name=test01 uid=111 system=yes group=mysql'

#查看是否创建
ansible webservers -a 'cat /etc/passwd'

#查看是否在组内
ansible webservers -a 'id test01'



3.6 copy 模块

概述

用于复制指定主机内的文件到远程主机里

  • ansible-doc -s copy

常用参数命令

参数定义
dest指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src指出源文件的路径。可以使用相对路径或绝对路径。支持直接指定目录。如果源是日录则日标也要是日录
mode指出复制时,目标文件的权限
owner指出复制时,目标文件的属主
group指出复制时,日标文件的属组
content指出复制到目标主机上的内容,不能与src一起使用
#复制本机文件到远程主机
ansible webservers -m copy -a 'src=/etc/fstab dest=/opt/123.txt owner=root mode=640'

#查看是否成功
ansible webservers -a 'ls -l /opt'

#远程添加文件内容进去
ansible webservers -m copy -a 'content="webservers" dest=/opt/123.txt'

#查看
ansible webservers -a 'cat /opt/123.txt'


3.7 file 模块

概述

设置文件属性

  • ansible-doc -s file

命令

#修改123.txt文件的属主属组权限
nsible webservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/123.txt'

#创建新文件111.txt
ansible webservers -m file -a 'path=/opt/111.txt state=touch'

#删除111.txt
ansible webservers -m file -a 'path=/opt/111.txt state=absent'

3.8 hostname 模块

概述

用于管理远程主机的主机名

命令

#更改webservers远程主机的名字
ansible webservers -m hostname -a 'name=webservers'


3.9 ping 模块

概述

检测远程主机是否在线

命令

#测试所有主机
ansible all -m ping

#指定测试
ansible webservers -m ping

3.10 yum 模块

概述

在远程主机上安装卸载软件包

  • ansible-doc -s yum

命令

#安装
ansible webservers -m yum -a 'name=httpd'

#卸载
ansible webservers -m yum -a 'name=httpd state=absent'

3.11 service/systemd 模块

概述

用于管理远程主机的管理服务的运行状态

  • ansible-doc -s service

常用参数命令

项目Value
name被管理的服务名称
state=started I stopped I restarted动作包含启动关闭或者重启
enabled=yes | no表示是否设置该服务开机自启
runlevel如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
#开启服务
ansible webservers -m service -a 'enabled=true name=httpd state=started'

#查看服务状态
ansible webservers -a 'systemctl status httpd'

3.12 script 模块

概述

可以实现远程批量运行本主机的shell脚本

  • ansible-doc -s script

命令

本地创建脚本

  • vim test.sh
#!/bin/bash
echo "haha" > /opt/cc.txt
  • chmod +x test.sh

远程使用

#在webservers主机运行
ansible webservers -m script -a 'test.sh'

#查看
ansible webservers -a 'cat /opt/cc.txt'

3.13 setup 模块

概述

facts 组件用来收集被管理节点信息
setup 模块可以获取这些信息

  • ansible-doc -s setup

命令

#获取全部的facts信息
ansible webservers -m setup

#filter筛选需要的信息
ansible webservers -m setup -a 'filter=*ipv4'

以上是关于自动化运维—Ansible工具的使用的主要内容,如果未能解决你的问题,请参考以下文章

Ansible——自动化运维工具的模块部署

Ansible 自动化运维工具

Ansible 自动化运维工具

Ansible 自动化运维工具

ansible自动化运维必备工具详解

干货自动化运维工具—ansible攻略