Ansible

Ansible

一、 Ansible简介

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

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

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

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

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

Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。

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

Ansible的四个组件:

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

Ansible的特性

(1)特性一:

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

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

(2)特性二:

  • Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。
  • 比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx是非幂等的。
  • Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。

二、ansible 环境安装部署

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

#管理端安装 ansible
yum install -y epel-release         #先安装epel源
yum install -y ansible


//ansible 目录结构
/etc/ansible/
├── ansible.cfg			#ansible的配置文件,一般无需修改
├── hosts				#ansible的主机清单,用于存储需要管理的远程主机的相关信息
└── roles/				#公共角色目录

//配置主机清单
cd /etc/ansible
vim hosts       
[webservers]			#配置组名
192.168.44.20			#组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)

[dbservers]
192.168.44.30

//配置密钥对验证
ssh-keygen -t rsa		#一路回车,使用免密登录
ssh-copy-id root@192.168.44.20
ssh-copy-id root@192.168.44.30   

在这里插入图片描述
ansible默认使用ssh连接,所以管理前要设置免密登录。

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

三、ansible常用的命令行模块

ansible管理命令:

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

查看ansible的模块:

ansible-doc -l      #列出所有已安装的模块(按q退出)

ansible-doc -l | wc -l   #统计模块总数

ansible-doc -s 模块       #查看指定模块的描述信息和操作动作

在这里插入图片描述
在这里插入图片描述

command 模块

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

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

ansible 192.168.44.40 -m command -a 'date'		#指定 ip 执行 date
ansible webservers -m command -a 'date'			#指定组执行 date
ansible dbservers -m command -a 'date'       
ansible all -m command -a 'date'				#all 代表所有 hosts 主机
ansible all -a 'ls /'							#如省略 -m 模块,则默认运行 command 模块



在这里插入图片描述
在这里插入图片描述
在远程主机执行命令,不支持管道、重定向等shell的特性。

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

 ​


chdir

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

 #无论管理端当前在哪个目录,执行命令都是在被管理端的家目录进行操作,可以使用chdir参数先切换目录
 ansible dbservers -m command -a "chdir=/home ls ./"   #切换到/home目录下再执行命令
 

在这里插入图片描述

creates

creates判断目标主机的指定是否存在,如果存在,则不执行后面的操作

ansible dbservers -m command -a "creates=/opt/aa.txt date touch /opt/aa.txt"
ansible dbservers -m command -a "creates=/opt/aa.txt date touch /opt/aa.txt"

在这里插入图片描述

removes

removes判断目标主机的指定是否存在,如果存在,执行后面的操作

 
ansible dbservers -m command -a "creates=/opt/aa.txt touch /opt/bb.txt"

ansible dbservers -m command -a "creates=/opt/cc.txt touch /opt/bb.txt"

在这里插入图片描述

shell模块

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

ansible-doc -s shell

在这里插入图片描述

shell模块支持管道符号
ansible dbservers -m shell -a 'ps aux | wc -l'

在这里插入图片描述
提取对方IP地址

ansible dbservers -m shell -a 'ifconfig ens33 | awk "NR==2 {print \$2}"'

在这里插入图片描述

shell模块支持重定向功能
ansible dbservers -m shell -a 'echo 111 > /opt/aa.txt'

ansible dbservers -m shell -a 'cat /opt/aa.txt'

在这里插入图片描述

cron模块

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

  • present 表示添加(可以省略)
  • absent 表示移除。
 ansible-doc -s cron    #查看cron模块包含的操作动作#常用的参数: 
 minute/hour/day/month/weekday:分/时/日/月/周
 job:任务计划要执行的命令,尽量使用绝对路径。
 name:任务计划的名称。

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

删除系统备份任务

删除backup syslog计划任务:
在这里插入图片描述

user模块

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

ansible-doc -s user   

常用参数:

  • name:用户名,必选参数
  • state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
  • system=yes|no:是否为系统账号
  • uid:用户uid
  • group:用户基本组
  • shell:默认使用的shell
  • move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
  • password:用户的密码,建议使用加密后的字符串
  • comment:用户的注释信息
  • remove=yes|no:当state=absent时,是否删除用户的家目录
添加用户yy:
ansible dbservers -m user -a 'name=yy'
ansible dbservers -a 'tail -n 1 /etc/passwd'

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
不建议使用password指定密码,因为是明文保存,安全性低
在这里插入图片描述

group模块

管理用户组的模块。

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

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

在这里插入图片描述

创建ss用户,设为系统用户,附加组为a组
在这里插入图片描述
在这里插入图片描述

copy 模块

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

ansible-doc -s copy
#查看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=root'

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

file模块

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

主要参数如下:

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

在这里插入图片描述

ansible dbservers -m file -a 'path=/opt/a.txt state=absent'

在这里插入图片描述

ansible dbservers -m file -a 'path=/opt/a.txt state=directory'

在这里插入图片描述

示例3:创建软连接文件
ansible dbservers -m file -a 'path=/opt/ansible.link state=link src=/etc/ansible force=yes'

在这里插入图片描述
如果源地址不存在,则必须添加force=yes才能创建

ansible dbservers -m file -a 'path=/opt/ansible1.link state=link src=/etc/ansible'

在这里插入图片描述

hostname模块

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

ansible dbservers -m hostname -a 'name=client'

在这里插入图片描述

ping模块

测试远程主机的连通性

ansible all -m ping

在这里插入图片描述

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
ansible dbservers -a 'rpm -q httpd'

在这里插入图片描述

ansible dbservers -m yum -a 'name=httpd state=latest'

在这里插入图片描述
在这里插入图片描述

示例2:卸载httpd

在这里插入图片描述

service/systemd 模块

用于管理远程主机上的服务的运行状态。
主要参数如下:

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

安装httpd
在这里插入图片描述

ansible dbservers -m service -a 'name=httpd state=started enabled=yes'
#state=started,开启服务
#enabled=yes,开启开机自启

在这里插入图片描述
在这里插入图片描述

ansible dbservers -m service -a 'name=httpd state=stopped'
#state=stopped,关闭httpd

在这里插入图片描述

script模块

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

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

示例

赋予脚本使用权限
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

setup 模块

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

ansible dbservers -m setup    #获取dbservers主机的详细信息

在这里插入图片描述

ansible dbservers -m setup -a 'filter=*ipv4'
# filter,指定想要获取的信息

在这里插入图片描述
ansible:自动化运维工具可以实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具
特点:

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值