Ansible的脚本---Playbook剧本编写

news2024/11/22 21:00:33

playbook的组成部分

1、 tasks:任务

在目标主机上需要执行的操作。使用模块定义这些操作。每个任务都是一个模块的调用。

2、 variables:变量

用于存储和传递数据。类似于shell脚本中的变量。变量可以自定义。可以在playbook当中定义为全局变量,也可以外部传参。类似于shell脚本中的位置变量

3、 Templates:模板

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

4、 handlers:处理器

当需要有变更的时候,可以执行触发器。

5、 Roles:角色

类似于dockercompose。是一种组织和封装playbook的。允许把相关的任务、变量、模板和处理器组织成一个可复用的单元。

实例模板1:

vim test1.yml
#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。
  gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度
  hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名
  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
#state=latest:声明服务的版本。可以不加
   - name: start httpd
     service: enabled=true name=httpd state=started
   - name: editon index.html
#修改httpd服务的默认的访问页面
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

 检查yml文件的语法是否正确

ansible-playbook test1.yml --syntax-check
#检查yml文件的语法是否正确

检查有多少任务

ansible-playbook test.yaml --list-task

检查有多少主机生效

ansible-playbook test1.yml --list-hosts
#检查生效的目标主机

指定剧本

ansible-playbook test1.yml --start-at-task='install httpd'
#指定剧本从哪个任务开始执行

切换用户:

#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。
  gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度
  hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名
  remote_user: zyg
#在目标主机执行的用户
  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
#state=latest:声明服务的版本。可以不加
   - name: start httpd
     service: enabled=true name=httpd state=started
   - name: editon index.html
#修改httpd服务的默认的访问页面
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted


become:yes
become_user:root
vim /etc/ansible/ansible.cfg
取消17行的注释
ansible-play test1.yml -K
#表示输入密码
#-K:内部声明更改用户,使用-K

指定用户操作

ansible-playbook test1.yml -u root -k
#如果没有声明更改用户,可以在外部指定用户
#-u:指定用户
#-k:手动输入密码

实例模板2:

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

#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.20
  remote_user: root
  vars:
    groupname: zyg
    username: hmbb
  tasks:
   - name: create group
     group:
       name: "{{ groupname }}"
#引用前面设定好的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']['adress']}}"
       dest: /opt/bqb.txt

字典方式:

  vars:
    groupname: zyg
    username: hmbb

使用的是key-value的方式

使用符号-开头表示这是一个列表

表示包含所有主机变量的字典

 "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['adress'] }}"
 #表示包含所有主机变量的字典
 #inventory_hostname:目标主机的主机名
 #['ansible_default_ipv4']['adress']:获取目标主机名
 #表示获取目标主机的IP地址复制到目标文件里

外部传参

ansible-playbook test2.yml -e 'username=yst groupname=ymr'
#外部传参

playbook的条件判断

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

#this is when test
- hosts: all
#可以用主机的IP地址也可以使用组名
  remote_user: root
  tasks:
   - name: test when
     debug:
       msg: '位置判断'
#相当于shell脚本中的echo。满足条件就会打印。不满足则不打印
#msg:表示输出的内容
     when: ansible_default_ipv4.address == '20.0.0.30'

playbook当中的循环

ansible有多种循环格式。with_items:循环遍历

- hosts: 20.0.0.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,会把itme的值。遍历列表当中的a,b,c,d.
#虽然声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历。

分组打印列表

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_list:
      - [a,b,c,d]
      - [1,2,3,4]
#with_list:分组打印

遍历循环在主机上创建目录

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - name: create file
     file:
      path: "{{ item }}"
      state: touch
     with_items:
      - [/opt/a,/opt/b,/opt/c,/opt/d]
      - [/opt/1,/opt/2,/opt/3,/opt/4]

方法2:
- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
    - name: create file
      file:
        path: "{{ item }}"
        state: touch
      with_list:
        - /opt/a
        - /opt/b
        - /opt/c
        - /opt/d
        - /opt/1
        - /opt/2
        - /opt/3
        - /opt/4

同一列的数据组合输出

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_together:
      - [a,b,c,d]
      - [1,2,3,4]
#with_together:组循环,列表当中的值一一对应,打印出来。
#适用于组合搭配

根据列表数据循环匹配

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_nested:
      - [a,b,c,d]
      - [1,2,3,4]

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

四种循环方式:

with_items
#最常用
with_list
#列表分组循环
with_together
#列表对应的列,数据结合的方式循环
with_nested
#相当于双重循环,第一层定义了循环次数,第二层表示第一层的每个元素会循环几次

#这些都是单循环

Tenplates模块

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

jinja的作用:生成一个目标文本文件,传递变量到需要配置文件当中。

实验架构

vim /etc/httpd/conf/httpd.conf
#配置占位符。可以理解为声明的变量
vim /etc/ansible/hosts
#配置主机的占位符名称和j2文件中的占位符一致。可以理解为定义参数:占位符的参数声明好
vim /opt/httpd.yml
#在playbook当中,使用template模块来把参数传给目标主机的配置文件。
- 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
#使用template的模板
      notify:
        - restart httpd
    - name: create 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}} starte=restarted
