JustDoIt
type: channel
link: https://www.wangmanyuan.com/
description: 云原生
items: windterm远程工具
items: 一键安装docker脚本
items: 小飞机
items: 更换ssl证书报错
items: clickhouse 系统表日志清理
items: 商品分类
items: Ansible--Ansible之Roles
items: Ansible--Module
items: Ansible--快速入门
items: Ansible--Ansible之Playbook

windterm远程工具
type: item
date: 2026-03-07T01:14:27+00:00
description: 说到SSH终端工具，大家首先想到的可能会是putty、xshell这些老牌客户端。以上这些工具能够流行至今，并有一定的用户群体，一定有其独特之处。不过在互联网日益发达的今天，我们工作中的使用需求也越来越多，比如：在远程连接服务器、运行Linux命令的同时，可能还需要传输一些文件；我们希望可以同时连接多台服务器，在多个窗口下管理，便于相互切换；在管理Linux的同时，还可以运行cmd/zsh以及gitbash，而不是开多个软件……一、windterm简介1.关于windtermwindterm是一款风格独特、开源、且完全免费的SSH/Telnet/Serial/Shell/Sftp 客户端项目地址：https://github.com/kingToolbox/WindTerm下载地址：https://github.com/kingToolbox/WindTerm/releases2.windterm特点 实现了 SSH v2、Telnet、Raw Tcp、串行、Shell 协议； 会话认证时支持 SSH 自动执行； 支持 SSH ControlMaster； 支持 SSH ProxyCommand 或 ProxyJump； 支持 SSH 代理转发； 支持使用密码、公钥、键盘交互、gssapi-with-mic 的 SSH 自动登录； 支持X11转发； 支持直接/本地端口转发、反向/远程端口转发和动态端口转发； 支持 XModem、YModem 和 ZModem； 集成sftp、scp客户端，支持下载、上传、删除、重命名、新建文件/目录等； 集成本地文件管理器，支持移动、复制、复制、删除、重命名、新建文件/目录等； 支持 Windows Cmd、PowerShell 和 Cmd、PowerShell 作为管理员； 支持Linux bash、zsh、powershell core等； 支持 MacOS bash、zsh、powershell 内核等； 二、创建服务器连接以下将会结合实际案例，分别从直连方式以及代理连接两方面，介绍windterm如何连接、管理远程服务器。1.本地或公网直连1）新建会话 主机：输入内网主机地址或可以直连的公网地址 标签：可以创建一个别名 分组：选择分组（分组可以提前新建，如百度云、华为云、内网服务器等），便于分类管理 Description：描述信息 2）输入用户名输入用户名，勾选“下次自动登录”，点击“继续”3）输入密码输入密码，点击“继续”登录成功页面如下：二、使用windterm1.主页布局通过截图可以看出： 右上角会话区域，可以新建服务器会话连接，支持新建、导入 左上角区域为已打开的会话 文件管理器支持文件的上传、下载，支持直接拖拽到此区域进行文件上传 大纲区域为此会话输入的历史命令，双击可立即在此会话窗口执行该命令 2.上传&下载文件左下角文件管理器，可以创建文件夹，上传、下载文件等，也可以将文件直接拖到这个区域进行上传文件、直接将文件从这个区域拖出进行下载文件。3.cmd & git bashwindterm右上角会话区域Shell sessions中集成了cmd及git bash窗口功能，便于同时操作多种类型会话。4.历史操作命令虽然有些执行过的历史命令可以通过history或是上下键进行翻滚查找到，但windterm在右下角大纲区域直接展示了本会话过程中所有执行过的历史命令，双击即可再次执行，免去多次重复键入或查找的麻烦。我认为这也是windterm最好用的特色功能之一。三.通过代理连接内网服务器或公网地址直连相对较为简单，直接输入用户名和密码就可以了。但很多情况下，并不是每台远程服务器都有公网地址，或是22端口不对外开放，这时就需要通过一台公网服务器的代理跳转到其同一体系的各个内网下才能进行连接。以下为代理连接核心思路：先建立一个隧道，用来监听本地端口，再新建一个代理连接，并在代理中填写前面创建的隧道中填写的本地监听端口号，通过【隧道+代理】即可跳转到远程服务器的内网其他主机，注意： 一个隧道中填写一个端口号，端口号只要是本地没被占用的端口号就行； 一个隧道最好只对应一个代理连接（避免因为一个端口挂掉而导致关联连接全断掉的情况）； 一个代理对应一个远程服务器的内网主机； 内网主机登录前，跳板机必须处于登录状态，跳板机断开后，相应各内网主机也会自动断连； 1）新建隧道点击右上角“隧道”-“Tunnel Settings”进入隧道管理，再点击右下角“+”号新建一个隧道，如下图所示： 名称：任意，自己能记住就行，最好带有一定标识来标识特定的含义 类型：选择动态转发 会话：选择跳板机所在的会话（需要通过这台跳板机、也是公网服务器来跳转到内网） 监听端口：任意，注意不要与其他已正在使用的端口重复…

