Ansible自动化工具之Playbook剧本编写

目录

Playbook的组成部分

实例模版

切换用户

指定声明用户

声明和引用变量,以及外部传参变量

playbook的条件判断

​编辑

习题

​编辑

ansible-playbook的循环

item的循环

​编辑

list循环

​编辑

together的循环(列表对应的列,数据结合的方式循环)

​编辑

nested循环

Templates模块

实验httpd

yml文件

实验nginx

tags模块

任务标签的种类

任务标签

自定义标签

实验

Role模块

roles结构

实验


Playbook的组成部分

1、task 任务:包含要在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用

2、variables 变量:存储和传递数据,变量可以自定义,可以在Playbook当中定义为全局变量,也可以外部传参

3、Templates 模版:用于生成配置文件,模版是包含占位符的文件,占位符由Ansible在执行时转化为变量值

4、handler 处理器:当需要有变更的时候,可以执行触发器

5、Roles 角色:是一种组织和封装Playbook的,允许把相关的任务,变量,模版和处理器组成一个可复用的单元

实例模版
vim test.yml
#this is our first playbook
- name: first play
#一个name就是一个任务名,名字可以不写gather_facts: false
#是否收集目标主机的系统信息,false就是不收集hosts: 20.0.0.11
#执行的目标主机remote_user: root
#在目标主机执行的用户tasks:- name: ping testping:- name: close selinuxcommand: '/sbin/setenforce 0'ignore_errors: True- name: close firewalldservice: name=firewalld state=stopped- name: install httpdyum: name=httpd- name: start httpdservice: enabled=true name=httpd state=started- name: editon index.htmlshell: echo "this is httpd" > /var/www/html/index.htmlnotify: restart httpdhandlers:- name: restart httpdservice: name=httpd state=restarted#检查yaml文件的语法是否错误
ansible-playbook 文件名 --syntax-check 
#查看yml文件里面有几个任务
ansible-playbook  文件名 --list-task
#检查生效的目标主机
ansible-playbook  文件名 --list-hosts
#运行命令 
ansible-playbook 文件名ansible-playbook 文件名 --start-at-task='install httpd'
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
切换用户
关闭免密
vim /etc/ansible/ansible.cfg
71行
注释掉编写脚本
hosts: 20.0.0.11
#执行的目标主机
remote_user: xiaobu
become: yes
become_user: root
指定声明用户
在脚本里不声明用户,运行时,声明用户
ansible-playbook 脚本 -u root -k
声明和引用变量,以及外部传参变量
vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.11remote_user: rootvars:groupname: xiaobu1username: xiaokai
#字典方式: key-value
#vars:
#-
#-
#列表listtasks:- name: create groupgroup:name: "{{ groupname }}"system: yesgid: 111- name: create useruser:name: "{{ username }}"uid: 1011group: "{{groupname}}"shell: /sbin/nologin- name: copy filecopy:content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
#获取目标主机的IP地址,然后复制到目标文件
# 包含所有主机变量的字典
#inventory_hostname	目标主机名
#ansible_default_ipv4	获取目标主机名
#['ansible_default_ipv4']['address']	索引dest: /opt/test.txt

外部传参变量

vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.12remote_user: roottasks:- name: create groupgroup:name: "{{ groupname }}"system: yesgid: 111- name: create useruser:name: "{{ username }}"uid: 1011group: "{{groupname}}"shell: /sbin/nologin- name: copy filecopy:content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"dest: /opt/test.txt外部传参
ansible-playbook test1.yml -e 'username=xiaobu2 groupname=xiaokai1'
playbook的条件判断

when 是一个比较常见的应用长江,实现满足条件即执行,不满足条件即跳过的任务,when是满足条件即执行,不满足不执行。

vim test2.yml
#this is when test
- hosts: all
#可以用主机的IP地址,也可以是用组名,也可以用allremote_user: roottasks:- name: test whendebug:msg: '位置判断'
#打印相当于echo msg: 输出的内容,debug: 用于脚本的调试,在正式脚本中可以去除when: ansible_default_ipv4.address == '20.0.0.11'
#when: ansible_default_ipv4.address == '20.0.0.11'或者 when: inventory_hostname != '20.0.0.11'
#ansible_default_ipv4.address != '20.0.0.11' 取反
习题

