自动化运维工具Ansible——概述及命令行模块

2,642 阅读10分钟

机器管理

机器管理的工具选择的考量可以包含以下三个方面:

  1. 是否简单,是否需要每台机器都部署Agent(客户端)
  2. 语言的选择(Puppet/Chef vs Ansible/SaltStack)开源技术,不看官网不足以熟练,不懂源码不足以精通:Puppet、Chef基于Ruby开发的,Ansible、SaltStack基于Python开发的。
  3. 速度的选择(Ansible vs SaltStack)Ansible基于SSH协议传输数据,SaltStack使用信息队列ZeroMQ传输数据,大规模并发的能力对于及时台-200台规模的兄弟来说,Ansible的性能也可以接受,如果一次操作上千台用salt好一些。
工具语言架构协议
PuppetRubyC/SHTTP
ChefRubyC/SHTTP
AnsiblePython无ClientSSH
SaltstackPythonC/S(可无Client)SSH/ZMQ/RAET

一般创业公司选择Ansible 能解决大部分问题,其简单,不需要安装额外的客户端,可以从命令行来运行,不需要使用配置文件,至于比较复杂的任务,Ansible配置通过名为Playbook 的配置文件中的 YAML语法来加以处理,Playbook还可以用模板来扩展其功能。

自动化运维三剑客

  • saltstack
  • pubbet
  • ansible

Ansible概述

Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。

Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。

Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等

Ansible的四个组件

  • Inventory 主机清单(主机组)
  • Modules 模块
  • Plugins 插件
  • Playbooks 剧本(相当于脚本)

image.png

Ansible的特性

特性一:

Ansible其中一个比较鲜明的特性Agentless,即无Agent的存在(无代理端,即无客户端),它就像普通命令一样, 并非c/s软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。

使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play(一个play就是一个Linux操作),再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除。

特性二:

Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。

  • 比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。

Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。

ansible 环境安装部署

  • 管理端ansible:192.168.44.20
  • 被管理端:192.168.44.30
  • 被管理端:192.168.44.40

管理端安装 ansible

  1. yum安装epel-release和ansible image.png image.png
yum install -y epel-release			//先安装 epel 源,在线源安装
yum install -y ansible
  1. ansible 目录结构 image.png

  2. 配置主机清单 image.png image.png

  3. 配置密钥对验证。ansible默认使用ssh连接,所以管理前要设置免密登录。 image.png image.png image.png image.png image.png

    • 如果有成百上千台主机,不可能一次一次输入密码,因此就需要sshpass。sshpass这个工具可以实现ssh的免交互。格式sshpass -p '密码' ssh-copy-id 用户@IP地址 image.png

ansible常用的命令行模块

 ansible <组名> -m <模块> -a <参数列表>
 ansible <主机IP> -m <模块> -a <参数列表>
 ansible <主机名> -a <参数列表>      #不加-m指定模块默认使用command

选项解释

  •  -m:指定模块
  •  -a:指定命令

列出所有已安装的模块:ansible-doc -l image.png image.png

查看指定模块的描述信息和操作动作:ansible-doc -s 模块 image.png

command模块

image.png

image.png

image.png

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

image.png

常用的参数

  • chdir:在远程主机上运行命令前提前进入目录
  • creates:判断指定文件是否存在,如果存在,不执行后面的操作
  • removes:判断指定文件是否存在,如果存在,执行后面的操作

chdir

在远程主机上运行命令前提前进入目录 image.png image.png

creates

判断指定文件是否存在,如果存在,不执行后面的操作。 image.png

removes

判断指定文件是否存在,如果存在,执行后面的操作 image.png

shell模块

在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令。支持管道符号和重动向等功能。

image.png

示例1

shell模块支持管道符号。

image.png

提取对方IP地址。

image.png

示例2:

shell模块支持重定向功能。

image.png

cron模块

在远程主机定义任务计划。其中有两种状态(state)

  • present 表示添加(可以省略)
  • absent 表示移除。

image.png

示例1

每天晚上12:30备份系统日志
ansible webservers -m cron -a 'minute=30 hour=0 job="/usr/bin/co -f /var/log/messages /root/backuper/messages-$(date +%Y/%m/%d)" name="backup syslog"'

image.png

示例2

星期一到星期五,上午9点到下午5点期间,每隔半小时执行一次同步时间任务 ansible webservers -m cron -a 'minute=*/30 hour="9-17" weekday="1-5" job="/usr/sbin/ntpdate ntp.aliyum.com" name="ntp job" '

image.png

image.png

删除系统备份任务

删除backup syslog计划任务:ansible webservers -m cron -a 'name="backup syslog" state=absent'

image.png

user模块

管理用户的模块。 查看user模块包含的操作动作: ansible-doc -s user    

常用参数:

参数说明
name用户名,必选参数。
state=present 或 absent创建账号或者删除账号,present表示 创建,absent 表示删除。
system=yes 或 no是否为系统账号。(默认为系统账号)
uid用户uid。
group用户基本组。
groups用户附加组。
shell默认使用的登录shell
move_home=yes 或 no如果设置的家目录已经存在,是否将已经存在的家目录进行移动。
password用户的密码,建议使用加密后的字符串。
comment用户的注释信息。
remove=yes 或 no表示当state=absent时,是否删除用户的家目录。即删除用户时,是否同时删除家目录。yes表示删除用户的家目录。