#通过占位符,和python的转义复制到目标文件中

1、 先配置占位符。可以理解为声明的变量 2、 再配置主机的占位符名称和j2文件中的占位符一致。可以理解为定义参数:占位符的参数声明好 3、 最后在playbook当中,使用template模块来把参数传给目标主机的配置文件。

外部传参远程修改nginx的配置文件

- hosts: all
  remote_user: root
  vars:
    - package: nginx
    - service: nginx
  tasks:
    - name: install nginx
      yum: name={{package}}
    - name: install configure file
      template: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify:
        - restart nginx
    - name: create root_dir
      file:
        path: /opt/nginx/html/
        state: directory
    - name: start nginx
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart nginx
      service: name={{service}} state=restarted

tags模块

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

-name
 tags:
   debug:
 --tags debug
 --start-at-task='wdf'

任务标签的种类

always:不管你是否制定了允许标签,任务都会执行。

never:不管是否运行了指定标签,该任务也不会执行。

debug:调试任务

setup:手机主机信息

还可以自定义标签

per_tasks:指定标签之前的任务

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

- hosts: all
  remote_user: root
  tasks:
   - name: tag debug
     debug:
       msg: "this is demo1"
     tags:
       - debug
#声明项目的名称
   - name: tag setup
     setup:
     tags:
       - setup
   - name: tag always
     debug:
       msg: "run"
     tags:
       - always
   - name: tag never
     debug:
       msg: "never run"
     tags:
       - never

ansible-playbook demo1.yml --tags="debug"
#运行指定标签debug
#如果指定标签never也可以运行
#只有always是一直在运行

Roles模块

角色模块:每个主题就是一个角色

在ansible当中,层次化,结构化的组织playbook。使用了Rolse(角色)。可以更具层次结构,自动装载变量文件,task以及handlers等等

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

roles的结构图:

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

子目录:

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

templates:存放j2的模板文件

tasks:包含任务的目录---子目录下---main.yml。定义角色运行的任务

handlers:包含处理器的目录--子目录下--main.yml。

vars:存放角色需要引用变量的目录--子目录下--main.yml。

defaults:包含默认变量的目录---子目录下---main.yml。

meta:包含元信息的目录---子目录下--main.yml。

site.yml:统筹调用所有的配置文件。

实验搭建:

三个服务: http mysql php

cd /etc/ansible/roles/
mkdir httpd mysql php

vim httpd/tasks/main.yml
#配置httpd
- name: install httpd
  yum: name={{pkg}}
- name: start httpd
  service: enabled=true name={{svc}} state=started

vim httpd/vars/main.yml
#配置http服务的名称进行外部传参
pkg: httpd
svc: httpd

vim mysql/tasks/main.yml
- name: install mysql
  yum: name={{pkg}}
- name: start mysql
  service: enabled=true name={{svc}} state=started

vim mysql/vars/main.yml 
pkg:
  - mariadb
  - mariadb-server
svc: mariadb

vim php/tasks/main.yml
- name: install php
  yum: name={{pkg}}
- name: start php-fpm
  service: enabled=true name={{svc}} state=started

vim php/vars/main.yml
pkg:
  - php
  - php-fpm
svc: php-fpm

vim sit.yml
#定义总控制
- hosts: 20.0.0.20
  remote_user: root
  roles:
    - httpd
    - mysql
    - php

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

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

相关文章

计算机网络3

1.三种通信方式 2.失真 (码间串扰:码元传输速率过快导致) 3.奈氏准则 4.香农定理 5.基带and宽带信号 6.编码与调制 ​​​​​​​7.数据交换方式 1.电路交换及优缺点 2.报文交换及优缺点 3.分组交换及优缺点 8.数据交换方式的选择和特点…

智能图像编辑软件Luminar Neo mac提供多种调整和滤镜选项

Luminar Neo mac是一款由Skylum公司开发的AI技术图像编辑软件,旨在为摄影师和视觉艺术家提供创意图像编辑解决方案。Luminar Neo拥有强大的AI技术和丰富的后期处理工具,可帮助用户快速轻松地实现从基本到高级的图像编辑需求。 Luminar Neo提供了多种调整…

电商行业的生存环境如何,比较占优势的发展模式有哪些?

我是电商珠珠 随着互联网技术的发展和普及,电商行业已经成为了当今社会不可或缺的一部分。在改变人们生活娱乐习惯的同时,还带动了整个产业链的变革。 据统计,全球电商交易额已经达到了数万亿美元,且仍在快速增长。 在电商行业…

【lesson20】MySQL复合查询(1)基本查询回顾、多表查询和自连接

文章目录 基本查询回顾建表插入数据实例 多表查询建表插入数据实例 自连接建表插入数据实例 基本查询回顾 建表 插入数据 实例 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J 按照部门号升序而雇员的工资降序排序 使用年薪进行降…

无约束优化问题求解笔记(2):最速下降法