现在hosts all

条件1 IP 11:安装nginx

条件2 IP 12:安装httpd

#this is when test
- hosts: allremote_user: roottasks:- name: nginxyum: name=nginxwhen:  ansible_default_ipv4.address == '20.0.0.11'- name: nginx infodebug:msg: '安装nginx'when:  ansible_default_ipv4.address == '20.0.0.11'- name: httpdyum: name=httpdwhen: ansible_default_ipv4.address == '20.0.0.12'- name: httpd infodebug:msg: '安装httpd'when: ansible_default_ipv4.address == '20.0.0.12'
ansible-playbook的循环

ansible有多种循环格式,with_items 循环遍历

item的循环

声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d

vim test4.yml
- hosts: 20.0.0.12remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_items: - [a,b,c,d]- [1,2,3,4]
#声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d
#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历
list循环

列别分组循环

#分组打印with_list: - [a,b,c,d]- [1,2,3,4]- hosts: 20.0.0.12remote_user: rootgather_facts: falsetasks:- name: create filefile:path: "{{ item }}"state: touchwith_items:- /opt/a- /opt/b- /opt/c- /opt/d- /opt/1- /opt/2- /opt/3- /opt/4
together的循环(列表对应的列,数据结合的方式循环)

组循环,列表当中的值一一对应打印出来

- hosts: 20.0.0.12remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_together:- [a,b,c,d]- [1,2,3,4]- [A,B,C]
nested循环

相当于双循环,第一层定义循环的次数,第二层表示第一层的每一个元素会循环几次

列表里面的元素定义了循环的次数,第二层列表,相当于内循环

- hosts: 20.0.0.12remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_nested:- [a,b,c,d]- [1,2,3,4]

Templates模块

Jinja模版架构,通过模版可以实现向模版文件传参(Python转义),把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要配置文件当中

实验httpd
yum -y install httpd
cd /etc/httpd/conf
cp httpd.conf /opt/httpd.conf.j2
httpd.conf.j2 在文件当中配置的是占位符(声明的变量)
/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)
playbook当中,Template模块来吧参数传给目标的主机的配置文件
vim  /opt/httpd.conf.j2
42行
Listen {{http_port}}
95行
ServerName {{server_name}}
119行
DocumentRoot "{{root_dir}}"修改ansible配置文件
20.0.0.11 http_port=20.0.0.11:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs20.0.0.12 http_port=20.0.0.12:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs

yml文件
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpdyum: name={{package}}- name: install config filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root_dirfile:path: /etc/httpd/htdocsstate: directory- name: start httpdservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted

实验nginx
cp  /etc/nginx/nginx.conf /opt/nginx.conf.j2修改nginx.的配置文件server {listen       {{nginx_port}};server_name  {{servername}};root         {{root_dir}};
}修改ansible的配置文件
20.0.0.11 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/html20.0.0.12 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/htmlyml文件- hosts: allremote_user: rootvars:- package: nginx- service: nginxtasks:- name: install nginxyum: name={{package}}- name: install config filetemplate: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.confnotify:- restart nginx- name: create root_dirfile:path: /etc/nginx/htmlstate: directory- name: start nginxservice: name={{service}} enabled=true state=startedhandlers:- name: restart nginxservice: name={{service}} state=restarted

tags模块

标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook是可以通过指定任务标签,来实现只运行设定的标任务

任务标签的种类

always 不管你是否指定了运行标签,任务都会执行

never 即使运行了指定标签,该任务也不会执行

debug 调试任务

任务标签
- hosts: allremote_user: rootgather_facts: falsetasks:- name: tag debugdebug:msg: "this is test1"tags:- debug- name: tag setupsetup:tags:- setup- name: tag alwaysdebug:msg: "run"tags:- always- name: tag neverdebug:msg: "never run"tags:- never

自定义标签

per_tasks 指定标签之前的任务

post_tasks 运行指定标签之后的任务

- hosts: allremote_user: rootgather_facts: falsetasks:- name: tag alwaysdebug:msg: "run"tags:- xiaobu- name: tag neverdebug:msg: "never run"tags:- xiaokai
实验

