Ansible 工具从入门到使用

1. 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去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。


2. ansible 环境安装部署


 
管理端:192.168.80.10            ansible   centos 7-1
被管理端:192.168.80.20                        centos 7-2
被管理端:192.168.80.30                        centos 7-3

1)安装 ansible


wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y epel-release            //先安装 epel 源
yum install -y ansible
 


2)ansible 目录结构

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


 
3)配置主机清单

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


4)配置密钥对验证

ssh-keygen
ssh-copy-id root@192.168.80.20
ssh-copy-id root@192.168.80.30
ssh-copy-id root@192.168.80.40
ssh-copy-id root@192.168.80.50

3.  ansible 命令行模块 


命令格式:ansible <组名> -m <模块> -a <参数列表>
 
ansible-doc -l                #列出所有已安装的模块,按q退出

command 模块

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

ansible-doc -s command        #-s 列出指定模块的描述信息和操作动作
 
ansible 192.168.80.20 -m command -a 'ifconfig'        #指定 ip 执行 date
ansible webservers -m command -a 'ifconfig'            #指定组执行 date
ansible dbservers -m command -a 'ifconfig'       
ansible all -m command -a 'ifconfig'                #all 代表所有 hosts 主机
ansible all -a 'ls /'                            #如省略 -m 模块,则默认运行 command 模块


ansible webservers -m command -a 'touch /opt/kx.txt'

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

ansible all -m command -a "ifconfig"


ansible all -m command -a "chdir=/opt ls -alh"


shell 模块

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

ansible webservers -m shell -a 'ifconfig | grep ens33'


ansible webservers -m shell -a 'ifconfig > /opt/kx.txt'


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


cron 模块

在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。

常用的参数:
minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
user:指定计划任务属于哪个用户,默认是root用户

ansible-doc -s cron                #按 q 退出
 
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
ansible webservers -a 'crontab -l'
ansible webservers -m cron -a 'name="test crontab" state=absent'
 

user 模块


用户管理的模块

ansible-doc -s user
 
ansible dbservers -m user -a 'name="test01"'                #创建用户test01
ansible dbservers -m command -a 'tail /etc/passwd'
ansible dbservers -m user -a 'name="test01" state=absent'    #删除用户test01

ansible dbservers -m user -a 'name=zhangsan uid=9527 shell=/sbin/nologin create_home=no password=123456'
 不创建家目录,不可以登录

常用的参数:
name:用户名,必选参数
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:用户基本组
groups: 用户所属附加组
shell:默认使用的shell
create_home=yse|no: 是否创建家目录
password:用户的密码,建议使用加密后的字符串
remove=yes|no:当state=absent时,是否删除用户的家目录


group 模块

用户组管理的模块

ansible-doc -s group
 
ansible dbservers -m group -a 'name=kx gid=306 system=yes'    #创建kx组
ansible dbservers -a 'tail /etc/group'
 
ansible dbservers -m group -a 'name=kx state=absent'  #删除kx组  

copy 模块

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

ansible dbservers -m copy -a 'src=./hosts dest=/opt/host_ansible owner=root'

ansible dbservers -m copy -a 'src=./hosts dest=/opt/host_ansible owner=root node=777 owner=kx group=wheel'

 ansible dbservers -m copy -a 'src=/etc/yum.repos.d/ dest=/opt/rh/'
#yum.repos.d后面加/是Ⅷ目录内的文件复制过去,不加/是复制目录

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


file 模块

设置文件属性
ansible-doc -s file
 
ansible dbservers -m file -a ' group=root mode=644 path=/opt/host_ansible'    #修改文件的属主属组权限等


ansible dbservers -m file -a "path=/opt/abc.txt state=touch"            #创建一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"            #删除一个文件

ansible dbservers -m file -a 'path=/opt/host.link src=/opt/host_ansible state=link'    #设置/opt/.link为/opt/host_ansible的链接文件
 

hostname 模块

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

ansible dbservers -m hostname -a "name=mysql01"


ping 模块

检测远程主机的连通性

ansible all -m ping


yum/apt 模块

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

ansible-doc -s yum
 
ansible webservers -m yum -a 'name=httpd'                    #安装服务
ansible webservers -m yum -a 'name=httpd state=absent'        #卸载服务

service/systemd 模块

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

ansible-doc -s service
 
ansible webservers -a 'systemctl status httpd'            #查看web服务器httpd运行状态
ansible webservers -m service -a 'enabled=yes name=firewalld state=started'            #启动firewalld服务
 

常用的参数:
name:被管理的服务名称
state=started|stopped|restarted|reloaded:动作包含启动关闭或者重启
enabled=yes|no:表示是否设置该服务开机自启
runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动

script 模块


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

 
ansible-doc -s script
 
vim kx.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
 
chmod +x kx.sh
ansible webservers -m script -a 'kx.sh'
ansible webservers -a 'cat /opt/script.txt'
 

vim test.sh
#!/bin/bash
echo $1 > /opt/test.txt
echo $2 >> /opt/test .txt
ansible dbservers -m script -a 'test.sh abc 123'

