Ansible自动化运维工具及模块

news2024/11/19 2:26:07

目录

一、Ansible

1.ansible简介

2、ansible的特性

二、ansible的部署

1)管理端安装ansible

2)配置主机清单

3)配置密钥对验证

三、ansible命令块模块

1)command模块

2)shell模块

3)cron模块

4) user 模块

5)group模块

6)copy模块

7)file模块

8)hostname模块

9)ping 模块

10)yum 模块

11)service/systemd 模块

12)script 模块

13)mount模块

14)archive模块

15)unarchive模块

16)replace 模块

17)setup 模块

四、inventory 主机清单


一、Ansible

1.ansible简介

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

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

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

2、ansible的特性

 1)无客户端agent存在,不需要在被控制的节点上安装额外的客户端应用

 2)通过ssh协议与被控制节点通信

 3)基于模块工作的,可以通过模块实现在被控制节点上执行相应的命令操作

 4)很多模块具有幂等性,即可实现多次模块操作的状态如果没有发生改变,则不会重复执行

二、ansible的部署

管理端192.168.30.100ansible
被管理端192.168.30.14
被管理端192.168.30.15

1)管理端安装ansible

yum install -y epel-release            //先安装 epel 源
yum install -y ansible                    //在安装ansible

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

2)配置主机清单

  1. cd /etc/ansible

  2. vim hosts

  3. [webservers] #配置组名

  4. 192.168.30.14 #组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)

  5. [dbservers]

  6. 192.168.30.15

3)配置密钥对验证

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
 
yum install -y sshpass

 

sshpass -p '123123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.30.14
sshpass -p '123123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.30.15

三、ansible命令块模块

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

  2. ansible-doc -l #列出所有已安装的模块,按q退出

1)command模块

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

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

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

ansible 192.168.30.14 -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 模块

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

ansible all -m command -a "chdir=/home  ls ./"

creates:判断指定文件是否存在,如果存在,不执行后面的操作
 
例如:ansible  dbservers  -a  'creates=/etc/passwd head /etc/passwd'
           ansible  dbservers  -a  'creates=/opt/123 echo "123文件不存在"'

removes:判断指定文件是否存在,如果存在,执行后面的操作
 
例如:
    ansible  dbservers  -a  'removes=/etc/passwd head /etc/passwd'
    ansible  dbservers  -a  'removes=/opt/123 echo "123文件在不存在"'

2)shell模块

ansible-doc -s shell

ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test"'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

3)cron模块

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

  2. ansible-doc -s cron #按 q 退出

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

minute/hour/day/month/weekday:分/时/日/月/周
 
例如:
#每五分钟执行一次echo "hello word"
    ansible all -m cron -a 'minute="*/5" job="/bin/echo hello word" name="test cron"'
#使用crontab  -l 验证
    ansible all -a 'crontab -l'
#清除计划性任务
    ansible all -m cron -a 'name="test cron" state=absent'

或指定组名

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'

在30.14和30.15节点查看

返回30.100

再去30.14和30.15查看

4) user 模块

//用户管理的模块
ansible-doc -s user
 
//常用的参数:
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时,是否删除用户的家目录

例如:
    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

5)group模块

//用户组管理的模块
ansible-doc -s group
 
例如:
    ansible dbservers -m group -a 'name=mysql gid=306 system=yes'    #创建mysql组
    ansible dbservers -a 'tail /etc/group'
    ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'    #将test01用户添加到mysql组中
    ansible dbservers -a 'tail /etc/passwd'
    ansible dbservers -a 'id test01'   

6)copy模块

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

例如:
#将/etc/fstab文件复制到/opt/fstab.bak,并且文件的权限改为640,属主为root
    ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
    ansible dbservers -a 'ls -l /opt'        #查看/opt/目录下的内容
    ansible dbservers -a 'cat /opt/fstab.bak'    #查看复制过去的文件内容

#将helloworld写入/opt/hello.txt文件中
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'  
ansible dbservers -a 'cat /opt/hello.txt'

7)file模块

 //设置文件属性

 ansible-doc -s file

 ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak' #修改文件的属主属

ansible dbservers -a 'ls -l /opt'

  

  

#设置/opt/fstab.link为/opt/fstab.bak的链接文件
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'    
 
#创建一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=touch"
 
#删除一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"
 

  

  

  

  

  

8)hostname模块

  1. //用于管理远程主机上的主机名

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

  

9)ping 模块

  1. //检测远程主机的连通性

  2. ansible all -m ping

10)yum 模块

