ansible的脚本-----playbook剧本

news2024/11/23 21:26:50

ansible的脚本-----playbook剧本

playbook组成部分:

1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用

2、variables变量:存储和传递数据,变量可以自定义,可以在playbook当中定义为全局变量,也可以外部传参

3、Templates模板:用于生成配置文件。模板是包含占位符的文件,占位符由ansible在执行时转化为变量值

4、handlers处理器:当需要有变更的时候,可以执行触发器

5、Roles角色:是一种组织和封装playbook的,允许把相关的任务,变量,模板和处理器组织成一个可复用的单元

playbook的条件判断:

when是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

when是满足条件即执行,不满足不执行

循环:

ansible有多种循环模式,

with_items:循环遍历

with_list:列表分组循环

with_together:列表对应的列,数据结合的方式循环

with_nested:相当于双重循环,第一层定义了循环的次数,第二层表示第一层的每个元素会循环几次

实例模板:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

  gather_facts: false

  hosts: 192.168.233.20

  remote_user: root

  tasks:

   - name: ping test

     ping:

   - name: close selinux

     command: '/sbin/setenforce 0'

     ignore_errors: True

   - name: close firewalld

     service: name=firewalld state=stopped

   - name: install httpd

     yum: name=httpd

   - name: start httpd

     service: enabled=true name=httpd state=started

   - name: editon index.html

     shell: echo "this is httpd" > /var/www/html/index.html

     notify: restart httpd

  handlers:

   - name: restart httpd

     service: name=httpd state=restarted

检查yml的语法是否正确

运行脚本

指定任务从哪一步开始

切换用户实验:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

#一个name就是一个任务名,名字可以不写

  gather_facts: false

#是否收集目标主机的系统信息,false就是不收集

  hosts: 192.168.233.20

#执行的目标主机是20

  remote_user: dn

  become: yes

#切换用户

  become_user: root

#在目标主机执行的用户

  tasks:

   - name: ping test

     ping:

   - name: close selinux

     command: '/sbin/setenforce 0'

     ignore_errors: True

   - name: close firewalld

     service: name=firewalld state=stopped

   - name: install httpd

     yum: name=httpd

   - name: start httpd

     service: enabled=true name=httpd state=started

   - name: editon index.html

     shell: echo "this is httpd" > /var/www/html/index.html

     notify: restart httpd

  handlers:

   - name: restart httpd

     service:name=httpd state=restarted

打开配置文件,71行取消注释

指定用户,输入密码

也可以不在脚本里声明用户,在命令行输入用户

声明和引用变量,以及外部传参变量实验:

#this is second playbook!

#声明和引用变量,以及外部传参变量

- hosts: 192.168.233.20

  remote_user: root

  vars:

    groupname: guoqi

    username: wangdefu

  tasks:

   - name: create group

     group:

       name: "{{ groupname }}"

       system: yes

       gid: 111

   - name: create user

     user:

       name: "{{ username }}"

       uid: 1011

       group: "{{ groupname }}"

       shell: /sbin/nologin

   - name: copy file

     copy:

       content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

#获取目标主机的IP地址,然后打印,复制到目标文件

       dest: /opt/ky32.txt

"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

包含所有主机变量的字典

inventory_hostname:目标的主机名

ansible_default_ipv4:获取目标主机名

['ansible_default_ipv4']['address']:索引

用-e往ansible-playbook里面传参数

条件判断实验:

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

  remote_user: root

  tasks:

   - name: test when

     debug:

       msg: '位置判断'

     when: ansible_default_ipv4.address == '192.168.233.20'

(做这些之前要先在/etc/ansible/hosts里面把其他的IP地址删掉)

取反

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

  remote_user: root

  tasks:

   - name: test when

     debug:

       msg: '位置判断'

#echo $a echo ok echo 123 debug=echo msg:输出的内容,用于脚本的调试,在正式脚本中要去除

     when: ansible_default_ipv4.address != '192.168.233.20'

实验安装nginx和httpd:

20安装nginx

30安装httpd

- hosts: all

  remote_user: root

  tasks:

   - name: nginx

     yum: name=nginx

   - name: nginx info

     debug:

       msg: "安装nginx"

(两个选一个用)

循环

- hosts: 192.168.233.30

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_items: [a,b,c,d]

#声明变量item,playbook的内置变量,with_items,会把item的值,遍历>列表当中的a,b,c,d

定义两个列表,但是会一块遍历打印出来