mount 模块

挂载文件系统
 

常用的参数:
src:定义挂载设备的路径
path:定义挂载到哪个目录,必须指定
fstype:指定挂载文件的系统类型,必须指定,xfs、iso9660、nfs...
opts:定义挂载的参数,defaults、rw、ro...
state:定义挂载的状态,mounted(进行挂载,修改/etc/fstab信息)、absent(永久性卸载,并修改 /etc/fstab信息)、unmounted(临时卸载,不修改/etc/fstab信息)

ansible dbservers -m mount -a 'src=/dev/sr0 path=/mnt state=mounted fstype=iso9660'


archive 模块

打包压缩

常用的参数:
path: 必须参数,远程主机上需要被打包压缩的源文件/目录
dest: 打包压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖
format: 指定压缩类型,包括: bz2、gz(默认)、tar、xz、zip
remove=yes|no: 是否删除源文件

ansible-doc -s archive
ansible dbservers -m archive -a "path=/etc/yum.repos.d/ dest=/opt/repo.zip format=zip"

ansible dbservers -m archive -a "path=/opt/host_ansible,/opt/test.txt dest=/opt/ansible.tar.gz format=gz remove=yes"

unarchive 模块

解包解压缩

ansible-doc -s unarchive
 
#将 ansible 主机的压缩文件拷贝到到远程主机并解压,修改文件所属组和用户
ansible dbservers -m unarchive -a "src=/opt/abc.tar.gz dest=/root copy=yes"
或者
ansible dbservers -m unarchive -a "src=/opt/abc.tar.gz dest=/root remote_src=no"
 
#在远程主机解包
ansible dbservers -m unarchive -a "src=/opt/123.tar.gz dest=/root copy=no"
或者
ansible dbservers -m unarchive -a "src=/opt/123.tar.gz dest=/root remote_src=yes"
常用的参数:
copy:默认为 copy=yes ,拷贝的文件从 ansible 主机复制到远程主机,copy=no 表示在远程主机上寻找源文件解压
src:tar包源路径,可以是 ansible 主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置 copy=no
dest:解压后文件的目标绝对路径
remote_src: 和 copy 功能一样且互斥,设置 remote_src=yes 表示文件在远程主机上,设置为 remote_src=no 表示文件在 ansible 主机上

replace 模块


类似于sed命令,主要也是基于正则进行匹配和替换
ansible-doc -s replace

常用的参数:
path:必须参数,指定要修改的文件
regexp:必须参数,指定一个正则表达式
replace:替换regexp参数匹配到的字符串
backup=yes|no: 修改源文件前创建一个包含时间戳信息的备份文件
before:如果指定,则仅替换/删除此匹配之前的内容,可以和after参数结合使用
after:如果指定,则仅替换/删除此匹配之后的内容,可以和before参数结合使用
owner:修改文件用户名
group:修改文件组名
mode:修改文件权限

vim /opt/test.txt
11 22 33 44 55 66
aa bb cc dd ee ff
1a 2b 3c 4d 5e 6f


#匹配 333 并修改为 ccc
ansible dbservers -m replace -a "path=/opt/test.txt regexp='33' replace='cc'"

#匹配到任意一个或多个开头的行增加注释
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(.*)' replace='#\1'"

#取消注释
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^#(.*)' replace='\1'"

#匹配以 a 开头的后面有一个或者多个字符的行,并在前面添加 # 注释
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(a.*)' replace='#\1'"


#匹配 cc 之前的 3 并修改为 three
ansible dbservers -m replace -a "path=/opt/test.txt regexp='3' replace='three' before=cc"

 setup 模块


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

ansible-doc -s setup
 
ansible webservers -m setup                #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4'    #使用filter可以筛选指定的facts信息
ansible dbservers -m setup -a 'filter=ansible_*_mb'     #搜集内存相关的信息
ansible dbservers -m setup -a 'filter=ansible_ens*'     #搜集网卡信息

4. inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

1)如果是名称类似的主机,可以使用列表的方式标识各个主机

vim /etc/ansible/hosts
[webservers]
      
192.168.80.[2:5]0       #冒号后定义远程连接端口,默认是 ssh 的 22 端口
 
[dbservers]
192.168.80.20:2222      #支持匹配 a~f

2)inventory 中的变量


Inventory变量名                  含义
ansible_host                  ansible连接节点时的IP地址
ansible_port                  连接对方的端口号,ssh连接时默认为22
ansible_user                  连接对方主机时使用的用户名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password              连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file  指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args       提供给ssh、sftp、scp命令的额外参数
ansible_become                允许进行权限提升
ansible_become_method         指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user           提升为哪个用户的权限,默认提升为root
ansible_become_password       提升为指定用户权限时的密码

(1)主机变量

[dbservers]
192.168.80.20 ansible_port=22 ansible_user=root ansible_password=abc1234


 (2)组变量

[dbservers:vars]            #表示为 webservers 组内所有主机定义变量
ansible_user=root
ansible_password=abc1234
 
[all:vars]                    #表示为所有组内的所有主机定义变量
ansible_port=22