1、在目标主机上touch xiaobu.txt always

2、在目标主机复制文件opt/xiaobu2.txt 标签never

实验目的

第一运行playbook 不指定标签查看文件生成情况

指定标签为never,查看文件生成情况

- hosts: allremote_user: rootgather_facts: falsetasks:- name: touch filefile:path: /opt/xiaobu.txtstate: touchtags:- always- name: copy filecopy:src: /opt/123dest: /opt/123tags:- never
Role模块

Role模块又叫角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次结构,自动装载变量文件,task,以及handler等等

Roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用roles模块来一键调用这些文件

roles结构

--- web---总目录,角色

files 存放copy和script模块调用的文件

Templates 存放j2的模块文件

tasks 包含任务的目录 ---- mail.yml 角色运行的任务

handlers 包含处理器的目录 ---- main.yml

vars 存放变量的目录 ----main.yml

defaults 包含默认变量的目录 -----main.yml

meta 包含元信息的目录----main.yml

在总目录下site.yml,用来调用所有配置文件

实验
三个服务
http	mysql	php
#安排剧本
cd /etc/ansible/roles/
mkdir httpd mysql php
cd httpd
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd mysql
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd php
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml配置httpd
vim tasks/main.yml
- name: install httpdyum: name={{pkg}}
- name: start httpdservice: enabled=true name={{svc}} state=startedvim httpd/vars/main.yml
pkg: httpd
svc: httpd配置mysql
vim mysql/tasks/main.yml
- name: isntall mysqlyum: name={{pkg}}
- name: start mysqlservice: enabled=true name={{svc}} state=startedvim mysql/vars/main.yml
pkg:- mariadb- mariadb-server
svc: mariadb配置php
vim php/tasks/main.yml
- name: install phpyum: name={{pkg}}
- name: start phpservice: enabled=true name={{svc}} state=startedvim php/vars/main.yml
pkg: - php- php-fpm
svc: php-fpm

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

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

相关文章

【蓝桥杯一对一保奖辅导】国奖学姐蓝桥杯经验分享

目录 写在前面有关报名费如何准备?看书 /练习 /分类 /总结比赛技巧与指导 写在前面 蓝桥杯对于计算机专业相关的同学来说是非常值得参加的。 蓝桥杯相对于ACM比赛而言获奖难度较小,只要掌握技巧,拿到 省一甚至国奖是比较容易的,但…

Qt前端技术:3.QSS字体样式

small-caps就是让这个文本中的小写字母用大写的形式写出来并且在用大写的形式表达出来后他本身的大小会变小 有绝对尺寸和相对尺寸的区别 绝对尺寸一般是cm,英寸之类的 相对尺寸如px之类的是由显示器的屏幕分辨率来决定的 如windows用户分辨率一般是96像素点每英…

网络安全事件频发现状

近日,腾讯视频、菜鸟、滴滴等App崩溃的消息登上热搜,引发不少网友热议。今年以来,已有多起App崩溃事件发生,甚至有企业因此业绩损失超亿元。互联网应用的系统安全和稳定性建设越来越被社会广泛关注。 12月3日晚,有网友…

【力扣100】543.二叉树的直径

添加链接描述 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def __init__(self):self.max 0def diamete…

uniapp整合echarts(目前性能最优、渲染最快方案)

本文echarts示例如上图,可扫码体验渲染速度及loading效果,下文附带本小程序uniapp相关代码 实现代码 <template><view class="source

【python】在线代码混淆方案及注意事项

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 在线网站pyob混淆操作步骤编写测试代码混淆转pyc缺点中文路径问题&#xff1a;python: Cant reopen .pyc file 2️⃣ 反编译python文件格式对比uncompyle6 3️⃣ 其它方案cpythonpython-obfuscatorPyInstaller【不推荐】pyminifie…

数字人解决方案——ER-NeRF实时对话数字人模型推理部署带UI交互界面

简介 这个是一个使用ER-NeRF来实现实时对话数字人、口播数字人的整体架构&#xff0c;其中包括了大语言回答模型、语音合成、成生视频流、背景替换等功能&#xff0c;项目对显存的要求很高&#xff0c;想要达到实时推理的效果&#xff0c;建议显存在24G以上。 实时对话数字人 …