示例1

添加用户zhangsan:ansible webservers -m user -a 'name=zhangsan'

image.png

image.png

示例2

删除用户并删除家目录:ansible webservers -m user -a 'name=zhangsan state=absent remove=yes'

image.png

image.png

示例3

创建用户并指定UID号并添加密码:ansible webservers -m user -a 'name=zhangsan uid=9527 shell=/sbin/nologin password=123123'

image.png

不建议使用password指定密码,因为是明文保存,安全性低

image.png

group模块

管理用户组的模块。

注意:字符串类型的值建议加双引号,防止有空格。数字和布尔值不要加双引号

示例

创建aa组,并设置gid号为1024:ansible webservers -m group -a 'name=aa gid=1024'

image.png

image.png

创建lisi用户,设为系统用户,附加组为aa组

image.png

copy模块

用于将本地文件复制到远程主机。

查看copy模块包含的操作动作:ansible-doc -s copy

常用参数:

参数说明
src指出源文件的路径(位于控制节点,即管理端),可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录。
dest指出复制文件的目标及位置,使用绝对路径,如果源是目录则目标也要是目录,如果目标文件已经存在会覆盖原有的内容。
mode指出复制时,目标文件的权限。
owner指出复制时,目标文件的属主。
group指出复制时,目标文件的属组。
content指出复制到目标主机上的内容,不能与src一起使用。

示例1

把本地的hosts文件复制到远程主机:ansible webservers -m copy -a 'src=/etc/ansible/hosts dest=/opt/myhosts mode=700 owner=one'

image.png

image.png

示例2

复制目录到远程主机:ansible webservers -m copy -a 'src=/etc/ansible dest=/opt'

image.png

image.png

示例3

输入内容到远程主机文件中,覆盖原有内容:ansible webservers -m copy -a 'content="Hello World!" dest=/opt/ansible/hosts'

image.png

file模块

为远程主机创建/删除文件或目录,设置文件属性。

主要参数如下:

参数说明
path指定远程服务器的路径,也可以写成"dest","name"
state状态,可以将值设定为directory表示创建目录,设定为touch表示创建文件,设定为link表示创建软链接,设定为hard表示创建硬连接,设定为absent表示删除目录文件或链接
mode文件复制到远程并设定权限,默认file=644,directory=755
owner文件复制到远程并设定属主,默认为root
group文件复制到远程并设定属组,默认为root
recurese递归修改
src指的是目标主机上的源文件。与copy模块不同

示例1

修改文件的属主、属组、权限等

image.png

示例2

创建和删除文件、目录

image.png

image.png

image.png

示例3

创建软链接文件

image.png

image.png

如果源地址不存在,则必须添加force=yes才能创建

image.png

hostname模块

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

image.png

ping模块

测试远程主机的连通性。

image.png

yum模块

在远程主机上安装与卸载软件包, 需要被管理端配置好yum源。

主要的参数如下:

参数说明
name指定安装软件包名或软件包URL
state指定yum对应的方法,present(默认)、installed表示安装、latest表示安装最新版本软件包;absent、removed表示卸载。支持多程序一起安装,用逗号隔开。
enablerepo允许从哪些仓库获取软件
disablerepo禁止从哪些仓库获取软件
exclude排除某些软件包,例如kernel
download_only仅下载软件包,不安装
disable_gpg_check不进行gpg检测
update_cache可以在安装包的同时更新yum缓存

示例1:安装httpd

image.png

image.png

image.png

示例2:卸载httpd

image.png

service/systemd 模块

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

主要参数如下:

参数说明
name指定需要控制的服务名称
state指定服务状态,其值可以为stopped、started、reloaded、restarted、status
enabled指定服务是否为开机启动,yes为启动,no为不启动
daemon_reloadyes:重启systemd服务,让unit文件生效

示例

先将httpd安装回来用于试验

image.png

image.png

image.png

image.png

script 模块

实现远程批量运行本地的shell脚本。

注意:script模块不具有幂等性。所以建议用剧本来执行。

示例

在本地书写好一个脚本使用,并赋予使用权限。 image.png

image.png

image.png

注意:script模块不具有幂等性。

image.png

setup 模块

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

image.png

image.png

总结

ansible:自动化运维工具可以实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具

特点:

  • 不要在被控制节点上安装客户端应用
  • 通过ssh协议与被控制节点通信的
  • 基于模块实现在被控制节点上执行命令操作
  • 很多模块具备幂等性,实现如果多次操作的状态没有发生改变,是不会重复执行的

ansible模块有哪些:command、shell、copy、user、scrip、yum、service、group、ping、setup、hostname、cron

命令格式

ansible  组名  -m 模块名  -a '模块参数'
              -m  file -a 'path=文件路径  mode  =755  owner=      state=file|directory|touch|link  src=  '
              -m copy -a 'src=  dest= mode=  owner= group'