ansible搭建

一,ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能

二,特点

* 部署简单

* **默认使用ssh进行管理,基于python里的==paramiko==模块开发**

* 管理端和被管理端不需要启动服务

* 配置简单,功能强大,扩展性强

* 能过playbook(剧本)进行多个任务的编排

三,ansible搭建

实验准备三台机器,一台管理机 192.168.115.3,两台被管理机 192.168.115.4 192.168.115.5

#所有主机都要配置主机名和 hosts文件

[root@hd1 ~]# hostnamectl set-hostname hd1

[root@hd1 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.11 hd1

192.168.1.12 hd2

192.168.1.13 hd3

#hd2和hd3 同上类似操作

关闭防火墙, selinux

时间同步

下载更新epel源

yum -y install epel-release
 

管理机上安装ansible,被管理节点必须打开ssh服务

 yum install epel-release
yum install ansible
查看版本ansible --version

实现master对agent的免密登录,只在master上做。(如果这一步不做,则在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码

ssh-keygen

ssh-copy-id   192.168.115.4      192.168.115.5

在master上定义主机组,并测试连接性

vim /etc/ansible/hosts 

 ansible -m ping group1

查看支持的模块

ansible-doc -l

hostname模块配置

hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)

将其中一远程机器主机名修改为agent1

ansible 192.168.115.4 -m hostname -a 'name=agent1'
基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2" argment

测试完改回hd2

file模块

file模块用于对文件相关的操作(创建, 删除, 软硬链接等)

创建一个目录

ansible group1 -m file -a 'path=/test state=directory'

创建一个文件

ansible group1 -m file -a 'path=/test/111 state=touch'

递归修改owner,group,mode

ansible group1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

测试完改回777权限

删除目录 absent 缺席的(连同目录里的所有文件)

ansible group1 -m file -a 'path=/test state=absent'

创建文件并指定owner,group,mode等

ansible group1 -m file -a 'path=/tmp/111 state=touch owner=bin group=daemon mode=777'

删除文件

ansible group1 -m file -a 'path=/tmp/111 state=absent'

创建软链接文件

ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

创建硬链接文件

ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'

copy模块

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

在master上准备一个文件,拷贝此文件到group1的所有机器上

echo master > /tmp/222
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'

使用content参数直接往远程文件里写内容(会覆盖原内容)

ansible group1 -m copy -a 'content="ha ha\n" dest=/tmp/333'注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

使用force参数控制是否强制覆盖

先在hd2 hd3里创建文件  touch /tmp/444

如果目标文件已经存在,则不覆盖
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/444 force=no'如果目标文件已经存在,则会强制覆盖
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/444 force=yes'

使用backup参数控制是否备份文件

backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
group1的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333
ansible group1 -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=777'

copy模块拷贝时要注意拷贝目录后面是否带"/"符号

/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

练习: 在master上配置好所有的yum源,然后拷贝到group1的远程机器上(要求目录内的内容完全一致)

master上配置yum源

ansible group1 -m file -a "path=/etc/yum.repos.d/ state=absent"   删除hd2 hd3上的/etc/yum.repos.d目录ansible group1 -m copy -a "src=/etc/yum.repos.d dest=/etc/"   把hd1上的目录拷贝到hd2 hd3

hd2 hd3查看

练习: 使用hostname模块修改过主机名后.在master上修改/etc/hosts文件,并拷贝到group1的远程机器上

先删除hd2 hd3的hosts文件,在master上修改好/etc/hosts文件,然后使用下面命令拷贝过去覆盖
ansible group1 -m copy -a "src=/etc/hosts dest=/etc/hosts"

客户端查看

user模块

user模块用于管理用户账号和用户属性。

创建aaa用户,默认为普通用户,创建家目录

ansible group1 -m user -a ‘name=aaa state=present’

创建bbb系统用户,并且登录shell环境为/sbin/nologin

ansible group1 -m user -a ‘name=bbb state=present system=yes  shell="/sbin/nologin"’

创建ccc用户, 使用uid参数指定uid, 使用password参数传密码

echo 123456 | openssl passwd -1 -stdin
$1$1a.g59z9$kfIxvDIvOq0g20Sd2XMib0​
下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确
ansible group1 -m user -a 'name=ccc uid=2000 state=present password="$1$1a.g59z9$kfIxvDIvOq0g20Sd2XMib0"'

创建一个普通用户叫hadoop,并产生空密码 密钥对

ansible group1 -m user -a 'name=hadoop generate_ssh_key=yes'

删除aaa用户,但家目录默认没有删除

 ansible group1 -m user -a 'name=aaa state=absent'

删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

ansible group1 -m user -a 'name=bbb state=absent remove=yes'

group模块

group模块用于管理用户组和用户组属性。

创建组

ansible group1 -m group -a 'name=groupa gid=3000 state=present'

删除组(如果有用户的gid为此组,则删除不了)

 ansible group1 -m group -a 'name=groupa state=absent'

cron模块

cron模块用于管理周期性时间任务

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。 如果minute,hour,day,month,week不指定的话,默认都为*

ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/2' 

删除cron任务

 ansible group1 -m cron -a 'name="test cron1" state=absent'

 

yum_repository模块

yum_repository模块用于配置yum仓库。

增加一个/etc/yum.repos.d/local.repo配置文件

ansible group1 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"

注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
# mount /dev/cdrom /mnt

删除/etc/yum.repos.d/local.repo配置文件

 ansible group1 -m yum_repository -a "name=local state=absent" 

yum模块(重点)

yum模块用于使用yum命令来实现软件包的安装与卸载。

使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)