//在远程主机上安装与卸载软件包
ansible-doc -s yum
 
ansible webservers -m yum -a 'name=httpd'                    #安装服务
ansible webservers -m yum -a 'name=httpd state=absent'        #卸载服务

安装服务

卸载服务

11)service/systemd 模块

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

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

12)script 模块

//实现远程批量运行本地的 shell 脚本
ansible-doc -s script
 
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
 
chmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'

13)mount模块

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

  1. #挂载sr0

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

14)archive模块

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

  1. #将/etc/yum.repos.d/打包压缩到/opt/repo.zip下,压缩模式为zip

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

#将/opt/abc.txt打包压缩到/opt/abc123.tar.gz,压缩格式为gz,压缩完后删除源文件remove=yes
ansible dbservers -m archive -a "path=/opt/abc.txt,/opt/a.txt dest=/opt/111.tar.gz format=gz remove=yes"

15)unarchive模块

//解包解压缩
ansible-doc -s unarchive
 
//常用的参数:
copy:默认为 copy=yes ,拷贝的文件从 ansible 主机复制到远程主机,copy=no 表示在远程主机上寻找源文件解压
src:tar包源路径,可以是 ansible 主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置 copy=no
dest:解压后文件的目标绝对路径
remote_src: 和 copy 功能一样且互斥,设置 remote_src=yes 表示文件在远程主机上,设置为 remote_src=no 表示文件在 ansible 主机上

#将 ansible 主机的压缩文件拷贝到到远程主机并解压,修改文件所属组和用户
ansible dbservers -m unarchive -a "src=/opt/a111.tar.gz dest=/root copy=yes"
或者
ansible dbservers -m unarchive -a "src=/opt/a111.tar.gz dest=/root remote_src=no"

#在远程主机解包
ansible dbservers -m unarchive -a "src=/opt/a111.tar.gz dest=/root copy=no"
或者
ansible dbservers -m unarchive -a "src=/opt/a111.tar.gz dest=/root remote_src=yes"

16)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
 
#匹配 33 并修改为 cc
ansible dbservers -m replace -a "path=/opt/test.txt regexp='33' replace='cc'"

dbserver:30.15

返回ansible主机:30.100

  1. #匹配到任意一个或多个开头的行增加注释

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

  1. #取消注释

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

  1. #匹配以 a 开头的后面有一个或者多个字符的行,并在前面添加 # 注释

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

17)setup 模块

//facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
ansible-doc -s setup
 
ansible webservers -m setup                #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4'    #使用filter可以筛选指定的facts信息

四、inventory 主机清单

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

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

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

Inventory变量名含义
ansible_hostansible连接节点时的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)主机变量

[webservers]
192.168.80.11 ansible_port=22 ansible_user=root ansible_password=abc1234

(2)组变量

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

[all:vars]                    #表示为所有组内的所有主机定义变量
ansible_port=22

(3)组嵌套

[nginx]
192.168.80.20
192.168.80.21
192.168.80.22

[apache]
192.168.80.3[0:3]

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试之Web自动化测试,Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

无缝集成GORM与Go Web框架

探索GORM与流行的Go Web框架之间的和谐集成&#xff0c;以实现高效的数据管理 高效的数据管理是每个成功的Web应用程序的基础。GORM&#xff0c;多才多艺的Go对象关系映射库&#xff0c;与流行的Go Web框架非常搭配&#xff0c;提供了无缝集成&#xff0c;简化了数据交互。本指…

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

玩转Linux基本指令

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;牢记Linux的基本指令。 > 毒鸡汤&#xff1a;挫…

2023 年最好的 Android 系统修复/刷机应用程序和软件

任何 Android 设备要顺利运行&#xff0c;其操作系统必须运行良好。幸运的是&#xff0c;对于大多数 Android 用户来说&#xff0c;这是不间断的。设备运行良好&#xff0c;打电话、共享文档等都没有问题。尽管如此&#xff0c;Android 操作系统可能会停止运行。这可能是由于特…

Postman for Mac(HTTP请求发送调试工具)v10.18.10官方版

Postman for mac是一个提供在MAC设备上功能强大的开发&#xff0c;监控和测试API的绝佳工具。非常适合开发人员去使用。此版本通过Interceptor添加了对请求捕获的支持&#xff0c;修正了使用上下文菜单操作未复制响应正文的问题和预请求脚本的垂直滚动条与自动完成下拉列表重叠…

ios开发 之 多线程

