Linux:ansible-playbook配置文件(剧本)(进阶)

Linux:ansible-playbook配置文件(剧本)_ansible-playbook -i参数-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170930036016800215061982&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-132579492-null-null.nonecase&utm_term=ansible&spm=1018.2226.3001.4450上面这个链接是基础文章


如果把ansible的模块比喻成linux命令,那么咱的playbook就好比是shell脚本


Playbook介绍 

Playbookad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstackstate状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务


Playbook核心元素 

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,即使用模板语法的文件,比如配置文件等
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。

Playbook语法 

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task

1.简单的示例

由于这不是是基础章,里面的写法我就大概进行一个介绍了

 

hosts是指定哪些主机执行

remote_user是远程主机执行的用户

tasks下面就是一个任务列表,里面包含了一些任务模块

name就是一个类似声明的一个操作

name下面的就是各个模块加上他的参数 

---
- hosts : all
  remote_user : root
  tasks :

    - name : 写入开机自动挂载镜像
      mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=present

    - name : 挂载镜像
      mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=mounted

    - name : 搭建yum仓库
      yum_repository : name=local  description="local" baseurl=file:///mnt enabled=1 gpgcheck=no file=tarro

    - name : 下载httpd
      yum : name=httpd state=installed

    - name : 启动httpd
      service : name=httpd state=started

    - name : 修改index
      copy : content="KALItarro" dest=/var/www/html/index.html
...


2.主机与用户

可以看到我们一开始写了在被管理机上执行的用户,我们除了在开头写还可以在下面写,如图

除了在里面可以指定某条模块执行的角色以外还可以使用sudo进行一个授权执行         

 


3.触发器与动作

Handlers(动作)与Notify(触发) 

 这俩非常好理解,触发器就是我们在某处触发,触发我们指定下面的某个动作

动作就是一般写在文件最下面,我们在上面通过动作名称去触发,触发了就执行指定的动作

很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次

---
- hosts : all
  remote_user : root
  tasks:
    - name : "先对http的端口进行修改后,再通过触发器去执行动作"
      shell : sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
      notify :
        - restart httpd

  handlers :
    - name : restart httpd
      service : name=httpd state=restarted
...

 通过在上面的触发,直接触发了下面的对应名称的动作


4.playbook中的变量

命令行指定变量 

执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量
---
- hosts: all
  remote_user: root

  tasks:
    - name : "安装指定的变量名的软件"
      yum : name={{ a }} state=installed
...
ansible-playbook -e "a=httpd" ins.yaml

使用这条命令的时候使用了-e传入变量

hosts文件中定义变量 

/etc/ansible/hosts 

---
- hosts: 192.168.6.2
  remote_user: root 

  tasks:
    - name: "b=lrzsz变量"
      yum: name={{ b }} state=installed
...
---
- hosts: all
  remote_user: root 

  tasks:
    - name: "a=httpd"
      yum: name={{ a }} state=installed
...

playbook文件中定义变量

---
- hosts: all
  remote_user: root

  vars:
    a: httpd
    b: lrzsz

  tasks:
    - name: "a=httpd"
      yum: name={{ a }} state=installed


    - name: "b=lrzsz"
      yum: name={{ b }} state=installed
...

 

重新定义原有变量 

 

 我这里有个名为pkg的变量,默认是安装gcc的一个变量,我只需在执行时候去通过命令重新定义变量即可完成替换

ansible-playbook -e "pkg=httpd" 1.yaml

 

这样就被定义成为新变量了

在其他文件中定义变量

我创建了一个名为var.yaml的文件并写入了

 

这两个内容

我再去修改一下playbook文件导入一下变量

 

 模块自带变量

playbook同样可以调用内部的一些自带变量,如setup模块里的一些

 


标签

一个playbook文件中,执行时如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行,还可以通过--skip-tags选择除了某个标签外全部执行等。

 

tags下面的就是标签,并且可以搭配变量如in{{ na }}  就是inhttpd    ,还可以打多个标签

 当我们想正常依次执行playbook直接执行就行了

ansible-playbook 3.yaml

我这个playbook中包含了安装,开启,重启,假设我就像执行这个剧本里的开启,我可以通过标签这样操作

ansible-playbook -t sthttpd 3.yaml

这样就 只执行了一个

如果我们现在不想执行开启httpd

