Ansible的脚本---Playbook剧本编写

playbook的组成部分

1、 tasks:任务

在目标主机上需要执行的操作。使用模块定义这些操作。每个任务都是一个模块的调用。

2、 variables:变量

用于存储和传递数据。类似于shell脚本中的变量。变量可以自定义。可以在playbook当中定义为全局变量,也可以外部传参。类似于shell脚本中的位置变量

3、 Templates:模板

用于生成配置文件。模板是包含占位符的文件。占位符由ansible在执行时转化为变量值。

4、 handlers:处理器

当需要有变更的时候,可以执行触发器。

5、 Roles:角色

类似于dockercompose。是一种组织和封装playbook的。允许把相关的任务、变量、模板和处理器组织成一个可复用的单元。

实例模板1:

vim test1.yml
#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名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
#state=latest:声明服务的版本。可以不加- name: start httpdservice: enabled=true name=httpd state=started- name: editon index.html
#修改httpd服务的默认的访问页面shell: echo "this is httpd" > /var/www/html/index.htmlnotify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务handlers:- name: restart httpdservice: name=httpd state=restarted

 检查yml文件的语法是否正确

ansible-playbook test1.yml --syntax-check
#检查yml文件的语法是否正确

检查有多少任务

ansible-playbook test.yaml --list-task

检查有多少主机生效

ansible-playbook test1.yml --list-hosts
#检查生效的目标主机

指定剧本

ansible-playbook test1.yml --start-at-task='install httpd'
#指定剧本从哪个任务开始执行

切换用户:

#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名remote_user: zyg
#在目标主机执行的用户become:yesbecome_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
#state=latest:声明服务的版本。可以不加- name: start httpdservice: enabled=true name=httpd state=started- name: editon index.html
#修改httpd服务的默认的访问页面shell: echo "this is httpd" > /var/www/html/index.htmlnotify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务handlers:- name: restart httpdservice: name=httpd state=restartedbecome:yes
become_user:root
vim /etc/ansible/ansible.cfg
取消17行的注释
ansible-play test1.yml -K
#表示输入密码
#-K:内部声明更改用户,使用-K

指定用户操作

ansible-playbook test1.yml -u root -k
#如果没有声明更改用户,可以在外部指定用户
#-u:指定用户
#-k:手动输入密码

实例模板2:

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

#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.20remote_user: rootvars:groupname: zygusername: hmbbtasks:- name: create groupgroup:name: "{{ groupname }}"
#引用前面设定好的groupnamesystem: yesgid: 111- name: create useruser:name: "{{ username }}"uid: 1011group: "{{ groupname }}"shell: /sbin/nologin- name: copy filecopy:content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['adress']}}"dest: /opt/bqb.txt

字典方式:

  vars:groupname: zygusername: hmbb

使用的是key-value的方式

使用符号-开头表示这是一个列表

表示包含所有主机变量的字典

 "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['adress'] }}"#表示包含所有主机变量的字典#inventory_hostname:目标主机的主机名#['ansible_default_ipv4']['adress']:获取目标主机名#表示获取目标主机的IP地址复制到目标文件里

外部传参

ansible-playbook test2.yml -e 'username=yst groupname=ymr'
#外部传参

playbook的条件判断

when:比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

#this is when test
- hosts: all
#可以用主机的IP地址也可以使用组名remote_user: roottasks:- name: test whendebug:msg: '位置判断'
#相当于shell脚本中的echo。满足条件就会打印。不满足则不打印
#msg:表示输出的内容when: ansible_default_ipv4.address == '20.0.0.30'

playbook当中的循环

ansible有多种循环格式。with_items:循环遍历

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

分组打印列表

- hosts: 20.0.0.30remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_list:- [a,b,c,d]- [1,2,3,4]
#with_list:分组打印

遍历循环在主机上创建目录

- hosts: 20.0.0.30remote_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]方法2:
- hosts: 20.0.0.30remote_user: rootgather_facts: falsetasks:- name: create filefile:path: "{{ item }}"state: touchwith_list:- /opt/a- /opt/b- /opt/c- /opt/d- /opt/1- /opt/2- /opt/3- /opt/4