(3)组嵌套 


 
[webs:children]        #表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机
webservers
dbservers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/889958.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(2)- NPM发布、在线示例

这里分享一下本开源项目是如何构建组件库及其如何发布到NPM上的&#xff0c;还有组件库与在线示例的构建有什么差异。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 NPM 示例地址 版本更新信息 这两天抽空…

自动化测试中如何高效进行元素定位!

前言 在自动化测试中&#xff0c;元素定位是一项非常重要的工作。良好的元素定位可以帮助测试人员处理大量的测试用例&#xff0c;加快测试进度&#xff0c;降低工作负担。但是在实际的测试工作中&#xff0c;我们常常遇到各种各样的定位问题&#xff0c;比如元素定位失败、元…

鸿蒙开发之ArkUI 界面篇 三十三 Builder(封装容器)

鸿蒙开发中遇到容器相同、容器下面的子组件相同&#xff0c;就是子组件的文字不同&#xff0c;背景颜色不同&#xff0c;文字颜色不同之类&#xff0c;就可以使用Builder来封装&#xff0c;语法格式如下&#xff1a; 例如下面的界面&#xff1a; Row4个ColumImageText来实现&am…

Python WebSocket 的原理及其应用

Python WebSocket 的原理及其应用 在现代 Web 开发中&#xff0c;实时通信成为了越来越多应用的重要组成部分。尤其是像聊天应用、实时数据更新、在线游戏等场景&#xff0c;服务器与客户端之间的即时数据传输需求非常迫切。在传统的 HTTP 协议中&#xff0c;通信往往是基于请…

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具&#xff08;网络和串口调试助手&#xff09; 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中&#xff0c;并解压给权限 cd /home/${USER}/Ne…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中&#xff0c;“股票”可以说&#xff1a; • 株&#xff08;かぶ&#xff09; 这是最常用的表达方式&#xff0c;直接表示“股票”。 例如&#xff1a; 株を買う - 买股票 株を売る - 卖股票 • 株式&#xff08;かぶしき&#xff09; 这个词也是“股票”的意…

网站集群批量管理-Ansible(ad-hoc)

1. 概述 1. 自动化运维: 批量管理,批量分发,批量执行,维护 2. 无客户端,基于ssh进行管理与维护 2. 环境准备 环境主机ansible10.0.0.7(管理节点)nfs01 10.0.0.31(被管理节点)backup10.0.0.41(被管理节点) 2.1 创建密钥认证 安装sshpass yum install -y sshpass #!/bin/bash ##…

息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络

息肉检测数据集 yolov5 yolov8格式 息肉检测数据集介绍 数据集概述 名称&#xff1a;息肉检测数据集&#xff08;基于某公开的分割数据集调整&#xff09;用途&#xff1a;适用于目标检测任务&#xff0c;特别是内窥镜图像中的息肉检测格式&#xff1a;YOLO格式&#xff08;边…

YOLO11改进 | 注意力机制 | 轻量级的空间组增强模块SGE【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了一个空间组增强&#xff08;S…

论文笔记:Prototypical Verbalizer for Prompt-based Few-shot Tuning

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://arxiv.org/pdf/2203.09770.pdfhttps://arxiv.org/pdf/2203.09770.pdf 论文代码&#xff1a;https://github.com/thunlp/OpenPrompthttps://github.com/thunlp/OpenPrompt Abstract 基于提示的预训练语言模型&#…

highcharts样式记录

图表设置 const rendChart (min, max) > {Highcharts.setOptions({global: { useUTC: false },});Highcharts.chart(hourly-chart, {chart: {spacingBottom: 0,marginLeft: 53,marginTop: 10,marginBottom: 0,marginRight: 13,style: {fontSize: 0.2rem,color: #363a44,li…

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…

JAVA基础 day12

一、File、IO流 File是java.io.包下的类&#xff0c;file类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以代表文件、文件夹&#xff09;&#xff0c;使用File可以操作文件及文件夹。 注意&#xff1a;File只能对文件本身进行操作&#xff0c;不能读写文件里…

Redis到底是单线程还是多线程的?详解

1. Redis是单线程还是多线程的&#xff1f; Redis 的核心执行模型是单线程的&#xff0c;但自 Redis 6.0 版本起&#xff0c;在特定场景下支持了多线程处理。 1.1. Redis 的核心执行是单线程的 Redis 的单线程指的是 Redis 的⽹络 IO 以及键值对指令读写是由⼀个线程来执⾏的…

Unity实现自定义图集(四)

以下内容是根据Unity 2020.1.0f1版本进行编写的   在之前的篇章中已经把自定义图集在编辑器上的使用,以及运行时所需的信息都准备好了,接下来就是魔改UGUI的Image组件,使其能够像Image那样运行时如果引用的资源有打自定义图集,则加载对应自定义图集的Texture。 1、思路 …

【C语言】指针练习题

一、指针指向问题 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 结果为&#xff1a;2&#xff0c;5。&a是整个数组&#xff08;&a 1&#xff09;被强转为&#xff08;int*&am…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…