ansible group1 -m yum -a 'name=vsftpd state=present'

使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest' 

使用yum卸载httpd,httpd-devel软件

ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent' 

service模块(重点)

service模块用于控制服务的启动,关闭,开机自启动等。

启动vsftpd服务,并设为开机自动启动

ansible group1 -m service -a 'name=vsftpd state=started enabled=on'

关闭vsftpd服务,并设为开机不自动启动

ansible group1 -m service -a 'name=vsftpd state=stopped enabled=false'

练习: 在group1的被管理机里的mariadb里创建一个abc库

mysql -e user=root password=123456 "create database abc ;"

练习:

假设我主机清单里定义的group1里有多台机器,它们现在要做一个集群。此集群要求实现一个名为hadoop的普通用户之间的两两免密登录,如何实现(要求只在master上进行操作)?

script模块

script模块用于在远程机器上执行本地脚本。

在master上准备一个脚本
master# vim /tmp/1.sh
#!/bin/bash
mkdir /tmp/haha
touch /tmp/haha/{1..10}
​
在group1的远程机器里都执行master上的/tmp/1.sh脚本(此脚本不用给执行权限)
ansible group1 -m script -a '/tmp/1.sh'

扩展: 使用shell脚本实现在group1的被管理机里的mariadb里创建一个abc库

#!/bin/bash
​
yum install mariadb-server -y  &> /dev/null
​
systemctl start mariadb
systemctl enable mariadb
​
mysql << EOF
create database abc;
quit
EOF
​
把上面的脚本使用script模块在group1被管理机里执行即可

command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

ansible.builtin.command module – Execute commands on targets — Ansible Documentation

ansible.builtin.shell module – Execute shell commands on targets — Ansible Documentation

master# ansible -m command group1 -a "useradd user2"
master# ansible -m command group1 -a "id user2"
​
master# ansible -m command group1 -a "cat /etc/passwd |wc -l"       --报错
master# ansible -m shell group1 -a "cat /etc/passwd |wc -l"     --成功
​
master# ansible -m command group1 -a "cd $HOME;pwd"   --报错
master# ansible -m shell  group1 -a "cd $HOME;pwd"    --成功

注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

三、playbook

playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

参考:Ansible playbooks — Ansible Documentation

使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)