目录 3. 最速下降法3.1 最速下降法的基本思想3.2 基于精确搜索的最速下降法3.3 基于精确搜索的最速下降法的程序实现3.4 基于精确搜索的最速下降法的缺点 Reference 3. 最速下降法 3.1 最速下降法的基本思想 最速下降法是典型的线搜索方法. 设 f f f 是 R n \mathbb{R}^n R…

操作系统大会2023 | 麒麟信安根植openEuler社区,全场景·同生态·共未来

12月15-16日,以“崛起数字时代 引领数智未来”为主题的操作系统大会 &openEuler Summit 2023在北京举行。产业组织、开放原子开源基金会、学术领袖、行业用户、生态伙伴以及开发者等,共同探讨操作系统产业发展方向和未来机遇,展示最新合作…

playbook

playbook list together nested with_items Templates 模版 jinja模版架构,通过模版可以实现向模版文件传参(python转义)把占位符参数传到配置文件中去。 生成一个目标文本文件,传递变量到需要配置文件当中(web开…

el-table 实现行拖拽排序

element ui 表格实现拖拽排序的功能&#xff0c;可以借助第三方插件Sortablejs来实现。 引入sortablejs npm install sortablejs --save组件中使用 import Sortable from sortablejs;<el-table ref"el-table":data"listData" row-key"id" …

R语言【cli】——cli_warn可以更便捷的在控制台输出警告信息

Package cli version 3.6.2 cli_warn(message, ..., .envir parent.frame()) 参数【message】&#xff1a;它是通过调用 cli_bullets() 进行格式化的。进一步地&#xff0c;还需要调用 inline-makeup&#xff08;内联标记&#xff09;。 参数【...】&#xff1a;传递给 rlan…

Ubuntu 常用命令之 unzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件&#xff0c;并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中&#xff0c;zipfile是要解压的.zi…

谷歌浏览器最新chrome94版本CORS跨域问题

提示Access to XMLHttpRequest at http://localhost:xxxx/api from origin http://xxx.xxx.com:xxxx has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space local. 解决办法&#xff1a; 打开浏览…

python核心阶段(七)—— 包&模块以及虚拟环境

1.包&模块 概念解释 模块&#xff1a;为了使代码容易维护&#xff0c;可以将一组功能相关的代码写入一个单独的.py文件中&#xff0c;这个.py文件 就被称作一个模块 包&#xff1a; 包是指一个有层次的文件目录结构&#xff0c;它包含多个相关模块或子包&…

16 Vue3中使用v-model绑定多选框

概述 使用v-model绑定多选框也是一种比较常见的需求&#xff0c;比如一个用户可以绑定多个角色&#xff0c;可以有多个兴趣爱好。 在本节课中&#xff0c;我们来学习一下这两种用法。 基本用法 我们创建src/components/Demo16.vue&#xff0c;在这个组件中&#xff0c;我们…

探索中文电码:起源、标准与实践

一、引言 中文电码是一种将中文文字转换为计算机可识别和处理的二进制编码。随着信息技术的发展&#xff0c;中文电码在各个领域得到了广泛的应用&#xff0c;如计算机编程、通信、文字处理等。本文将从起源、标准和发展三个方面深入探讨中文电码&#xff0c;以期帮助读者更好…

华为云Astro Zero零代码构建HDC展点打卡应用——实验指导

Astro轻应用&#xff08;即Astro Zero&#xff09;是华为云统一低代码平台Astro的子服务之一&#xff0c;让开发者通过简单的拖拽配置完成应用搭建。平台提供丰富的轻应用模板&#xff0c;包括办公管理、人事管理、项目管理、运营推广、培训赋能等领域&#xff0c;开发者可基于…

链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)

在上一篇文章中&#xff0c;我们探索了顺序表这一基础的数据结构&#xff0c;它提供了一种有序存储数据的方法&#xff0c;使得数据的访 问和操作变得更加高效。想要进一步了解&#xff0c;大家可以移步于上一篇文章&#xff1a;探索顺序表&#xff1a;数据结构中的秩序之美 今…

Spring Cloud Alibaba核心技术宝典,分布式系统中间件实战案例(百度云下载)

前言 《Spring Cloud Alibaba学习笔记》其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。…

系列十二(面试)、Java中的GC回收类型有哪些?

一、Java中的GC回收类型 1.1、概述 Java中的GC回收类型主要包含以下几种&#xff0c;即&#xff1a;UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC。 1.2、源码

VMware Ubuntu虚拟机忘记密码

​​原文 https://blog.csdn.net/ezconn/article/details/89328024​​​​​​​ 前言&#xff1a; 在VMware运行Ubuntu虚拟机时&#xff0c;开机之后忘记密码怎么办&#xff1f; 环境&#xff1a;Ubuntu版本&#xff1a;ubuntu-16.04.6-server-amd64&#xff1b;VMware版本…

系列十一(面试)、如何查看JVM的参数?

一、查看JVM的参数 1.1、概述 上篇文章介绍了JVM的参数类型&#xff0c;通过jinfo可以查看JVM的默认参数&#xff0c;本章介绍另外一种查看JVM参数的方式。 1.2、 分类 JVM中提供了三种方式查看JVM的参数信息&#xff0c;这三种方式又分为两类&#xff0c;即&#xff1a;查看默…