[Ansible实践笔记]自动化运维工具Ansible(二):Ansible的playbook及角色

Ansible playbook(剧本)

详情请参考[Ansible实践笔记]自动化运维工具Ansible(一):初探ansible&ansible的点对点模式

文章目录

    • Ansible playbook(剧本)
      • 介绍
      • 核心字段
      • 环境配置
      • 案例:配置apache虚拟主机
        • 准备配置文件
        • 准备playbook剧本
        • 利用ansible语法检查工具检查yaml文件(不加语法检查也会检查语法)
        • 执行playbook
        • 测试虚拟主机的功能
      • 案例:安装并修改nginx配置文件
        • 创建nginx文件存放目录
        • 编写nginx配置文件
        • 编写yaml文件
        • 检查playbooky语法并执行
        • 测试功能
      • 变量
      • Ansible中jinja2模板
        • 语法
        • 变量
        • 控制语句
        • 案例:批量生成hosts解析文件
          • 准备模板文件
          • 编写playbook剧本
          • 执行剧本
    • Role(角色)
      • 角色的生成(初始化自定义Role)
      • Role目录结构
      • 例:用Role安装httpd
        • 初始化角色httpd
        • 为httpd配置虚拟主机及根目录
        • 当前role目录状态
        • 到上级目录创建剧本
        • 执行剧本
        • 检验效果

介绍

  • playbook是一个task组成的列表,可以让这些列表按照事先编排的机制执行

  • task是指调用ansible的具体模块,在模块参数中可以使用变量

  • 模块的执行是幂等性的,意味着多次执行的结果相同

  • 使用yaml语言编写playbook,后缀名为.yaml

核心字段

字段含义
hosts执行的远程主机列表
tasks任务,由模块定义操作列表
variables内置变量或自定义变量
templates模板文件(一般用jinjia2语言编写)
handlers为条件触发操作,满足条件则执行(通常与nogity结合使用)
roles角色

环境配置

为了下面的实验更加直观,对ansible的主机清单进行修改

tail -n 10 -f /etc/ansible/hosts

在这里插入图片描述

我们先把之前下载安装的httpd服务卸载了

ansible -m service -a "name=httpd state=stopped" node2
ansible -m yum -a "name=httpd state=absent" node2

在这里插入图片描述

案例:配置apache虚拟主机

准备配置文件
mkdir -p /root/playbook/file # 递归创建playbook配置文件目录
cd /root/playbook/file&&touch site.conf

在这里插入图片描述

# cat site.confListen 8080
Listen 9090<Directory "/data/web">
Require all granted
</Directory><VirtualHost *:8080>
DocumentRoot "/data/web/site1/"
</VirtualHost><VirtualHost *:9090>
DocumentRoot "/data/web/site2/"
</VirtualHost>
准备playbook剧本

vim apache_playbook.yaml

- name: virtual web servershosts: node3remote_user: roottasks:- name: install httpdyum:name: httpdstate: latest- name: create dir site1file:name: /data/web/site1state: directory- name: create dir site2file:name: /data/web/site2state: directory- name: create web indexshell: echo "site1" > /data/web/site1/index.html && echo "site2" > /data/web/site2/index.html- name: create apache confcopy:src: /root/playbook/file/site.confdest: /etc/httpd/conf.d/site.conf- name: enable and start apacheservice:name: httpdenabled: yesstate: started
利用ansible语法检查工具检查yaml文件(不加语法检查也会检查语法)
ansible-playbook apache_playbook.yaml --syntax-check

在这里插入图片描述

执行playbook
ansible-playbook apache_playbook.yaml

在这里插入图片描述

报错server3不可达,检查了一下,小case,server3没开机

再来一遍发现前几个任务都是可以正常执行的

在这里插入图片描述

到了启动apache这一步就报错了在这里插入图片描述

检查后发现是没有禁用selinux

setenforce 0 # 临时禁用selinux

再执行一次

在这里插入图片描述

测试虚拟主机的功能
elinks 192.168.28.100:8080

在这里插入图片描述

elinks 192.168.28.100:9090

在这里插入图片描述

案例:安装并修改nginx配置文件