同一列的数据组合输出

- hosts: 20.0.0.30remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_together:- [a,b,c,d]- [1,2,3,4]
#with_together:组循环,列表当中的值一一对应,打印出来。
#适用于组合搭配

根据列表数据循环匹配

- hosts: 20.0.0.30remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_nested:- [a,b,c,d]- [1,2,3,4]#第一层:列表里面的元素定义了循环的次数
#第二层:相当于内循环

四种循环方式:

with_items
#最常用
with_list
#列表分组循环
with_together
#列表对应的列,数据结合的方式循环
with_nested
#相当于双重循环,第一层定义了循环次数,第二层表示第一层的每个元素会循环几次#这些都是单循环

Tenplates模块

jinja模板架构,通过模板可以实现向模块文件传参(python转义),把占位符参数传到配置文件中去。

jinja的作用:生成一个目标文本文件,传递变量到需要配置文件当中。

实验架构

vim /etc/httpd/conf/httpd.conf
#配置占位符。可以理解为声明的变量
vim /etc/ansible/hosts
#配置主机的占位符名称和j2文件中的占位符一致。可以理解为定义参数:占位符的参数声明好
vim /opt/httpd.yml
#在playbook当中,使用template模块来把参数传给目标主机的配置文件。
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpdyum: name={{package}}- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf
#使用template的模板notify:- 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}} starte=restarted
#通过占位符,和python的转义复制到目标文件中

1、 先配置占位符。可以理解为声明的变量 2、 再配置主机的占位符名称和j2文件中的占位符一致。可以理解为定义参数:占位符的参数声明好 3、 最后在playbook当中,使用template模块来把参数传给目标主机的配置文件。

外部传参远程修改nginx的配置文件

- hosts: allremote_user: rootvars:- package: nginx- service: nginxtasks:- name: install nginxyum: name={{package}}- name: install configure filetemplate: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.confnotify:- restart nginx- name: create root_dirfile:path: /opt/nginx/html/state: directory- name: start nginxservice: name={{service}} enabled=true state=startedhandlers:- name: restart nginxservice: name={{service}} state=restarted

tags模块

标签模块:可以在playbook当中为任务设定标签。我们在运行playbook时可以通过指定任务标签,来实现只允许设定的标签任务。

-nametags:debug:--tags debug--start-at-task='wdf'

任务标签的种类

always:不管你是否制定了允许标签,任务都会执行。

never:不管是否运行了指定标签,该任务也不会执行。

debug:调试任务

setup:手机主机信息

还可以自定义标签

per_tasks:指定标签之前的任务

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

- hosts: allremote_user: roottasks:- name: tag debugdebug:msg: "this is demo1"tags:- debug
#声明项目的名称- name: tag setupsetup:tags:- setup- name: tag alwaysdebug:msg: "run"tags:- always- name: tag neverdebug:msg: "never run"tags:- neveransible-playbook demo1.yml --tags="debug"
#运行指定标签debug
#如果指定标签never也可以运行
#只有always是一直在运行

Roles模块

角色模块:每个主题就是一个角色

在ansible当中,层次化,结构化的组织playbook。使用了Rolse(角色)。可以更具层次结构,自动装载变量文件,task以及handlers等等

roles:分辨把变量,文件,任务,模块以及处理器,放在单独的目录当中,使用rolse模块来一键调用这些文件。类似于Dockercompose

roles的结构图:

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

子目录:

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

templates:存放j2的模板文件

tasks:包含任务的目录---子目录下---main.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 phpvim httpd/tasks/main.yml
#配置httpd
- name: install httpdyum: name={{pkg}}
- name: start httpdservice: enabled=true name={{svc}} state=startedvim httpd/vars/main.yml
#配置http服务的名称进行外部传参
pkg: httpd
svc: httpdvim mysql/tasks/main.yml
- name: install mysqlyum: name={{pkg}}
- name: start mysqlservice: enabled=true name={{svc}} state=startedvim mysql/vars/main.yml 
pkg:- mariadb- mariadb-server
svc: mariadbvim php/tasks/main.yml
- name: install phpyum: name={{pkg}}
- name: start php-fpmservice: enabled=true name={{svc}} state=startedvim php/vars/main.yml
pkg:- php- php-fpm
svc: php-fpmvim sit.yml
#定义总控制
- hosts: 20.0.0.20remote_user: rootroles:- httpd- mysql- php

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

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

