自动化运维工具----Ansible 命令行模块

1,781 阅读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概述

1.1 Ansible是什么

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

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

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

1.2 Ansible的四个组件:

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

image.png

1.3 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 环境安装部署

实验环境:

角色IP安装工具
管理端192.168.85.50ansible
被管理端192.168.85.60无需安装
被管理端192.168.85.70无需安装

1、管理端安装ansible

image.png

image.png 如果中途安装报错,就多安装几次,可能与网络有关系。

image.png

2、配置主机清单,修改/etc/ansible/hosts文件。

image.png

3、ansible默认使用ssh连接,所以管理前要设置免密登录。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

三 ansible常用的命令行模块

ansible管理命令:

 ansible <组名> -m <模块> -a <参数列表>
 ​
 ansible <主机IP> -m <模块> -a <参数列表>
 ​
 ansible <主机名> -a <参数列表>      #不加-m指定模块默认使用command
 ​
 #选项解释
 -m: 指定模块
 -a: 指定命令

image.png

查看ansible的模块:

 ansible-doc -l   #列出所有已安装的模块,按q退出
 ​
 ansible-doc -l | wc -l   #统计总共有多少模块
 3387
 ​
 ansible-doc -s 模块   #查看指定模块的描述信息和操作动作

image.png

image.png

3.1 command模块

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

image.png 常用的参数:

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

image.png

3.1.1 常用参数示例

(1)chdir

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

image.png

(2)creates

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

image.png

image.png image.png

(3)removes

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

image.png

image.png

3.2 shell模块

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

image.png

示例1:

shell模块支持管道符号。

image.png

image.png

示例2:

shell模块支持重定向功能。

image.png

image.png

3.3 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

image.png

示例2:

星期一到星期五 上午9点到下午5点期间 每隔半小时执行一次同步时间任务

ansible all -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

image.png

删除系统备份任务

image.png

image.png

3.4 user模块

管理用户的模块。

 ansible-doc -s user    #查看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:

添加用户 image.png

image.png

示例2:

删除用户并删除家目录

image.png

image.png

示例3:

创建用户并指定UID号并添加密码

image.png

image.png

3.5 group模块

管理用户组的模块。

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

image.png

image.png

image.png

3.6 copy模块

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

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

常用参数:

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

示例1:

把本地的hosts文件复制到远程主机

image.png

示例2:

image.png

image.png

示例3:

image.png

image.png

3.7 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

image.png

示例2:创建和删除文件、目录

image.png

image.png

image.png

示例3:创建软链接文件

image.png

3.8 hostname模块

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

image.png

image.png

3.9 ping模块

测试远程主机的连通性。

image.png

3.10 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

示例:卸载httpd

image.png

image.png

3.11 service/systemd 模块

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

主要参数如下:

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

示例:

image.png

image.png

image.png

image.png

image.png

3.12 script 模块

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

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

image.png image.png

image.png

image.png

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

image.png

3.13 setup 模块

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

image.png

image.png

总结

Ansible是什么?

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

Ansible 特点:

  • 无agent的存在,不需要在被控制节点上安装客户端应用
  • 通过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'