[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…

unity中GameObject介绍

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

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;生成描述图像映…

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 &…

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

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

[JAVAEE] 多线程的案例(三) - 线程池

目录 一. 什么是线程池 二. 线程池的作用 三. java提供的线程池类 四. ThreadPoolExecutor的构造方法及参数理解 1. int corePoolSize: 核心线程数. 2. int maximumPoolSize: 最大线程数 核心线程数 非核心线程数 3. int keepAliveTime:非核心线程允许空闲的最大时间. …

DataX简介及使用

目录 一、DataX离线同步工具DataX3.0介绍 1.1、 DataX 3.0概览 1.2、特征 1.3、DataX3.0框架设计 1.4、支持的数据元 1.5、DataX3.0核心架构 1.6、DataX 3.0六大核心优势 1.6.1、可靠的数据质量监控 1.6.2、丰富的数据转换功能 1.6.3、精准的速度控制 1.6.4、强劲的…

正则表达式和通配符

文章目录 正则表达式和通配符的区别正则表达式&#xff08;Regex&#xff09;通配符&#xff08;Wildcards&#xff09;总结 正则表达式的概念正则表达式的由来为什么要使用正则表达式 正则表达式的语法组成修饰符元字符\f\b\B 在Linux中的基础正则和扩展正则基础正则(BRE)^$.*…

面试时被问到“Scaling Law”,该怎么答?

在大模型的研发中&#xff0c;通常会有下面一些需求&#xff1a; 计划训练一个 10B 的模型&#xff0c;想知道至少需要多大的数据&#xff1f; 收集到了 1T 的数据&#xff0c;想知道能训练一个多大的模型&#xff1f; 老板准备 1 个月后开发布会&#xff0c;给的资源是 100 …

Linux安装Nginx教程(rpm安装方式)

本章教程,主要介绍如何在Linux Centos7系统上,使用rpm的方式进行安装Nginx。 一、安装wget插件 如果不存在wget下载插件,需要安装一下。 yum install -y wget二 、下载rpm安装包 官方提供的rpm下载地址:https://nginx.org/packages/centos/7/x86_64/RPMS/ <

【Nginx系列】499错误

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Postman常见问题及解决方(全)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xff1a; 检查网络连接是否正常&#xff0c;包括检查网络设置、代理设置…

软考中级嵌入式系统设计师笔记分享(二)

1.TTL 电路是电流控制器件&#xff0c;而CMOS 电路是电压控制器件。 2.TTL 电路的速度快&#xff0c;传输延迟时间短(5-10ns)&#xff0c;但是功耗大。 常见的串行总线有 SPI、II2C、USB、RS232/RS422/RS485、CAN等;高速串行总线主要有 SATA、PCIE、IEEE 1394、Rapidl0、USB 3…

1.DBeaver连接hive数据库

1.hive开启远程服务&#xff0c;linux中直接输入&#xff1a;hiveserver2 2.解压dbeaver和hive-jdbc-2.1.1.zip 3.双击打开 4.数据库&#xff0c;新建连接 5.搜索hive 6.配置参数 7.编辑驱动设置 8.添加jar包 9.测试连接 10.右击&#xff0c;新建sql编辑器 11.执行sql 12.调整字…