目录 第一节&#xff1a;多线程简介 线程执行原理 主线程 多线程解决方案 pthread __bridge NSThread 线程的状态 第二节&#xff1a;多线程访问资源 Synchronized nonatomic 、atomic 自动释放池 属性修饰符 第三节&#xff1a;消息循环 消息模式 第四节&…

人工智能基础_机器学习022_使用正则化_曼哈顿距离_欧氏距离_提高模型鲁棒性_过拟合_欠拟合_正则化提高模型泛化能力---人工智能工作笔记0062

然后我们再来看一下,过拟合和欠拟合,现在,实际上欠拟合,出现的情况已经不多了,欠拟合是 在训练集和测试集的准确率不高,学习不到位的情况. 然后现在一般碰到的是过拟合,可以看到第二个就是,完全就把红点蓝点分开了,这种情况是不好的, 因为分开是对训练数据进行分开的,如果来…

三掌柜第2期赠书活动:《计算机考研精炼1000题》

引言 各位朋友大家好&#xff0c;我是三掌柜。今天&#xff0c;三掌柜赠书第2期启动&#xff0c;本次为大家精选了《计算机考研精炼1000题》这本书。关于这本书的内容&#xff0c;非常丰富&#xff0c;涵盖计算机考研的高频知识内容&#xff0c;不管是正在备考&#xff0c;还是…

JUC下常见类

JUC(java.util.concurrent) 的常见类ReentrantLock原子类线程池信号量SemaphoreCountDownLatch JUC(java.util.concurrent) 的常见类 ReentrantLock ReentrantLock可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全。 用法: lock(): 加锁, 如果获…

合同审查---财务条款、合同形式与生效审查

1.合同主体 1人 廖 2.财务条款、合同形式与生效 1人 黄 3.履行、验收、知识产权、不可抗力 1人 詹 4.违约责任、争议解决、保密、法律引用 1人 王 代码规范&#xff1a; 1.代码函数的层级 各审查点在json中分为3级层级&#xff0c;但用python写规则的时候&#xff0c;1级层级为…

【C++那些事儿】类与对象(2)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我之前看过一套书叫做《明朝那些事儿》&#xff0c;把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言&#xff0c;无疑是抽象且难度颇…

LeetCode 面试题 16.20. T9键盘

文章目录 一、题目二、C# 题解 一、题目 在老式手机上&#xff0c;用户通过数字键盘输入&#xff0c;手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列&#xff0c;实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射…

图书销售数据大屏可视化【可视化项目案例-03】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

Leetcode-144 二叉树的前序遍历

递归方法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

谈谈如何写作(一)

序言 没有什么比一套好理论更有用了。——库尔特勒温 谈谈如何写作&#xff1f; 这个题目就像一本书《如何阅读一本书》&#xff0c;听起来似乎很无趣&#xff0c;因为各位盆友直接的反应&#xff0c;可能是这根本无需理论。 实际情况呢&#xff1f;恰恰相反&#xff0c;往往你…

javax.management.InstanceNotFoundException: Catalina:type=Server错误的解决

软件&#xff1a; JDK 1.8 Tomcat 8.5.66 IDEA 2019.3.3 问题&#xff1a;启动IDEA新建一Web Application项目&#xff0c;设置好项目运行&#xff0c;结果发现提示&#xff1a; 提示&#xff1a;Application Server was not connected before run configuration stop, rea…

JavaSE 类与对象

前言 我们之前学的都是面向过程&#xff0c;面向过程研究的是对单个对象的一种方法实现过程&#xff0c;比如求一个数的阶乘&#xff0c;强调的是怎么实现这个方法的过程&#xff0c;但对我们以后来说&#xff0c;如果想要应用到更广的层面&#xff0c;不能只是学习一个方法的…

基于Qt Linux开发板USER-KEY按键实现

介绍如何在 Qt 应用上使用嵌入式 GET6818 Linux 开发板 上的按键。 工具:Qt Creator 5.14.2 平台:windows ## 资源简介 在GET6818 开发板,开发板板载资源上有两个用户按键。如下图原理图(下图开发板的按键原理图)。 ## 应用实例 想要监测这个 KEY0,首先出厂内核已经…

Linux是什么,Linux系统介绍

很多小伙伴都不是那么了解和知道Linux&#xff0c;到底Linux是什么&#xff1f; 像大家用到的安卓手机&#xff0c;生活中用到的各种智能设备&#xff0c;比如路由器&#xff0c;光猫&#xff0c;智能家具等&#xff0c;很多都是在Linux操作系统上。 Linux是什么&#xff1f;Li…