一键安装docker脚本
type: item
date: 2025-03-07T20:54:33+00:00
description: #!/bin/bash # 脚本参数提示 function help_info(){ echo -e "\033[32m\t\t\t请在脚本后面输入参数\t\t\t\t\033[0m" echo -e "\033[32m+-----------------------+---------------------------------------+\033[0m" echo -e "\033[32m|\t参数\t\t|\t\t详解\t\t\t|\033[0m" echo -e "\033[32m+-----------------------+---------------------------------------+\033[0m" echo -e "\033[32m|\toffline\t\t|\t离线安装\t\t\t|\033[0m" echo -e "\033[32m|\tonline\t\t|\t在线安装(需要机器访问外网)\t|\033[0m" echo -e "\033[32m|\tremove\t\t|\t清理环境\t\t\t|\033[0m" echo -e "\033[32m|\thelp\t\t|\t帮助信息\t\t\t|\033[0m" echo -e "\033[32m|\tuninstall\t|\t卸载docker\t\t\t|\033[0m" echo -e "\033[32m+-----------------------+---------------------------------------+\033[0m" } # 安装其他docker版本 function download_other_version(){ cd /root/docker_install_pkg/ # 若第2个参数不做自定义版本要求，则默认使用24.0.2版本安装包 docker_version=${2:-24.0.2} while true; do wget https://download.docker.com/linux/static/stable/x86_64/docker-$docker_version.tgz &> /dev/null if [ $? -eq 0 ]; then echo -e "\033[32m下载Docker离线安装包为:docker-$docker_version.tgz,包存放路径为:/root/docker_install_pkg/\033[0m" break fi done # wget https://download.docker.com/linux/static/stable/x86_64/docker-$docker_version.tgz >> /dev/null # echo -e "\033[32m下载Docker离线安装包为:docker-$docker_version.tgz,包存放路径为:/root/docker_install_pkg/\033[0m" } # function find_pkg(){ cp -a $(find / -name 'docker-24.0.2.tgz' | grep -i docker) /root/docker_install_pkg/ } # 离线安装配置 function install_service(){ cd /root/docker_install_pkg/ tar -zxf docker*.tgz cp -p docker/* /usr/bin/ cat > /usr/lib/systemd/system/docker.service << EOF [Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.com After=network.target docker.socket [Service] Type=notify EnvironmentFile=-/run/flannel/docker WorkingDirectory=/usr/local/bin ExecStart=/usr/bin/dockerd \ -H tcp://0.0.0.0:4243 \ -H unix:///var/run/docker.sock \ --selinux-enabled=false \ --log-opt max-size=1g ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance p…

小飞机
type: item
date: 2025-02-04T09:29:00+00:00
description: 已经用了很长时间了,也对比了多家,综合来看这家是性价比最高的,同时支持签到来延长使用周期,当然如果需要自动签到方法的可加群沟通。 平时翻阅文献和github下载、刷YT等速度刷刷的,总体来说挺稳定的支持多端同时在线,后续会持续使用。备注：要理性网上冲浪,合理合规浏览所需内容,切勿转发和讨论与IT技术无关的事情~推荐注册入口(以下三种方式任选)通过 https://glados.space/landing/2DF9O-3C3QB-766FS-YTHFS 注册, 自动填写激活通过 https://2df9o-3c3qb-766fs-ythfs.glados.space , 自动填写激活直接注册GLaDOS(注册地址在 https://github.com/glados-network/GLaDOS 实时更新)成功后输入邀请码:2DF9O-3C3QB-766FS-YTHFS 激活