相关文章

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路👉 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…

Springboot启动异常 OgnlException: sqlSelect [java.lang.NoSuchMethodError

完整的日志如下: Invocation of init method failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ew ! null and ew.sqlSelect ! null. Cause…

不忍学弟学妹受苦受难!!!逐一讲解发动机原理实验报告(1)

固体火箭发动机侵蚀燃烧测试实验 经过了愉快迷糊——哦不瑟瑟发抖——哦不痛不欲生的两天,终于和小伙伴们协力完成了西北工业大学航天学院发动机原理实验报告。具体的实验指导书均可在本人博客资源站下载。 固体火箭发动机侵蚀燃烧测试实验,嗯哼—— 实…

MySQL 事务的ACID特性

MySQL事务是什么,它就是一组数据库的操作,是访问数据库的程序单元,事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道,在MySQL 中,有不同的存储引擎,有的存储引擎比如…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue(队列)容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 (一)list构造函数 &am…

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器,用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的,使用和说明在官网描述的篇幅也比较多,对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一,而公考常识题作为公务员考试的重要组成部分,对于考生来说具有很高的分值。在这一模块的复习中,有以下几点可以帮助考生提高学习效率,一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

The Cherno C++笔记02

目录 Part 06 How the C Compiler Works 1.编译过程 2.C并不关心文件 3.翻译单元(Translation Unit) 4. 实际用代码感受一下编译过程 4.1 预处理 4.1.1 预处理的本质 4.1.2 预处理后的.i文件 4.1.3 骚操作 4.2 .asm文件(汇编语言源文…

安装nodejs,配置环境变量并将npm设置淘宝镜像源

安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包,所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下:https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…

C++ 检测 是不是 com组件 的办法 已解决

在日常开发中,遇到动态库和 com组件库的调用 无法区分。检测是否com组件的办法 在头部文件,引入文件 如果能编译成功说明是 com组件,至于动态库如何引入,还在观察中 最简单办法 regsvr32 TerraExplorerX.dll 是com 组件 regs…

LLaMA开源大模型源码分析!

Datawhale干货 作者:宋志学,Datawhale成员 花了一晚上照着transformers仓库的LLaMA源码,把张量并行和梯度保存的代码删掉,只留下模型基础结构,梳理了一遍LLaMA的模型结构。 今年四月份的时候,我第一次接触…

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好,我是二狗。 今天,有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试! 当网友询问ChatGPT API调用查询模型的确切名称是什么时? ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

自动化测试架构设计必会知识点——对核心业务进行封装复用(附Java源码)

随着UI自动化测试工具可选性越来越多,工具也越来越稳定,前几年关于自动化测试架构设计的概念逐渐淡化,但是做自动化测试最重要的两点—— PO设计模式和核心业务的封装复用大家还是必须掌握的,前面的文章我已经介绍了什么是PO设计模…

基于 Sentry 的前端监控系统搭建(Linux)

一、前言 随着技术这几年的发展与沉淀,线上数据指标监控也变得尤为重要,研发人员和运营人员需要对线上的产品指标有所感知,同时风险也需要及时暴露,很多公司开始自建监控系统,但对于一些定制化要求不是特别高的团队&a…

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览器中可以看到正常显示的页面教据,但是使用 requests 得到的结果并没有,这是因为requests 获取的都是原始的 HTML 文档…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议,可通过任何串行端口进行遥测、OSD 和传感器。这样,ArduPilot 就能将遥测数据发送到 MSP 兼容设备(如大疆护目镜),用于屏幕显示&#x…

银河麒麟v10 安装mysql 8.35

银河麒麟v10 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…