创建nginx文件存放目录
mkdir -p /root/nginx/{conf,bin}
编写nginx配置文件
vim /root/nginx/conf/site.conf
server {listen 8848;server_name localhost;location /{root /data;index index.html}
}
编写yaml文件
- name: nginx install && configurationhosts: node1remote_user: roottasks:- name: install epelyum:name: epel-release.noarchstate: latest- name: install nginxyum:name: nginxstate: present- name: ensure /data directory existsfile:path: /datastate: directorymode: '0755'- name: copy configure filecopy:src: /root/nginx/conf/site.confdest: /etc/nginx/conf.d/site.conf- name: create indexshell: echo "this is nginx_yaml test web!" > /data/index.html- name: set correct permissions for index.htmlfile:path: /data/index.htmlowner: nginxgroup: nginxmode: '0644'- name: start nginxservice:name: nginxstate: restarted
检查playbooky语法并执行

为了避免因为防火墙导致的问题,直接禁用selinux

ansible -m selinux -a "policy=targeted state=disabled" all_servers
ansible-playbook nginx.yaml --syntax-check
ansible-playbook nginx.yaml 

在这里插入图片描述

nginx启动失败了,检查一下配置文件语法发现是第八行的{附近出了问题

在这里插入图片描述

# 看看配置文件
cat /etc/nginx/nginx.conf

在这里插入图片描述

句柄末尾少了一个分号,那我们得根治源头的/root/nginx/conf/site.conf文件

vim /root/nginx/conf/site.conf
# 加上分号应该就可以了

server1卡住了,我们先用server2看看到底行不行

vim /playbook/nginx.yaml
# 把node1改成node2

在这里插入图片描述

完美

测试功能
 elinks 192.168.28.77:8848

在这里插入图片描述

变量

ansible中变量的来源

  • 主机清单里配置的 ip 、主机名 、主机组的对应关系
  • 自定义变量

优先级

  • 通过命令行指定的变量优先级最高
  • /etc/ansible/hosts中定义的变量
  • playbook中定义的变量

Ansible中jinja2模板

  • 由python编写,在使用模板文件时jinja2是很好的解决方案

  • 功能是将模板文件中的变量转换成对应主机的确定值

语法
数据类型表示
字符串用双引号或单引号代表字符串
列表[]
元组()
字典{}
算术表达式±*/等
比较操作==、!=、<、>等等
逻辑运算and或者or
变量
{{name}}
控制语句
{% if 条件 %}{{ name1 }}
{% else %}{{ name2 }}
{% endif %}# 如果条件成立,渲染name1,条件不成立,渲染name2
案例:批量生成hosts解析文件

先看看之前创建的主机清单

cat /etc/ansible/hosts
[all_servers]
server1
server2
server3[node1]
server1[node2]
server2[node3]
server3
准备模板文件
mkdir jinja2 &&cd jinja2
vim hosts.j2

因为前一段对本机解析都是一样的,所以我们随便从一台复制都可以

ssh root@server1
cat /etc/hosts 
exit
echo "127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
" > hosts.j2

看看有没有成功

cat hosts.j2

在这里插入图片描述

由于是模板,所以我们要向hosts.j2写入一些通用的代码段

循环遍历一个服务器列表(all_servers),并打印出每个服务器的IPv4地址和主机名。这段代码假设您已经使用Ansible的事实收集功能获取了关于ens33网络接口的信息

{% for host in all_servers %}
{{hostvars[host].ansible_ens33.ipv4.address}} {{hostvars[host].ansible_hostname}}
{% endfor %}
# 常见变量
主机名: "{{ ansible_hostname }}"
操作系统版本: "{{ ansible_distribution }}" "{{ ansible_distribution_version }}"
内核版本: "{{ ansible_kernel }}"
系统位数: "{{ ansible_userspace_bits }}"
网卡:"{{ ansible_eth0["device"] }}" 
IP地址: "{{ ansible_eth0["ipv4"]["address"] }}"
子网掩码: "{{ ansible_eth0["ipv4"]["netmask"] }}"
总内存: "{{ ansible_memory_mb["real"]["total"] }}"
内存空闲: "{{ ansible_memfree_mb }}"
cat /root/jinja2/hosts.j2

在这里插入图片描述

编写playbook剧本
vim /root/playbook/hosts.yaml
- name: config hosts filehosts: all_serversremote_user: roottasks:- name: copy hosts.j2 to all_serverstemplate:src: /root/jinja2/hosts.j2dest: /etc/hosts
执行剧本
ansible-playbook /root/playbook/hosts.yaml

在这里插入图片描述

成功

再检查一下

ansible -m shell -a "cat /etc/hosts" all_servers

在这里插入图片描述

ssh root@server1ssh root@server2

在这里插入图片描述

Role(角色)

  • 在角色中,将tasks、files、handles、templates等内容分开存放,在playbook中可以直接调用角色
  • 通过ansible-galaxy工具初始化角色

角色的生成(初始化自定义Role)

ansible-galaxy init apache

在这里插入图片描述

Role目录结构

apache/
├── defaults        # 定义角色的默认变量
│   └── main.yml    
├── files           
├── handlers        # 定义角色的默认处理程序
│   └── main.yml    
├── meta
│   └── main.yml
├── README.md
├── tasks           # 定义角色的主要任务
│   └── main.yml
├── templates       # 存放角色使用的模板文件
├── tests           # 存放角色测试相关文件
│   ├── inventory   
│   └── test.yml
└── vars            # 定义角色变量└── main.yml

例:用Role安装httpd

初始化角色httpd

规定角色httpd要执行的任务

ansible-galaxy init httpd

在这里插入图片描述

tree httpd/

在这里插入图片描述

vim /httpd/tasks/main.yml
- name: install httpdyum:name: httpdstate: present- name: copy site.conf to httpd/conf.d/copy:src: site.confdest: /etc/httpd/conf.d/site.conf- name: create dir /data/site1 site2file:name: "{{ item }}"state: directoryloop:- /data/site1- /data/site2- name: create web indexshell: echo "<h1>in site1<h1>" > /data/site1/index.html && echo "<h1>in site2<h1>" > /data/site2/index.html- name: start serviceservice:name: httpdstate: started
为httpd配置虚拟主机及根目录
vim file/site.conf
Listen 8080
Listen 9090<Directory "/data/">
require all granted
</Directory><VirtualHost *:8080>
DocumentRoot "/data/site1/"
</VirtualHost><VirtualHost *:9090>
DocumentRoot "/data/site2/"
</VirtualHost>
当前role目录状态

在这里插入图片描述

到上级目录创建剧本

我这里统一把剧本放在了playbook文件夹下

vim playbook/httpd_role.yaml
- name: install httpdhosts: node3roles:- httpd
执行剧本
ansible-playbook playbook/httpd_role.yaml

在这里插入图片描述

检验效果
elinks 192.168.28.100:8080
# elinks 192.168.28.100:9090

在这里插入图片描述

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

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

相关文章

React--》掌握Valtio让状态管理变得轻松优雅

Valtio采用了代理模式&#xff0c;使状态管理变得更加直观和易于使用&#xff0c;同时能够与React等框架无缝集成&#xff0c;本文将深入探讨Valtio的核心概念、使用场景以及其在提升应用性能中的重要作用&#xff0c;帮助你掌握这一强大工具&#xff0c;从而提升开发效率和用户…

【Go语言】

type关键字的用法 定义结构体定义接口定义类型别名类型定义类型判断 别名实际上是为了更好地理解代码/ 这里要分点进行记录 使用传值的例子&#xff0c;当两个类型不一样需要进行类型转换 type Myint int // 自定义类型&#xff0c;基于已有的类型自定义一个类型type Myin…

用kali入侵 DarkHole_2测试

进入kali系统调出root交互式界面 netdiscover -r 000.000.000.000/24 -------局域网探测IP工具 nmap 设备端口扫描 发现两个攻击点一个是80端口的Http 一个是22端口的ssh 发现有许多GIT文件 可能会出现git源码泄露 使用githack URL 命令还原git源文件 打开面板控制命令行 输入…

2.插入排序(斗地主起牌)

一、思想 扑克牌起牌 代码&#xff1a; 二、时间复杂度&#xff1a; 最好情况&#xff08;已经排序好的&#xff09;&#xff1a;T O(N) 最坏情况&#xff08;完全逆序&#xff09;&#xff1a;T O(N^2) 三、优劣&#xff1a; 严格的大小比较之后才进行错位插入&#x…

exchange_proxy exchange 安全代理

1. 软件简介 exchange_proxy 是由小米公司开发并开源的,以 go 语言开发的 exchange 安全代理,可以将内网的 exchange 服务器的 https 服务安全地发布出去, 支持的功能如下: WEB 端增加 OTP 二次认证手机端增加设备激活绑定的功能屏蔽了 PC 端的 EWS 协议(意思就是不支持)…

gin入门教程(5):请求参数处理

在 Gin 中&#xff0c;处理请求参数非常简单。您可以从 URL 路由、查询字符串和请求体中提取参数。以下是几种常见的处理方式&#xff1a; 1. URL 路由参数 如果您想从 URL 中获取参数&#xff0c;可以使用路由定义中的冒号&#xff08;:&#xff09;符号&#xff1a; r.GET…

【PHP】在ThinkPHP6中Swoole与FPM的简单性能测试对比

一、前言 本文主要测试在ThinkPHP 6框架中,使用Swoole扩展库与使用PHP-FPM两者的HTTP并发性能差距,测试方法较简单,仅供参考。 二、测试环境 系统:Ubuntu 22.04 PHP版本:7.4.33 Swoole版本:4.8.13 ThinkPHP版本:6.1.5 ThinkPHP-Swoole扩展库版本:3.1.4 测试工具:A…

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

MySQLDBA修炼之道-开发篇(一)

三、开发基础 1. 数据模型 1.1 关系数据模型介绍 关于NULL 如果某个字段的值是未知的或未定义的&#xff0c;数据库会提供一个特殊的值NULL来表示。NULL值很特殊&#xff0c;在关系数据库中应该小心处理。例如查询语句“select*from employee where 绩效得分<85 or>绩…

ElasticSearch的向量存储和搜索

ElasticSearch的向量存储和搜索 引入依赖示例代码 引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schema…

JVM参数选项类型

我的后端学习大纲 JVM学习大纲 1、类型1&#xff1a;标准参数选项&#xff1a; 1.1.特点&#xff1a; 1.比较稳定&#xff0c;后续基本不会发生变化2.以“-”开头 1.2.各种选项&#xff1a; 运行java或者java -help可以看到所有的标准选项 1.3.补充内容&#xff1a; -se…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中&#xff0c;多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map&#xff08;生成描述图像映…

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (七):MongoDB的设置

本项目旨在学习如何快速使用 nodejs 开发后端api&#xff0c;并为以后开展其他项目的开启提供简易的后端模版。&#xff08;非后端工程师&#xff09; 由于文档是代码写完之后&#xff0c;为了记录项目中需要注意的技术点&#xff0c;因此文档的叙述方式并非开发顺序&#xff0…

Android View的事件分发机制

前言 本文由于介绍本人关于View的事件分发机制的学习&#xff0c;如有不恰当的描述欢迎指出。 View基础 什么是View ​ View是Android中所有控件的基类&#xff0c;不管是Button、TextView、LinearLayout&#xff0c;它们的共同基类都是View。也就是说&#xff0c;View是界…

K8S配置storage-class

简介 Kubernetes支持NFS存储&#xff0c;需要安装nfs-subdir-external-provisioner&#xff0c;它是一个存储资源自动调配器&#xff0c;它可将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。该组件是对Kubernetes NFS-Client Provisioner的扩展&#xff0…

腾讯云跨AZ部署FortigateHA备忘录

随时保存配置 config system globalset admintimeout 480set alias "FortiGate-VM64-KVM"set gui-auto-upgrade-setup-warning disableset hostname "FG-Slave"set revision-backup-on-logout enableset revision-image-auto-backup enableset timezone &…

179.最大数

目录 题目解法sort可以自定义排序规则 题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 解法 class S…

Android开发兼容性问题3万字保姆级教程(Android版本、屏幕、多语言、硬件、第三方库、权限)

目录 第一章 Android版本兼容性 1.1 版本众多的挑战 1.2 设置版本参数 1.3 API版本检测 1.4 兼容性实例 使用minSdkVersion和targetSdkVersion 1.5 版本更新的应对策略 第二章 屏幕尺寸与分辨率兼容性 2.1 屏幕尺寸的多样性 2.2 响应式布局 2.3 drawable资源管理 使…

面向对象与设计模式第一节:深入理解OOP

第三章&#xff1a;面向对象与设计模式 第一节&#xff1a;深入理解OOP 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它将程序结构视为由对象组成&#xff0c;促进了代码的重用性和可维护性。在这一课中&#xff0c;我们将深入分析OOP的四个基本特性&…

Flutter鸿蒙next 布局架构原理详解

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…