更换ssl证书报错
type: item
date: 2023-07-19T23:11:00+00:00
description: 1.背景又到了一年一度的ssl证书替换的时间了, 这次替换证书并没有和往常一样预期的那么丝滑， 这不刚替换了非生产环境的证书业务就开始反馈报错了， 自此期间也度娘和谷歌了一番,有说改java代码的、有说证书问题的、有说服务器问题的 各抒己见 下面贴下报错信息， 给有和我一样的童鞋做个借鉴 2. 报错信息org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://labelservice-dev.wangmanyuan.com/rest/label/condition": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:674) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:415) at com.tal.file.business.client.LabelRestClient.condition(LabelRestClient.java:51) at com.tal.file.core.common.utils.CoursewareUtil.copyLabel(CoursewareUtil.java:2778) at com.tal.file.business.service.impl.CoursewareServiceImpl.packageOnCopy(CoursewareServiceImpl.java:1122) at com.tal.file.business.service.impl.CoursewareServiceImpl.copyCommon(CoursewareServiceImpl.java:329) at com.tal.file.business.service.impl.CoursewareServiceImpl.copyAsync(CoursewareServiceImpl.java:258) at com.tal.file.business.service.impl.CoursewareServiceImpl$$FastClassBySpringCGLIB$$b182efe0.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 3.思考证书报错的原因清晰可见他们的牌子和加密算法是一样的 可是切换过去就报错 3.1证书解析过程3.2 HTTPS在传输的过程中会涉及到三个密钥：服务器端的公钥和私钥，用来进行非对称加密 客户端生成的随机密钥，用来进行对称加密 一个HTTPS请求实际上包含了两次HTTP传输，可以细分为8步 客户端发起HTTPS请求用户在浏览器里输入一个https网址，然后连接到server的443端口。 服务端的配置采用HTTPS协议的服务器必须要有一套数字证书，可以自己制作，也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过，才可以继续访问，而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解，可以想象成一把钥匙和一个锁头，只是全世界只有…

clickhouse 系统表日志清理
type: item
date: 2023-02-17T01:13:01+00:00
description: 今天出现了生产环境clickhouse 清理业务表数据磁盘并未下降的问题 搜索相关文档后得知system表内会继续各种操作日志 一、查询各个表占用空间信息select concat(database, '.', table) as table, formatReadableSize(sum(bytes)) as size, sum(rows) as rows, max(modification_time) as latest_modification, sum(bytes) as bytes_size, any(engine) as engine, formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size from system.parts where active group by database, table order by bytes_size desc limit 10; 二、清理system 系统自带的日志表数据2.1 根据指定数据库清理SQLalter table system.query_thread_log delete where current_database ='xxx' ; 2.2 根据指定数据库和时间清理SQLalter table system.query_thread_log delete where current_database ='xxx' and event_date='2023-02-05';

商品分类
type: item
date: 2022-10-28T23:15:01+00:00
description: A.新建分支goods_cate新建分支goods_cate并推送到码云git checkout -b goods_categit push -u origin goods_cateB.创建子级路由创建categories子级路由组件并设置路由规则import Cate from './components/goods/Cate.vue' path: '/home', component: Home, redirect: '/welcome', children: [ { path: "/welcome", component: Welcome }, { path: "/users", component: Users }, { path: "/rights", component: Rights }, { path: "/roles", component: Roles }, { path: "/categories", component: Cate } ] C.添加组件基本布局在Cate.vue组件中添加面包屑导航以及卡片视图中的添加分类按钮 商品分类 <el-breadcrumb separator="/"> <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item> <el-breadcrumb-item>商品管理</el-breadcrumb-item> <el-breadcrumb-item>商品分类</el-breadcrumb-item> </el-breadcrumb> <el-card> <el-row> <el-col> <el-button type="primary">添加分类</el-button> </el-col> </el-row> </el-card> D.请求分类数据请求分类数据并将数据保存在data中 E.使用插件展示数据使用第三方插件vue-table-with-tree-grid展示分类数据1).在vue 控制台中点击依赖->安装依赖->运行依赖->输入vue-table-with-tree-gird->点击安装2).打开main.js，导入vue-table-with-tree-gridimport TreeTable from 'vue-table-with-tree-grid'.....Vue.config.productionTip = false//全局注册组件 Vue.component('tree-table', TreeTable) 3).使用组件展示分类数据 <tree-table :data="cateList" :columns="columns" :selection-type="false" :expand-type="false" show-index index-text="#" border :show-row-hover="false"> </tree-table> 在数据中添加columns: columns: [ {label:'分类名称',prop:'cat_name'} ] F.自定义数据列使用vue-table-with-tree-grid定义模板列并添加自定义列//先在columns中添加一个列 columns: [ {label:'分类名称',prop:'cat_name'}, //type:'template'(将该列设置为模板列)，template:'isok'(设置该列模板的名称为isok) {label:'是否有效',prop:'',type:'template',template:'isok'}, {label:'排序',prop:'',type:'template',template:'order'}, {label:'操作',prop:'',type:'template',template:'opt'} ] <el-tag size="mini" v-if="scope.row.cat_level===0">一级</el-tag> <el-tag size="mini" type="success" v-else-if="scope.row.cat_level===1">二级</el-tag> <el-tag size="mini" type="warning" v-else>三级</el-tag> <el-button size="mini" type="primary" icon="el-icon-edit">编辑</el-button> <el-button size="mini" type="danger" icon="el-icon-d…