众和策略:大盘涨手中的股票却大跌,到底怎么回事?

大盘涨手中的股票却大跌&#xff0c;究竟怎么回事&#xff1a; 1、大盘上涨是权重股所造成的 大盘上涨可能是受一些权重比较大的工作所影响&#xff0c;比如证券工作、钢铁工作、银行工作等等&#xff0c;这些工作的大涨&#xff0c;可以拉升大盘的上涨&#xff0c;可是其它工…

本地配置Java支付宝沙箱环境模拟支付并内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023待补)

文章目录 BeginningAbstract挑战方法成果 Introduction引出问题早期的work及存在的问题近期的work及存在的问题our workContribution Related Work&#xff08;paper for me&#xff09;Oriented Object DetectionPrior for Oriented ObjectsLabel Assignment Tiny Object Dete…

Opencv 入门三(视频滑动条窗口)

视频滑动条窗口源码如下&#xff1a; #include "opencv2\highgui\highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <fstream> using namespace std; int g_slider_position 0; // 滑动条的位置 …

uniapp uview1.0 页面多个upload上传、回显之后处理数据

<view class"img-title w-s-color-3 f-28 row">商品图片</view><u-upload ref"images" :header"header" :file-list"fileListImages" :action"action" name"iFile" icon-name"camera"u…

论文学习——泰森多边形法在小流域面雨量计算中的应用

文章目录 0 摘要00 引言1 研究区域概况2 泰森多边形的建立3 流域多年面降雨量分析4 典型降雨场次面雨量分析5 典型降雨日面雨量分析6 结论7 个人总结0 摘要 研究泰森多边形算法,在小流域面雨量计算中的适用性。选取3种不同降雨量实例,流域多年面降雨量、典型场次、典型日面雨…

108基于matlab的使用模拟退火 (SA) 求解并行机器调度的程序

基于matlab的使用模拟退火 &#xff08;SA&#xff09; 求解并行机器调度的程序&#xff0c;程序已调通&#xff0c;可直接运行。 108 matlab模拟退火 &#xff08;SA) (xiaohongshu.com)

如何使用支付宝的沙箱环境在本地配置模拟支付并发布至公网测试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

Redis一些常用的技术

文章目录 第1关&#xff1a;Redis 事务与锁机制第2关&#xff1a;流水线第3关&#xff1a;发布订阅第4关&#xff1a;超时命令第5关&#xff1a;使用Lua语言 第1关&#xff1a;Redis 事务与锁机制 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End补充代码&#xff0c;根据…

MySQL是如何保证数据不丢失的?

文章目录 前言Buffer Pool 和 DML 的关系DML操作流程加载数据页更新记录 数据持久化方案合适的时机刷盘双写机制日志先行机制日志刷盘机制Redo Log 恢复数据 总结 前言 上篇文章《InnoDB在SQL查询中的关键功能和优化策略》对InnoDB的查询操作和优化事项进行了说明。但是&#…

【MyBatis学习笔记】MyBatis基础学习

MyBatis基础 MyBatis简介MyBatis特性MyBatis下载和其他持久化层技术对比 核心配置文件详解默认的类型别名 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 MyBatis获取参数值的两种方式&am…

【无人机学习篇】构建mavros机载电脑连接,从机载电脑获取pixhawk数据

&#xff08;本文基于的pixhawk版本&#xff1a;6X minibase V2.2 &#xff0c;固件&#xff1a;apm&#xff09; 整个的步骤&#xff08;baseline&#xff09;&#xff1a; 具体的每一步都可以在网上查到教程&#xff0c;这里只是梳理出一个流程。并且ubantu与ros的版本也不是…

Java开发框架和中间件面试题(2)

8.说说自己对Spring MVC的了解&#xff1f; MVC是一种设计模式&#xff0c;Spring MVC是一款很优秀的MVC框架。Spring MVC可以帮助我们进行更简洁的Web层开发&#xff0c;并且它天生与Spring框架集成。SpringMVC下我们一般把后端项目分为Service&#xff08;处理业务&#xff0…