ansible-playbook --skip-tags sthttpd 3.yaml

 那么现在就只执行安装和重启

如果现在不想执行开启和重启

ansible-playbook --skip-tags sthttpd,rehttpd 3.yaml

 可以通过  “,” 去隔开


Playbook中模板的使用 

template模板为我们提供了动态配置服务,使用jinja2语言,里面支持多种条件判断、循环、逻辑运算、比较操作等。其实说白了也就是一个文件,和之前配置文件使用copy一样,只是使用copy,不能根据服务器配置不一样进行不同动态的配置。这样就不利于管理。说明:1、多数情况下都将template文件放在和playbook文件同级的templates目录下(手动创建),这样playbook文件中可以直接引用,会自动去找这个文件。如果放在别的地方,也可以通过绝对路径去指定。2、模板文件后缀名为.j2

实例:

 4.yaml里的内容是使用123.j2模板  将模板传输到被管机上的/opt目录下名为321

 

 123.j2里面的内容如下

执行一下playbook ,到被管理机器上看一下

 


 

template之when

条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句执行,在task中使用jinja2的语法格式、when语句:在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法。

 

---
- hosts: testA
  tasks:
  - name: 我要输出dgf
    shell: echo -n "dgf"
    register: xingming
    ignore_errors: True
  - name: 我要判断
    file: name=/alex state=directory
    when: xingming is success

 修改playbook文件,通过setup模块获取系统版本去判断

---
- hosts: all
  remote_user: root
  vars:
    - listen_port: 88

  tasks:
    - name: Install Httpd
      yum: name=httpd state=installed
    - name: Config System6 Httpd
      template: src=httpd6.conf.j2 dest=/etc/httpd/conf/httpd.conf
      when: ansible_distribution_major_version == "6"   #判断系统版本,为6便执行上面的template配置6的配置文件
      notify: Restart Httpd
    - name: Config System7 Httpd
      template: src=httpd7.conf.j2 dest=/etc/httpd/conf/httpd.conf
      when: ansible_distribution_major_version == "7"   #判断系统版本,为7便执行上面的template配置7的配置文件
      notify: Restart Httpd
    - name: Start Httpd
      service: name=httpd state=started

  handlers:
    - name: Restart Httpd
      service: name=httpd state=restarted

 


template之with_items

 

上面的意思就是依次安装httpd vsftpd  nginx

---
- hosts: all
  remote_user: root

  tasks:
    - name: Create New Group
      group: name={{ item }} state=present
      with_items: 
        - group1
        - group2
        - group3 

    - name: Create New User
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
        - { name: 'user1', group: 'group1' } 
        - { name: 'user2', group: 'group2' } 
        - { name: 'user3', group: 'group3' }

 这个案例是把用户加入不同的用户组


template之for if

 实例:

---
- hosts: all
  remote_user: root
  vars:
    nginx_vhosts:
      - web1:
        listen: 8081
        server_name: "web1.example.com"
        root: "/var/www/nginx/web1"
      - web2:
        listen: 8082
        server_name: "web2.example.com"
        root: "/var/www/nginx/web2"
      - web3:
        listen: 8083
        server_name: "web3.example.com"
        root: "/var/www/nginx/web3"

  tasks:
    - name: Templage Nginx Config
      template: src=nginx.conf.j2 dest=/tmp/nginx_vhost.conf

模板文件编写

{% for vhost in nginx_vhosts %}


server{
     listen:    {{ vhost.listen }};
     server_name:    {{ vhost.server_name }};
     root:   {{ vhost.root }}; 
}
{% endfor %}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter学习(一) 安装以及配置环境

首先需要下载flutter,然后解压 然后配置环境变量,配置到bin目录就行 然后在用户变量里再配置一下(不配置后来你就知道有多重要了) PUB_HOSTED_URL https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL https://storage.flut…

【CesiumJS-3】加载倾斜模型数据(3DTilest)以及修改位置

引入倾斜模型数据 // 加载3DTiles数据let tileset;try {tileset await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");viewer.value.scene.primitives.add(tileset); // 倾斜模型添加到场景中viewer.value.zoomTo(tileset); // 视角定位到倾…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑,自动识别开发板端口,选择端口

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图像效果)

设置组件的模糊、阴影、球面效果以及设置图片的图像效果。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 blur blur(value: number, options?: BlurOptions) 为组件添加内容模糊效果。 卡片能力&am…