- hosts: 192.168.233.30

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_items:

      - [a,b,c,d]

      - [1,2,3,4]

#声明变量item,playbook的内置变量,with_items,会把item的值,遍历>列表当中的a,b,c,d

#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行

遍历

分组打印:

- hosts: 192.168.233.40

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_list:

      - [a,b,c,d]

      - [1,2,3,4]

遍历循环在主机上创建文件实验:

双重循环实验:

- hosts: 192.168.233.40

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_nested:

      - [a,b,c,d]

      - [1,2,3,4]

#列表里面的元素定义了循环的次数,第二层列表相当于内循环

一键yum安装tree sl nginx httpd vsftpd dhcp软件:

- name: play1

  hosts: 192.168.233.40

  gather_facts: false

  tasks:

    - name: yum

      yum: name= {{item}}

      with_list:

        - tree

        - sl

        - nginx

        - httpd

        - vsftpd

        - dhcp

创建test1 2 3,然后把源主机的test1 2 3发给目标主机 再给一个判断的实验:

两个都可以用

Templates模块:

Jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要的配置文件当中(web开发)

声明占位符之后,往httpd里面塞东西实验:

- hosts: all

  remote_user: root

  vars:

    - package: httpd

    - service: httpd

  tasks:

    - name: install httpd

      yum: name={{package}}

    - name: install configure file

      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

      notify:

        - restart httpd

    - name: cfreate root_dir

      file:

        path: /etc/httpd/htdocs

        state: directory

    - name: start httpd

      service: name={{service}} enabled=true state=started

  handlers:

    - name: restart httpd

     service: name={{service}} state=restarted

最下面的service要和上面的service对齐

httpd.conf.j2在文件当中配置的是占位符(声明的变量)

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)

playbook当中,用template模块来把参数传给目标的主机的配置文件

nginx实验:

端口号改成8080

root目录改成/opt/nginx/html

(其他步骤与http一样)

tags模块:

标签模块:标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook时可以通过指定任务标签,来实现只运行设定的标签任务

例如:

- name

 tags:

   debug

--start-at-task=‘wdf’

任务标签的种类:

always:不管你是否指定了运行标签,任务都会执行

never:即使运行了指定标签,该任务也不会执行

debug:调试任务

setup:收集主机信息

自定义标签:

per_tasks:指定标签之前的任务

post_tasks:运行指定标签之后的任务

Roles模块:

roles又称为角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次结构,自动装载变量文件,task,以及handlers等等

roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用rolse模块来一键调用这些文件

roles:

-------web-------总目录,角色

files  存放copy和sript模块调用的文件

templates  存放j2的模板文件

tasks 包含任务的目录

--------main.yml  角色运行的任务

handlers包含处理器的目录

---------main.yml

vars 存放变量的目录

---------main.yml

defaults 包含默认变量的目录

----------main.yml

meta包含元信息的目录

-----------main.yml

site.yml用来调用所有的配置文件

安装三个服务:

http

mysql

php

 

然后在20主机查看httpd、nginx、mysql

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

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

相关文章

WeakMap 和 WeakSet:解决内存泄漏避免循环引用(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

React组件状态管理

React组件的状态管理是一个很重要的内容。从字面来理解,按钮是否可单击、图片是否显示等,这些都是状态。广义来讲,React组件的状态还1包括传入React的数据,例如某个组件要展示列表,列表的数据也是该组件的状态。总之&a…

Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023待补)

文章目录 BeginningAbstract挑战方法成果 Introduction引出问题早期的work及存在的问题近期的work及存在的问题our workContribution Related Work(paper for me)Oriented Object DetectionPrior for Oriented ObjectsLabel Assignment Tiny Object Dete…

【算法】算法题-20231221

这里写目录标题 一、830. 较大分组的位置二、657. 机器人能否返回原点三、771. 宝石与石头 一、830. 较大分组的位置 在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。 例如,在字符串 s "abbxxxxzyy"中&#xff0…

【XML】TinyXML 详解

1、简介 优点: TinyXML 是一个简单、小型的 C XML 解析器,可以轻松集成到项目中。 TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中…

【SQL题目】连续日期的判断

【1.查询至少连续3天下单的用户】 思路1(使用lead): distinct user_id,create_date去重,确保每个用户每天只有一条访问记录lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区&am…

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建