Ansible--Ansible之Roles
type: item
date: 2022-10-26T01:04:00+00:00
description: Ansible之RolesRoles介绍ansible自1.2版本引入的新特性，用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。简单来讲，roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中，并可以便捷的include它们的一种机制。角色一般用于基于主机构建服务的场景中，但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。Roles目录结构各目录含义解释roles: <--所有的角色必须放在roles目录下，这个目录可以自定义位置，默认的位置在/etc/ansible/roles project: <---具体的角色项目名称，比如nginx、tomcat、php files： <--用来存放由copy模块或script模块调用的文件。 templates： <--用来存放jinjia2模板，template模块会自动在此目录中寻找jinjia2模板文件。 tasks： <--此目录应当包含一个main.yml文件，用于定义此角色的任务列表，此文件可以使用include包含其它的位于此目录的task文件。 main.yml handlers： <--此目录应当包含一个main.yml文件，用于定义此角色中触发条件时执行的动作。 main.yml vars： <--此目录应当包含一个main.yml文件，用于定义此角色用到的变量。 main.yml defaults： <--此目录应当包含一个main.yml文件，用于为当前角色设定默认变量。 main.yml meta： <--此目录应当包含一个main.yml文件，用于定义此角色的特殊设定及其依赖关系。 main.yml Roles示例通过ansible roles安装配置httpd服务，此处的roles使用默认的路径/etc/ansible/roles1）创建目录[root@ansible ~]# cd /etc/ansible/roles/ # 创建需要用到的目录 [root@ansible roles]# mkdir -p httpd/{handlers,tasks,templates,vars} [root@ansible roles]# cd httpd/ [root@ansible httpd]# tree . . ├── handlers ├── tasks ├── templates └── vars 4 directories, 0 file 2）变量文件准备vars/main.yml[root@ansible httpd]# vim vars/main.yml PORT: 8088 #指定httpd监听的端口 USERNAME: www #指定httpd运行用户 GROUPNAME: www #指定httpd运行组 3）配置文件模板准备templates/httpd.conf.j2# copy一个本地的配置文件放在templates/下并已j2为后缀 [root@ansible httpd]# cp /etc/httpd/conf/httpd.conf templates/httpd.conf.j2 # 进行一些修改，调用上面定义的变量 [root@ansible httpd]# vim templates/httpd.conf.j2 Listen {{ PORT }} User {{ USERNAME }} Group {{ GROUPNAME }} 4）任务剧本编写，创建用户、创建组、安装软件、配置、启动等# 创建组的task [root@ansible httpd]# vim tasks/group.yml - name: Create a Startup Group group: name=www gid=60 system=yes # 创建用户的task [root@ansible httpd]# vim tasks/user.yml - name: Create Startup Users user: name=www uid=60 system=yes shell=/sbin/nologin # 安装软件的task [root@ansible httpd]# vim tasks/install.yml - name: Install Package Httpd yum: name=httpd state=installed # 配置软件的task [root@ansible httpd]# vim tasks/config.yml - name: Copy H…