YMAL格式

  • 以.yaml或.yml结尾

  • 文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)

  • 以#号开头为注释

  • 列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)

  • 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)

  • ==注意: 写这种文件不要使用tab键,都使用空格==

参考: YAML Syntax — Ansible Documentation

下面看一个官方的示例感受一下

---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:- Apple- Orange- Strawberry- Mango
languages:ruby: Elitepython: Elitedotnet: Lame

playbook实例

先直接来看一个实例

第1步: 创建一个存放playbook的目录(路径自定义)

master# mkdir /etc/ansible/playbook

第2步: 准备httpd配置文件,并修改成你想要的配置

master# yum install httpd -y
​
按需要修改你想要的配置(为了测试可以随意改动标记一下)
master# vim /etc/httpd/conf/httpd.conf

第3步: 写一个playbook文件(后缀为.yml或.yaml)

# vim /etc/ansible/playbook/example.yaml
---
- hosts: group1remote_user: roottasks:  - name: ensure apache is at the latest version    yum: name=httpd,httpd-devel state=latest- name: write the apache config file      copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart apache- name: ensure apache is running (and enable it at boot)service: name=httpd state=started enabled=yeshandlers: - name: restart apacheservice: name=httpd state=restarted

第4步: 执行写好的palybook

  • 会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

  • 执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

# ansible-playbook /etc/ansible/playbook/example.yaml

Playbook常见语法

hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.

remote_user: 用于指定远程主机上的执行任务的用户.

- hosts: group1         remote_user: root 

tasks: 任务列表, 按顺序执行任务.

  • 如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.

  tasks:- name: ensure apache is at the latest version    yum: name=httpd,httpd-devel state=latest- name: write the apache config file      copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

handlers: 类似task,但需要使用notify通知调用。

  • 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.

  • handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

    notify:               - restart apache- name: ensure apache is running (and enable it at boot)service: name=httpd state=started enabled=yeshandlers:- name: restart apacheservice: name=httpd state=restarted

练习: 修改httpd的端口为8080,再执行playbook测试

variables: 变量

  • 定义变量可以被多次方便调用

master# vim /etc/ansible/playbook/example2.yaml
---
- hosts: group1remote_user: rootvars:- user: test1tasks:- name: create useruser: name={{user}} state=present
~                                           
master# ansible-playbook /etc/ansible/playbook/example2.yaml

案例: playbook编排vsftpd

写一个playbook实现

  1. 配置yum

  2. 安装vsftpd包

  3. 修改配置文件(要求拒绝匿名用户登录)

  4. 启动服务并实现vsftpd服务开机自动启动

---
- hosts: group1                 remote_user: root                     tasks:                                - name: rm yum repository      file: path=/etc/yum.repos.d/ state=absent- name: 同步master上的yum源到group1copy: src=/etc/yum.repos.d dest=/etc/- name: ensure vsftpd is at the latest version        yum: name=vsftpd state=latest- name: write the apache config file          copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf notify:                             - restart vsftpd- name: ensure vsftpd is running (and enable it at boot)service: name=vsftpd state=started enabled=yeshandlers:                     - name: restart vsftpd              service: name=vsftpd state=restarted

playbook编排多个hosts任务

---         # ---代表开始(可选项,不写也可以)
- hosts: 10.1.1.12remote_user: roottasks:- name: 创建/test1/目录file: path=/test1/ state=directory
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
- hosts: 10.1.1.13remote_user: roottasks:- name: 创建/test2/目录file: path=/test2/ state=directory
...         # ...代表结束(可选项,不写也可以)

案例: 编排nfs搭建与客户端挂载

1, 在master上准备nfs配置文件

# vim /etc/exports
/share  *(ro)

2, 编写yaml编排文件

