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,用来调用所有配置文件

site.yml文件

- hosts: 20.0.0.11remote_user: rootroles:- httpd- mysql- php
实验
三个服务
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.rhkb.cn/news/223089.html

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

相关文章

【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别

【Pytorch】学习记录分享5——PyTorch经典网络 ResNet 1. ResNet (残差网络)基础知识2. 感受野3. 手写体数字识别3. 0 数据集(训练与测试集)3. 1 数据加载3. 2 函数实现:3. 3 训练及其测试: 1. ResNet &…

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台,能让你展示你的SQL技能,与同行们一较高下?你是否渴望在实战中提升你的SQL水平,开阔你的技术视野?如果你对这些都感兴趣,那么本次由NineData主办的《数据库编程大赛》,将是…

IAR安装注册

IAR安装注册 一、 概述 此文记录IAR 开发工具 EWARM-CD-8321-18631 安装注册过程,以及工程编译、调试、烧录下载方法。 二、安装 安装文件: 选择安装 IAR: 一路 NEXT 遇到对话框点击 ”是” 即可安装完成, 图标如下: 三、 注册 先断开网络链接, 不能链接…

Shell编程从入门到实战

Shell 概述 (1)Linux 提供的 Shell 解析器有 [rootflinkTenxun ~]# cat /etc/shells(2)bash 和 sh 的关系 [rootflinkTenxun bin]# ll | grep bash(3)Centos 默认的解析器是 bash [rootflinkTenxun bin]…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/listener https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/filter API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 J…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈:一种特殊的线性表&…

【【迭代16次的CORDIC算法-verilog实现】】

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

十大经典排序算法(个人总结C语言版)

文章目录 一、前言二、对比1.排序算法相关概念1.1 时间复杂度1.2 空间复杂度1.3 排序方式1.4 稳定度 2.表格比较3.算法推荐3.1 小规模数据3.2 中等规模数据3.3 大规模数据3.4 特殊需求 三、排序算法1.冒泡排序(Bubble Sort)1.1 简介1.2 示例代码&#xf…

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…

C++结合OpenCV:掌握图像基础与处理

本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C 中进行图像读取、显示和基础操作。 1.图像的基本概念与术语 图像表示 在计算机视觉中,图像通常表示为一个二维或三维的数组。二维数组表示灰度图像&…

VS(Visual Studio)更改文件编码

vs默认编码是GB2312,更改为UTF-8 工具->自定义

小白实战教学:开发同城外卖跑腿APP

本文将以"小白实战教学"为主题,向大家介绍如何从零开始,开发一款简单而实用的同城外卖跑腿APP。 一、准备工作 在开始之前,我们需要做一些准备工作。首先,确保你已经安装好了开发环境,包括合适的集成开发环…

随机森林 2(决策树)

通过 随机森林 1 的介绍,相信大家对随机森林都有了一个初步的认知,知道了随机和森林分别指的是什么,以及决策树根据什么选择内部节点。本文将会从森林深入到树,去看一下决策树是如何构建的。网上很多文章都讲了决策树如何构建&…

【MySQL】MySQL的数据类型

MySQL的数据类型 一、数据类型分类二、数值类型1、整数类型2、bit类型3、小数类型 三、字符串类型四、时间日期类型五、enum和set类型enum和set查找 数据类型的作用: 决定了存储数据时应该开辟的空间大小和数据的取值范围。决定了如何识别一个特定的二进制序列。 …

pdf 在线编辑

https://smallpdf.com/edit-pdf#rapp 参考 https://zh.wikihow.com/%E5%B0%86%E5%9B%BE%E5%83%8F%E6%8F%92%E5%85%A5PDF

服务器经常死机怎么办?如何处理

关于服务器死机这一话题相信大家是不会陌生的,平时在使用服务器的过程中,或多或少都是会有遇到过。轻则耽误业务开展,重则造成数据丢失,相信每个人都不想碰到服务器死机的情况。下文我也简单的介绍下服务器死机的原因以及对应的预…

计算机网络——计算机网络的概述(一)

前言: 面对马上的期末考试,也为了以后找工作,需要掌握更多的知识,而且我们现实生活中也已经离不开计算机,更离不开计算机网络,今天开始我们就对计算机网络的知识进行一个简单的学习与记录。 目录 一、什么…

01_数据结构和算法概述

01_数据结构和算法概述 0.1 什么是数据结构?官方解释: 0.2 数据结构分类物理结构分类: 0.3 什么是算法?官方解释:大白话: 0.4 算法初体验 0.1 什么是数据结构? 官方解释: 数据结构是…

React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习

1. 收集表单数据 包含表单的组件分类 受控组件——页面中所有输入类的DOM,随着输入,把值存维护在状态里,需要用的时候去状态里取值(推荐,避免了过渡使用ref)非受控组件——页面中所有输入类的DOM,现用现取…

WEB渗透—PHP反序列化(八)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…