Ansible--Module
type: item
date: 2022-10-26T00:48:00+00:00
description: Ansible Ad-hoc模式常用模块ansible-doc 常用命令# ansible-doc -h Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin] -j 以json格式显示所有模块信息 -l 列出所有的模块 -s 查看模块常用参数 # 直接跟模块名，显示模块所有信息 [root@ansible ~]# ansible-doc -j [root@ansible ~]# ansible-doc -l [root@ansible ~]# ansible-doc -l |wc -l #统计所有模块个数，ansible2.8共计2834个模块 2834 命令相关的模块commandansible默认的模块,执行命令，注意：shell中的"<", ">", "|", ";", "&","$"等特殊字符不能在command模块中使用，如果需要使用，则用shell模块# 查看模块参数 [root@ansible ~]# ansible-doc -s command # 在192.168.1.31服务器上面执行ls命令，默认是在当前用户的家目录/root [root@ansible ~]# ansible 192.168.1.31 -a 'ls' # chdir 先切换工作目录，再执行后面的命令，一般情况下在编译时候使用 [root@ansible ~]# ansible 192.168.1.31 -a 'chdir=/tmp pwd' 192.168.1.31 | CHANGED | rc=0 >> /tmp # creates 如果creates的文件存在，则执行后面的操作 [root@ansible ~]# ansible 192.168.1.31 -a 'creates=/tmp ls /etc/passwd' #tmp目录存在，则不执行后面的ls命令 192.168.1.31 | SUCCESS | rc=0 >> skipped, since /tmp exists [root@ansible ~]# ansible 192.168.1.31 -a 'creates=/tmp11 ls /etc/passwd' # tmp11文件不存在，则执行后面的ls命令 192.168.1.31 | CHANGED | rc=0 >> /etc/passwd # removes 和creates相反，如果removes的文件存在，才执行后面的操作 [root@ansible ~]# ansible 192.168.1.31 -a 'removes=/tmp ls /etc/passwd' #tmp文件存在，则执行了后面的ls命令 192.168.1.31 | CHANGED | rc=0 >> /etc/passwd [root@ansible ~]# ansible 192.168.1.31 -a 'removes=/tmp11 ls /etc/passwd' #tmp11文件不存在，则没有执行后面的ls命令 192.168.1.31 | SUCCESS | rc=0 >> skipped, since /tmp11 does not exist shell专门用来执行shell命令的模块，和command模块一样，参数基本一样，都有chdir,creates,removes等参数# 查看模块参数 [root@ansible ~]# ansible-doc -s shell [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'mkdir /tmp/test' [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp' #执行下面这条命令，每次执行都会更新文件的时间戳 [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'cd /tmp/test && touch 1.txt && ls' 192.168.1.31 | CHANGED | rc=0 >> 1.txt # 由于有时候不想更新文件的创建时间戳，则如果存在就不执行creates [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'creates=/tmp/test/1.txt cd /tmp/test && touch 1.txt && ls' 192.168.1.31 | SUCCESS | rc=0 >> skipped, since /tmp/test/1.txt exi…