# vim /etc/ansible/playbook/nfs.yml
---
- hosts: 10.1.1.12remote_user: roottasks:- name: 安装nfs服务相关软件包yum: name=nfs-utils,rpcbind,setup  state=latest
​- name: 创建共享目录file: path=/share/ state=directory
​- name: 同步nfs配置文件copy: src=/etc/exports dest=/etc/exports
​notify: restart nfs
​- name: 启动rpcbind服务,并设置为开机自启动service: name=rpcbind state=started enabled=on
​- name: 启动nfs服务,并设置为开机自启动service: name=nfs state=started enabled=on
​handlers:- name: restart nfsservice: name=nfs state=restarted
​
- hosts: 10.1.1.13remote_user: roottasks:- name: 安装nfs客户端软件包yum: name=nfs-utils state=latest
​- name: 挂载nfs服务器的共享shell: mount 10.1.1.12:/share /mnt

3, 执行playbook

# ansible-playbook /etc/ansible/playbook/nfs.yaml

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker:01 OverView

Docker&#xff1a;01 OverView 基本介绍 Docker是一个用于开发、交付、运行应用程序的开放平台&#xff0c;可以使应用程序与基础架构分开&#xff0c;以便快速交付软件。 Docker在一个被叫做容器的隔离环境下&#xff0c;提供了打包和运行的能力。 容器非常轻量化&#x…

时序分解 | MATLAB实现基于小波分解信号分解分量可视化

时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化&#xff0c;MATLAB编程程序&#xff0c;用于将信号分解成不同尺度和频率的子信…

ARM DIY(十一)板子名称、开机 logo、LCD 控制台、console 免登录、命令提示符、文件系统大小

文章目录 前言板子名称uboot Modelkernel 欢迎词、主机名 开机 logoLCD 控制台console 免登录命令提示符文件系统大小 前言 经过前面十篇文章的介绍&#xff0c;硬件部分调试基本完毕&#xff0c;接下来的文章开始介绍软件的个性化开发。 板子名称 uboot Model 既然是自己的…

云备份——服务端客户端联合测试

一&#xff0c;准备工作 服务端清空备份文件信息、备份文件夹、压缩文件夹 客户端清空备份文件夹 二&#xff0c;开始测试 服务端配置文件 先启动服务端和客户端 向客户端指定文件夹放入稍微大点的文件&#xff0c;方便后续测试断点重传 2.1 上传功能测试 客户端自动上传成功…

【FPGA】通俗理解从VGA显示到HDMI显示

注&#xff1a;大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;” 贴个下载地址&#xff1a; 野火FPGA-Altera-EP4CE10征途开发板_核心板 — 野火产品资料下载中心 文档 hdmi显示器驱动设计与验证 — …

《服务器无状态设计:为什么如何实现无状态API?》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

高速路自动驾驶功能HWP功能定义

一、功能定义 高速路自动驾驶功能HWP是指在一般畅通高速公路或城市快速路上驾驶员可以放开双手双脚&#xff0c;同时注意力可在较长时间内从驾驶环境中转移&#xff0c;做一些诸如看手机、接电话、看风景等活动&#xff0c;该系统最低工作速度为60kph。 如上两种不同环境和速度…

你参与的APP开发项目安全吗?

Android将安全设计贯穿系统架构的各个层面&#xff0c;覆盖系统内核、虚拟机、应用程序框架层以及应用层各个环节&#xff0c;力求在开放的同时&#xff0c;也恰当保护用户的数据、应用程序和设备的安全。Android安全模型主要提供以下几种安全机制&#xff1a; 进程沙箱隔离机…

【100天精通Python】Day59:Python 数据分析_Pandas高级功能-多层索引创建访问切片和重塑操作,pandas自定义函数和映射功能

目录 1 多层索引&#xff08;MultiIndex&#xff09; 1.1 创建多层索引 1.1.1 从元组创建多层索引 1.1.2 使用 set_index() 方法创建多层索引 1.2 访问多层索引数据 1.3 多层索引的层次切片 1.4 多层索引的重塑 2 自定义函数和映射 2.1 使用 apply() 方法进行自定义函…

Stable Diffusion — ControlNet 超详细讲解