电脑提示d3dcompiler_43.dll丢失的解决方法分享,教你4种方法修复

在电脑使用过程中,你可能遇到一个报错通知,系统提示你d3dcompiler_43.dll文件缺失。那么,什么是d3dcompiler_43.dll文件?它有什么作用?如何修复文件缺失的问题呢?本文将为你详细解答,我们会给大…

网络安全知识入门:Web应用防火墙是什么?

在互联网时代,网络安全问题逐渐受到重视,防火墙的配置也是非常必要的。它是位于内部网和外部网之间的屏障,更是系统的第一道防线。Web应用防火墙是什么,如何才能更好地保护Web应用,这篇文章会从应用安全为出发点&#…

【VTKExamples::PolyData】第四十五期 QuantizePolyDataPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例QuantizePolyDataPoints,并解析接口vtkQuantizePolyDataPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份,牛角源码全站数据全站文件、插件打包分享给大家,有兴趣的可以搭建玩玩 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

支持向量机 SVM | 线性可分:硬间隔模型公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前,我们先来看一段定义: 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法,支持线性分类和非线性分类的分类应用,同时通过OvR或者OvO的方式可以应用…

【设计模式】观察者模式及函数式编程的替代C++

本文介绍观察者模式以及使用函数式编程替代简单的策略模式。 观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 当对象间存在一对多关系时&#…

Java集合框架-Collection和Map

文章目录 Collection-单列集合特点ListArrayListLinkedListVecter SetHashSetTreeSet Map-键值对集合特点Map常用APIput添加细节remove Map的三种遍历方式1.通过键找值2.通过"键值对"3.Lambda表达式foreach源码 HashMap需求 为什么要使用泛型 泛型的优点1.集合中存储…

c4d渲染到一半未响应怎么办?

如果您曾经遇到过 Cinema 4D 在渲染过程中崩溃的令人沮丧的场景,这种情况是很常见的。这种意外的卡顿崩溃,尤其是在经过数小时的精心工作之后,确实令人烦躁。为了帮助您解决此问题,您可以查看一些内容。 1、硬件限制:…

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂,在谷歌的安卓操作系统“断供”后,鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日,华为宣布,不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世,并与2024年Q4正…

C++模板完整版

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& right) {int temp left…

BioTech - ADMET的性质预测 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET,即 Absorption、Distribution、Metabolism、Excretion、Toxicity,吸收、分布、代谢、排泄、毒性…

VL53L8CX驱动开发(1)----驱动TOF进行区域检测

VL53L8CX驱动开发----1.驱动TOF进行区域检测 概述视频教学样品申请源码下载主要特点硬件准备技术规格系统框图应用示意图区域映射生成STM32CUBEMX选择MCU 串口配置IIC配置LPn 设置X-CUBE-TOF1串口重定向代码配置Tera Term配置演示结果 概述 VL53L8CX是一款8x8多区域ToF测距传感…

【学习心得】爬虫JS逆向通解思路

我希望能总结一个涵盖大部分爬虫逆向问题的固定思路,在这个思路框架下可以很高效的进行逆向爬虫开发。目前我仍在总结中,下面的通解思路尚不完善,还望各位读者见谅。 一、第一步:明确反爬手段 反爬手段可以分为几个大类 &#…

【CSP试题回顾】202305-2-矩阵运算

CSP-202305-2-矩阵运算 关键点总结:改变矩阵计算顺序优化时间复杂度 通过先计算 K T V K ^ T \times V KTV 而不是先计算 Q K T Q \times K ^ T QKT,有效地减少了计算时间,特别是在处理长序列时。这种优化通常在数据维度一不等时有显著效…

盘点:国家智能算力中心

文章目录 1. Main2. My thoughtsReference 1. Main 按照《中国算力白皮书(2022年)》的定义,算力主要分为四部分:通用算力、智能算力、超算算力、边缘算力。通用算力以CPU芯片输出的计算能力为主;智能算力以GPU、FPGA、…

DevStack 基于 Ubuntu 部署 OpenStack

Devstack 简介 DevStack 是一系列可扩展的脚本,用于基于 git master 的最新版本快速调出完整的 OpenStack 环境。devstack 以交互方式用作开发环境和 OpenStack 项目大部分功能测试的基础。 devstack 透过执行 stack.sh 脚本,搭建 openstack 环境&…