模型实战(18)之C++ - tensorRT部署GAN模型实现人脸超分辨重建 一个实现人脸超分辨率重建的demo支持StyleGAN: GPEN or GFPGAN通过C++ - tensorrt 快速部署,推理速度每帧 在RTX3090上5.5ms+,RTX3050上10ms+下边是实现效果(图片来源于网络search,如若侵权,联系删除) 下边…

AI Native工程化:百度App AI互动技术实践

作者 | GodStart 导读 随着AI浪潮的兴起,越来越多的应用都在利用大模型重构业务形态,在设计和优化Prompt的过程中,我们发现整个Prompt测评和优化周期非常长,因此,我们提出了一种Prompt生成、评估与迭代的一体化解决方案…

YashanDB个人版体验总结

前言 YashanDB数据库具有多项功能特性。首先,它是一个分布式数据库,支持水平扩展,能够将数据分散到多个节点上,从而提高系统的可靠性和性能。其次,YashanDB数据库具备高可用性,支持主从复制和自动故障转移…

竞赛保研 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于Django与深度学习的股票预测系统 ** 该项目较为新颖,适合作为竞赛课题方向&#xff…

VS ASP.Net Core项目还原Packages包到本地(解决服务器没有网无法重新生成的问题)

问题背景 ASP.Net Core MVC项目,无法重新生成。 现场服务器没有网,放上去的代码无法通过nuget还原包到服务器,导致无法编译无法运行。 解决办法 将Packages还原到本机(有网),然后再将代码放到服务器运行。 在有网的…

KoPA: Making Large Language Models Perform Better in Knowledge Graph Completion

本来这个论文用来组会讲的,但是冲突了,没怎么讲,记录一下供以后学习。 创新点 按照我的理解简单概述一下这篇论文的创新点 提出使用大模型补全知识图谱,并且融合知识图谱的结构信息提出一个新的模型KoPA模型,采用少…

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发

java基础入门-23-【网络编程】

java基础入门-23-【网络编程】 32、网络编程1.什么是网络编程2.网络编程三要素1.1 IP1.2 总结1.3 IPV4的地址分类形式1.4 常见的CMD命令1.5 InetAddress类的使用1.6 端口和协议 2.UDP通信程序2.1 UDP发送数据2.2UDP接收数据2.3UDP通信程序练习2.4UDP三种通讯方式2.5UDP组播实现…

more的详细用法

概要&#xff1a; Linux中more的功能是分页显示文件内容 空格键显示下一屏(页)&#xff0c;回车键Enter显示下一行&#xff0c;q键退出 本篇所用系统是Ubuntu22.04 一、more filename more后面跟的是文件名&#xff0c;分页显示文件内容 二、more < filename more从…

在MacOS上Qt配置OpenCV并进行测试

一.Qt环境准备 上一篇博客我讲了如何下载配置OpenCV库&#xff0c;但是在Qt5.15.2使用OpenCV库时&#xff0c;出现了一个问题就是我下载的Qt5.15.2是x86架构的&#xff0c;不能对OpenCV库进行链接&#xff0c;而OpenCV库是arm架构的 直接使用Qt5.15.2编译链接OpenCV库链接头文件…

Leetcode—75.颜色分类【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—75.颜色分类 实现代码 class Solution { public:void sortColors(vector<int>& nums) {int red 0, white 0, blue 0;for(auto num: nums) {if(num 0) {red;} else if(num 1) {white;} else {blue;}}for…

1. 创建型模式 - 工厂方法模式

亦称&#xff1a; 虚拟构造函数、Virtual Constructor、Factory Method 意图 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。 问题 假设你正在开发一款物流管理应用。 最初版本只能处理卡车运输…

PnetLab[网络虚拟化实验平台]下载地址

Pnet是一款分组网络仿真工具实验室和EVE-NG类似&#xff0c;由于官方提供的下载地址对我大国内域网络并不友好&#xff0c;特地将资源搬运至此。 PNETLAB-5.1.2.ova 下载 访问码&#xff1a; h2or 5.3.11升级包 下载 访问码&#xff1a; quu9 PNET_4.2.10.ova 下载 访问码&…

【C语言】指针详解(二)

目录 1.指针变量类型的意义 1.1指针的解引用 1.2指针 - 整数 1.3void*指针 2.const修饰指针 2.1const修饰变量 2.2const修饰指针变量 1.指针变量类型的意义 1.1指针的解引用 指针变量的大小和类型无关&#xff0c;只要是指针变量&#xff0c;在同一个平台下&#xff0…