Ansible--快速入门
type: item
date: 2022-10-26T00:48:00+00:00
description: Ansible快速入门介绍Ansible是一款简单的运维自动化工具，只需要使用ssh协议连接就可以来进行系统管理，自动化执行命令，部署等任务。Ansible的特点1、ansible不需要单独安装客户端，也不需要启动任何服务2、ansible是python中的一套完整的自动化执行任务模块3、ansible playbook 采用yaml配置，对于自动化任务执行过一目了然Ansible组成结构 Ansible是Ansible的命令工具，核心执行工具；一次性或临时执行的操作都是通过该命令执行。 Ansible Playbook任务剧本（又称任务集），编排定义Ansible任务集的配置文件，由Ansible顺序依次执行，yaml格式。 InventoryAnsible管理主机的清单，默认是/etc/ansible/hosts文件。 ModulesAnsible执行命令的功能模块，Ansible2.3版本为止，共有1039个模块。还可以自定义模块。 Plugins插件，模块功能的补充，常有连接类型插件，循环插件，变量插件，过滤插件，插件功能用的较少。 API提供给第三方程序调用的应用程序编程接口。 环境准备 IP 系统 主机名 描述 192.168.1.30 CentOS7 ansible ansible管理节点 192.168.1.31 CentOS7 linux.node01.com 被管理节点1 192.168.1.32 CentOS7 linux.node02.com 被管理节点2 192.168.1.33 CentOS7 linux.node03.com 被管理节点3 192.168.1.36 CentOS6 linux.node06.com 被管理节点6 Ansible安装1）配置epel源[root@ansible ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@ansible ~]# yum clean all [root@ansible ~]# yum makecache 2）安装ansible[root@ansible ~]# yum -y install ansible # 查看ansible版本 [root@ansible ~]# ansible --version ansible 2.8.0 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] Ansible Inventory文件Inventory文件通常用于定义要管理的主机的认证信息，例如ssh登录用户名、密码以及key相关信息。可以同时操作一个组的多台主机，组与主机组之间的关系都是通过inventory文件配置。配置文件路径为：/etc/ansible/hosts基于密码连接[root@ansible ~]# vim /etc/ansible/hosts # 方法一 主机+端口+密码 [webserver] 192.168.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.32 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.33 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" 192.168.1.36 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" # 方法二 主机+端口+密码 [webserver] 192.168.1.3[1:3] ansible_ssh_user=root ansible…

Ansible--Ansible之Playbook
type: item
date: 2022-10-25T22:56:00+00:00
description: Tags: ansibleURL: https://www.cnblogs.com/yanjieli/p/10969299.htmlAnsible之PlaybookPlaybook介绍Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式，类似与saltstack的state状态文件。ad-hoc无法持久使用，playbook可以持久使用。playbook是由一个或多个play组成的列表，play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲，所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中，即可以让它们联合起来按事先编排的机制完成某一任务Playbook核心元素 Hosts 执行的远程主机列表 Tasks 任务集 Varniables 内置变量或自定义变量在playbook中调用 Templates 模板，即使用模板语法的文件，比如配置文件等 Handlers 和notity结合使用，由特定条件触发的操作，满足条件方才执行，否则不执行 tags 标签，指定某条任务执行，用于选择运行playbook中的部分代码。 Playbook语法playbook使用yaml语法格式，后缀可以是yaml,也可以是yml。 在单一一个playbook文件中，可以连续三个连子号(--)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾，也可省略。 次行开始正常写playbook的内容，一般都会写上描述该playbook的功能。 使用#号注释代码。 缩进必须统一，不能空格和tab混用。 缩进的级别也必须是一致的，同样的缩进代表同样的级别，程序判别配置的级别是通过缩进结合换行实现的。 YAML文件内容和Linux系统大小写判断方式保持一致，是区分大小写的，k/v的值均需大小写敏感 k/v的值可同行写也可以换行写。同行使用:分隔。 v可以是个字符串，也可以是一个列表 一个完整的代码块功能需要最少元素包括 name: task 一个简单的示例# 创建playbook文件 [root@ansible ~]# cat playbook01.yml --- #固定格式 - hosts: 192.168.1.31 #定义需要执行主机 remote_user: root #远程用户 vars: #定义变量 http_port: 8088 #变量 tasks: #定义一个任务的开始 - name: create new file #定义任务的名称 file: name=/tmp/playtest.txt state=touch #调用模块，具体要做的事情 - name: create new user user: name=test02 system=yes shell=/sbin/nologin - name: install package yum: name=httpd - name: config httpd template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf notify: #定义执行一个动作(action)让handlers来引用执行，与handlers配合使用 - restart apache #notify要执行的动作，这里必须与handlers中的name定义内容一致 - name: copy index.html copy: src=/var/www/html/index.html dest=/var/www/html/index.html - name: start httpd service: name=httpd state=started handlers: #处理器：更加tasks中notify定义的action触发执行相应的处理动作 - name: restart apache #要与notify定义的内容相同 service: name=httpd state=restarted #触发要执行的动作 #测试页面准备 [root@ansible ~]# echo " playbook test file " >>/var/www/html/index.html #配置文件准备 [root@ansible ~]# cat httpd.conf |grep ^Listen Listen {{ http_port }} #执行playbook， 第一次执行可以加-C选项，检查写的playbook是否ok [root@ansible ~]# ansible-playbook playbook01.yml PLAY [192.…