Stable Diffusion — ControlNet 超详细讲解 ControlNet 最近非常火&#x1f525;&#xff01;ControlNet 和 Stable Diffusion 的结合使 Stable Diffusion 能够接受指导图像生成过程的条件输入&#xff0c;从而增强了 Stable Diffusion 的性能。今天为大家深入剖析 ControlNe…

Axure RP仿QQ音乐app高保真原型图交互模板源文件

Axure RP仿QQ音乐app高保真原型图交互模板源文件。本套素材模板的机型选择华为的mate30&#xff0c;在尺寸和风格方面&#xff0c;采用标准化制作方案&#xff0c;这样做出来的原型图模板显示效果非常优秀。 原型中使用大量的动态面板、中继器、母版&#xff0c;涵盖Axure中技…

SpringMVC中的综合案例

目录 一.常用注解 实例&#xff1a; 二.参数转递 2.1. 基础类型 2.2. 复杂类型 2.3. RequestParam 2.4.PathVariable 2.5.RequestBody 2.6.RequestHeader 2.7. 请求方法 三.返回值 3.1.void 3.2.String 3.3 StringModel 3.4 ModelAndView 四、页面跳转 4.1.转发 4.…

Python爬虫 教程:IP池的使用

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施&#xff0c;例如很多网站会检测某一段时间某个IP的访问次数&#xff0c;如果访问频率…

Redis(详细)

目录 Redis是什么 Redis的主要特点 Redis的使用场景 会话存储 缓存存储 实现分布式锁 Redis为什么这么快 基于内存操作 高效的数据结构 多路I/O复用模型 单线程执行 Redis常见的数据结构 Redis有序列表的实现 跳跃表的执行流程 Redis分布式锁实现 使用分布式锁…

【iOS】MVC

文章目录 前言一、MVC各层职责1.1、controller层1.2、model层1.3、view层 二、总结三、优缺点3.1、优点3.2、缺点 四、代码示例 前言 MVC模式的目的是实现一种动态的程序设计&#xff0c;使后续对程序的修改和扩展简化&#xff0c;并且使程序某一部分的重复利用成为可能。除此…

win10自带wifi共享功能

1、按下【wini】组合键打开windows设置&#xff0c;点击【网络和internet】&#xff1b; 2、按照下图&#xff0c;打开个移动热点&#xff0c;设置名称、密码。

【C++】详解std::thread

2023年9月10日&#xff0c;周日下午开始 2023年9月10日&#xff0c;周日晚上23:35完成 虽然这篇博客我今天花了很多时间去写&#xff0c;但是我对std::thread有了一个完整的认识 不过有些内容还没完善&#xff0c;以后有空再更新.... 目录 头文件类的成员类型方法(construc…

LVS DR模式负载均衡群集部署

目录 1 LVS-DR 模式的特点 1.1 数据包流向分析 1.2 DR 模式的特点 2 DR模式 LVS负载均衡群集部署 2.1 配置负载调度器 2.1.1 配置虚拟 IP 地址 2.1.2 调整 proc 响应参数 2.1.3 配置负载分配策略 2.2 部署共享存储 2.3 配置节点服务器 2.3.1 配置虚拟 IP 地址 2.3.2…

iOS IdiotAVplayer实现视频分片缓存

文章目录 IdiotAVplayer 实现视频切片缓存一 iOS视频边下边播原理一 分片下载的实现1 分片下载的思路2 IdiotAVplayer 实现架构 三 IdiotAVplayer 代码解析IdiotPlayerIdiotResourceLoaderIdiotDownLoader IdiotAVplayer 实现视频切片缓存 一 iOS视频边下边播原理 初始化AVUR…

自动化运维——ansible (五十二) (01)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、概述 1.1 为什么要用自动化运维软件 1.2 自动化运维 1.3 自动化运维要注意的方面 1.4 自动化运维主要关注的方面 1.5 常见的开源自动化运维软件 1.6 自动化运维软件…