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

news2024/12/25 0:45:14

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.conf

Listen 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 servers
  hosts: node3
  remote_user: root

  tasks:
  - name: install httpd
    yum:
      name: httpd
      state: latest

  - name: create dir site1
    file:
      name: /data/web/site1
      state: directory

  - name: create dir site2
    file:
      name: /data/web/site2
      state: directory

  - name: create web index
    shell: echo "site1" > /data/web/site1/index.html && echo "site2" > /data/web/site2/index.html

  - name: create apache conf
    copy:
      src: /root/playbook/file/site.conf
      dest: /etc/httpd/conf.d/site.conf

  - name: enable and start apache
    service:
      name: httpd
      enabled: yes
      state: 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 && configuration
  hosts: node1
  remote_user: root

  tasks:
  - name: install epel
    yum:
      name: epel-release.noarch
      state: latest

  - name: install nginx
    yum:
      name: nginx
      state: present

  - name: ensure /data directory exists
    file:
      path: /data
      state: directory
      mode: '0755'

  - name: copy configure file
    copy:
      src: /root/nginx/conf/site.conf
      dest: /etc/nginx/conf.d/site.conf

  - name: create index
    shell: echo "this is nginx_yaml test web!" > /data/index.html

  - name: set correct permissions for index.html
    file:
      path: /data/index.html
      owner: nginx
      group: nginx
      mode: '0644'

  - name: start nginx
    service:
      name: nginx
      state: 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 file
  hosts: all_servers
  remote_user: root
  
  tasks:
  - name: copy hosts.j2 to all_servers
    template:
      src: /root/jinja2/hosts.j2
      dest: /etc/hosts
执行剧本
ansible-playbook /root/playbook/hosts.yaml

在这里插入图片描述

成功

再检查一下

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

在这里插入图片描述

ssh root@server1
	ssh 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 httpd
  yum:
    name: httpd
    state: present

- name: copy site.conf to httpd/conf.d/
  copy:
    src: site.conf
    dest: /etc/httpd/conf.d/site.conf

- name: create dir /data/site1 site2
  file:
    name: "{{ item }}"
    state: directory
  loop:
  - /data/site1
  - /data/site2

- name: create web index
  shell: echo "<h1>in site1<h1>" > /data/site1/index.html && echo "<h1>in site2<h1>" > /data/site2/index.html

- name: start service
  service:
    name: httpd
    state: 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 httpd
  hosts: node3
  roles:
  - httpd
执行剧本
ansible-playbook playbook/httpd_role.yaml

在这里插入图片描述

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

在这里插入图片描述

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

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

相关文章

寻找大自然的颜色

走在停停&#xff0c;停停走走&#xff0c;恍惚间一天过去了&#xff0c;转瞬间一年过去了&#xff0c;身边的一切在变化又不在变化&#xff0c;生活是自己的又不是自己的。 今天是个特殊的日子&#xff0c;其实前几天对我而言就算特殊的日子了&#xff0c;一个心里暗暗等待着却…

HTTP协议相关知识点

1&#xff0c;概念理解 HTTP(超文本传输协议)&#xff0c;是一种建立在TCP上的无状态连接&#xff0c; 工作流程&#xff1a;客户端发送一个HTTP请求&#xff0c;说明想要访问的资源和请求的方式&#xff0c;服务端收到请求后进行处理&#xff0c;根据请求的方式访问服务器资源…

Android View的事件分发机制

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

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…

<Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS

灵感 给工人发工资是按小时计算的&#xff0c;每次都要上网&#xff0c;我比较喜欢用 Hours Calculator &#xff0c;也喜欢它的其它的功能&#xff0c; 做个类似的。 我以为是 Python&#xff0c;结果在学 javascript 看 HTML&#xff0c;页面的基础还停留在 Frontpage 2000…

leetCode算法题爬楼梯递归写法

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2输出&#xff1a;2解释&#xff1a;有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

互联网的无形眼睛:浏览器指纹与隐私保护攻略

你是否曾有过这样的经历&#xff1a;在某个电商网站上搜索了某件商品&#xff0c;随后无论你打开哪个网页&#xff0c;都能看到与之相关的广告&#xff1f;或者当你再次访问某个网站时&#xff0c;它居然记得你之前的浏览记录&#xff1f;这一切&#xff0c;背后都有一只“看不…

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…

Linux操作进程

前言 这次的主要内容就是进程的实操&#xff0c;主要是进程创建&#xff0c;进程终止&#xff0c;进程等待和进程程序替换&#xff0c;最后我们在手写一个简单的shell 1.进程创建 进程创建就是fork&#xff0c;所以我们就讲一些知识性的就可以了 首先在创建子进程的时候&…

【ArcGIS Pro实操第5期】全局及局部空间插值:GPI、LPI、IDW等

ArcGIS Pro实操第5期&#xff1a;全局及局部空间插值 ArcGIS Pro-用于空间插值的丰富工具箱实操&#xff1a;空间插值方法1&#xff1a;Trend Surface Model for Interpolation-以降水数据为例方法2&#xff1a;Kernel Density Estimation Method-以单位面积鹿的目击数为例方法…

爆破(使用Burp Suite)

以此靶场为例 1.启动此靶场&#xff0c;双击靶机进入 2.进入后页面如下 3.打开Burp Suite中的代理中的拦截 4.再随便往输入框里面输入什么 5.提交后为这个页面&#xff0c;或其他 6.将系统代理改为proxy&#xff0c;按图片顺序点 本来选中的是系统代理&#xff0c;改为proxy …

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片&#xff0c;flag就在图片上&#xff0c;不过不太明显&#xff0c;写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

新手直播方案

简介 新手直播方案 &#xff0c;低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑&#xff08;高成本方案&#xff09; 直播推流方案 需要摄像头 方案一 &#xff1a;手机 电脑同步下载 网络摄像头 软件&#xff08…

MySQL-DQL练习题

文章目录 简介初始化表练习题 简介 本节简介: 主要是一些给出一些习题, 关于DQL查询相关的, DQL查询语句是最重要的SQL语句, 功能性最复杂, 功能也最强, 所以本节建议适合以及有了DQL查询基础的食用, 另外注意我们使用的是Navicat, SQL编辑的格式规范也是Navicat指定的默认格式…

基于信号分解和多种深度学习结合的上证指数预测模型

大家好&#xff0c;我是带我去滑雪&#xff01; 为了给投资者提供更准确的投资建议、帮助政府和监管部门更好地制定相关政策&#xff0c;维护市场稳定&#xff0c;本文对股民情绪和上证指数之间的关系进行更深入的研究&#xff0c;并结合信号分解、优化算法和深度学习对上证指数…

codimd更改登录超时时限

codimd更改登录超时时限不生效&#xff0c;总是大概15分钟退出 现象&#xff1a;更改CMD_SESSION_LIFE&#xff0c;无论怎么改大都不生效&#xff0c;总是大概15分钟。 解决&#xff1a; 发现需要同步修改CMD_SESSION_SECRET&#xff0c;修改完毕之后终于更新了。 CMD_SESSIO…

Spring Cloud --- Sentinel 熔断规则

熔断规则 慢调用比例 发送10个请求&#xff0c;每个请求理想响应时长为200毫秒。统计1秒钟&#xff0c;如果10个请求响应时间超过200毫秒的比例大于等于10%&#xff0c;则触发熔断&#xff0c;熔断5秒。 异常比例 1秒内&#xff0c;发送请求出现异常率为20%&#xff0c;则触…