Ansible的脚本-----playbook剧本【上】

news2024/9/23 13:22:00

目录

1.playbook剧本组成

2.playbook剧本实战演练

2.1 实战演练一:给被管理主机安装httpd服务

2.2 实战演练二:定义、引用变量

2.3 实战演练三:指定远程主机sudo切换用户

2.4 实战演练四:when条件判断

2.5 实战演练五:迭代循环

3.总结


1.playbook剧本组成

(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色

2.playbook剧本实战演练

示例:
vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:     #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.1 实战演练一:给被管理主机安装httpd服务

在ansible服务器主机,给远程被管理主机制作安装httpd服务的剧本文件play1.yam

mkdir playbook
cd playbook/
vim play1.yaml
- name: first play
  gather_facts: false
  hosts: dbservers
  remote_user: root
  tasks:
  - name: disable firewalld
    service: name=firewalld state=stopped enabled=no
  - name: disable selinux
    command: 'setenforce 0'
    ignore_errors: true
  - name: mount cdrom
    mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
  - name: install httpd
    yum: name=httpd state=latest
  - name: start httpd
    service: name=httpd state=started enabled=yes

运行playbook

ansible-playbook play1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook play1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook play1.yaml --list-task       #检查tasks任务
ansible-playbook play1.yaml --list-hosts      #检查生效的主机
ansible-playbook play1.yaml --start-at-task='install httpd'     #指定从某个task开始运行


被控制端验证安装情况

添加触发器

scp /etc/httpd/conf/httpd.conf 192.168.9.114:/opt/ #将httpd服务端下的httpd.conf文件复制到ansible服务器

vim /opt/httpd.conf       ansible服务器
修改42行端口为8080,以便测试
vim play1.yaml
- name: first play
  gather_facts: false
  hosts: dbservers
  remote_user: root
  tasks:
  - name: disable firewalld
    service: name=firewalld state=stopped enabled=no
  - name: disable selinux
    command: 'setenforce 0'
    ignore_errors: true
  - name: mount cdrom
    mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
  - name: install httpd
    yum: name=httpd state=latest
  - name: copy config file
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
    notify: "reload httpd"
  - name: start httpd
    service: name=httpd state=started enabled=yes
  handlers:
  - name: reload httpd
    service: name=httpd state=reloaded

ansible-playbook play1.yaml --syntax-check
ansible-playbook play1.yaml


被控制端查看端口是否同步

2.2 实战演练二:定义、引用变量

vim play2.yaml
- name: second play
  remote_user: root
  hosts: dbservers
  vars:
  - myname: scj
  - myclass: xy101
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}

ansible-playbook play2.yaml --syntax-check
ansible-playbook play2.yaml


被控制主机验证

使用facts信息做变量

vim play2.yaml

- name: second play
  remote_user: root
  hosts: dbservers
  gather_facts: true
  vars:
  - myname: scj
  - myclass: xy101
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}

  - name: copy file
    copy: content={{ansible_default_ipv4}} dest=/opt/ipv4.txt

ansible-playbook play2.yaml


被控制节点验证

指定子字段名称查看具体内容,获取子字段内容,使用.13.51解释

vim play2.yaml
- name: second play
  remote_user: root
  hosts: dbservers
  gather_facts: true
  vars:
  - myname: scj
  - myclass: xy101
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}

  - name: copy file
    copy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txt

ansible-playbook play2.yaml


被控制节点验证

运行时指定变量

ansible-playbook play2.yaml -e 'myname=zhuxiang'    #在命令行里定义变量


2.3 实战演练三:指定远程主机sudo切换用户

vim /etc/sudoers       #被控制节点为用户授权并设置密码
zhuxiang ALL=(ALL) ALL

echo 123456 | passwd --stdin zhuxiang


vim play2.yaml
- name: second play
  remote_user: zhuxiang
  become: yes                              #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root                        #指定sudo用户为root
  hosts: dbservers
  gather_facts: true
  vars:
  - myname: wangwang
  - myclass: xy102
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}

  - name: copy file
    copy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txt

ansible-playbook play2.yaml -k -K
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码

被控制节点验证

2.4 实战演练四:when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

vim play3.yaml
- name: third play
  remote_user: root
  hosts: webservers
  gather_facts: true
  tasks:
  - name: copy scj.sh to 9.111
    copy: src=/opt/scj.sh dest=/opt
    when: ansible_default_ipv4.address == "192.168.9.111"

  - name: run sjc.sh on 9.113
    script: '/opt/scj.sh scj tangjun'
    when: inventory_hostname != "192.168.9.111"

192.168.9.111节点

192.168.9.113节点

2.5 实战演练五:迭代循环

vim play4.yaml
- name: four play
  remote_user: root
  hosts: dbservers
  gather_facts: no
  tasks:
  - debug: msg="{{item}}"
    with_items:
    - a
    - b
    - c

ansible-playbook  play4.yaml


迭代创建用户

vim play4.yaml

- name: four play
  remote_user: root
  hosts: dbservers
  gather_facts: no
  tasks:
  - name: create users
    user: name={{item}} groups=xy101
    with_items:
    - zhang
    - san
    - li

ansible-playbook  play4.yaml


被控制节点验证

vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功

创建多个用户并加入不同组

vim play4.yaml
- name: four play
  remote_user: root
  hosts: dbservers
  gather_facts: no
  vars:
  - mygroups: ["xy1", "xy2", "xy3"]
  tasks:
  - name: create groups
    group: name={{item}}
    with_items: "{{mygroups}}"

  - name: create users
    user: name={{item.myname}} groups={{item.myclass}}
    with_items:
    - myname: si
      myclass: xy1
    - myname: wang
      myclass: xy2
    - myname: wu
      myclass: xy3
ansible-playbook play4.yaml


被控制节点验证

vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功

3.总结

playbook剧本的格式


vim XXX.yaml   XXX.yml
- name:                        #设置play的名称(一个playbook文件里可以有多个play)
  hosts:                       #设置执行此play的远程主机组,多个组用 : 分隔
  remote_user:                 #设置在远程主机执行此play的用户名,默认为root
  become: yes                  #设置是否需要在远程主机sudo切换执行任务
  become_user: root            #设置sudo切换的用户,一般为root
  gather_facts: true|false     #设置是否收集facts信息,默认为true
  vars:                        #设置此play中使用的自定义变量
  - 变量1: 值1
  - 变量2: 值2
  tasks:                       #设置此play的任务列表
  - name:                         #定义任务的名称
    模块名: 模块参数              #定义此任务要使用的模块和参数(键值对格式 key=value)
  - name:           
    模块名: 模块参数
    ignore_errors: true           #忽略此任务可能的失败(如果不忽略,则任务失败会导致中断后续任务的执行)
  - name:           
    模块名: 模块参数
    when: 条件表达式              #条件表达式成立则执行此任务,不成立则不执行此任务
  - name:           
    模块名: 模块参数={{item}}     #循环遍历
    with_items:                   #定义循环的取值列表
  - name:           
    模块名: 模块参数
    notify: '任务名'              #定义此任务执行状态为changed时要触发的handler任务

  handlers:                    #设置notify触发的任务
  - name: 任务名
    模块名: 模块参数


playbook运行命令
ansible-playbook XXX.yaml -u <远程用户> -k
                          --become-user <sudo切换的用户> -K
                          --syntax-check
						  --list-task
						  --list-hosts
						  --start-at-task="任务名"
                          -e "变量=值"

模块参数的格式
横向格式:
  模块名: 参数1=值  参数2={{变量名}}  ....

纵向格式:
  模块名: 
    参数1: 值
    参数2: "{{变量名}}"
    ....


vars 和 with_items 的格式
#值为纯量类型时:
tasks:
- name:
  模块名: 参数1={{item}}
  with_items:
  - 值1                                 #纵向格式:
  - 值2
  ....

tasks:
- name:
  模块名: 参数1={{item}}
  with_items: ["值1", "值2", ....]     #横向格式


#先使用vars定义循环取值列表,再用with_items引用vars的变量
vars:
- 变量1:
  - 值1                                #纵向格式
  - 值2
  ....
- 变量2: ["值1", "值2", ....]          #横向格式

tasks:
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量1}}"         #使用with_items引用vars的变量
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量2}}"
  

#当值为对象类型(键值对)时:
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
  
  with_items:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
	
	
vars:
- 变量1: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
- 变量2:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: "{{变量1}}"	

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

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

相关文章

Docker Compose V2 安装 ClickHouse v20.6.8.5 经验分享

前言 ClickHouse 是一款开源的分布式列式数据库管理系统,专门设计用于高性能的大数据分析和查询。 目前项目中用到的一个场景是将mongo的数据同步到clickhouse,使用clickhouse做报表,后续也将分享同步和使用方案 使用 Docker Compose 部署单机版,小项目和自己测试够用了,生…

【C#】visual studio打包winForm(依赖DLL)为安装程序exe

0.简介 IDE&#xff1a;VS2022 平台&#xff1a;C# .NetFramework4.7 WinForm界面 有GDAL、EEplus库的依赖&#xff0c;所以在其他未安装环境的电脑中功能无法使用。 1. 安装 1.1 运行文件 在VS扩展中选择管理扩展&#xff0c;Microsoft Visual Studio Installer Projects …

C#测试控制台程序调用Quartz.NET的基本用法

Quartz.Net是常用的任务调用框架之一&#xff0c;既能在客户端程序中使用&#xff0c;也支持在网页程序后台调用。本文结合参考文献4中的示例代码学习其在控制台程序中的基本用法。   VS2022新建控制台项目&#xff0c;在Nuget包管理器中搜索并安装Quartz包&#xff0c;如下所…

51单片机嵌入式开发:18、STC89C52RC嵌入式DS1302实时时钟实验及数码管显示

STC89C52RC嵌入式DS1302实时时钟实验及数码管显示 STC89C52RC嵌入式DS1302实时时钟实验及数码管显示1 概述1.1 DS1302简介1.2 DS1302功能和特点1.3 DS1302工作原理1.4 DS1302应用领域 2 DS1302设计原理2.1 引脚说明2.2 寄存器说明及使用&#xff08;1&#xff09;命令cmd字节说…

Redis的缓存问题:缓存穿透、缓存击穿和缓存雪崩

目录 一、缓存穿透 1、问题描述 2、解决方案 二、缓存击穿 1、问题描述 2、解决方案 三、缓存雪崩 1、问题描述 2、解决方案 3、雪崩案例 一、缓存穿透 1、问题描述 缓存穿透指的是⼤量请求的 key根本不存在于缓存中&#xff0c;每次针对此key的请求从缓存获取不到…

报红:找不到名称ref ts(2304)、‘ref‘ is not defined. eslint(no-undef)

接上篇 在上篇介绍了使用 unplugin-auto-import 和 unplugin-vue-components 配置完成后&#xff0c;项目可以正常运行&#xff0c;并且页面也正常显示&#xff0c;但vscode里就是报红 这个报红可能是由于 ts 发出的&#xff0c;也可能是由于 eslint 发出的 具体可以用鼠标…

如何使用 API list 极狐GitLab 群组中的镜像仓库?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NetSecConfigAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件&#xff0c;限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件&#xff0c;指定要访问的域名 [ro…

大语言模型推理优化--键值缓存--Key-value Cache

文章目录 一、生成式预训练语言模型 GPT 模型结构二、FastServe 框架三、Key-value Cache1.大模型推理的冗余计算2.Self Attention3.KV Cache 一、生成式预训练语言模型 GPT 模型结构 目前&#xff0c;深度神经网络推理服务系统已经有一些工作针对生成式预训练语言模型 GPT 的独…

【Gin】架构的精妙编织:Gin框架中组合模式的革新实践与技术深度解析(上)

【Gin】架构的精妙编织&#xff1a;Gin框架中组合模式的革新实践与技术深度解析(上) 大家好 我是寸铁&#x1f44a; 【Gin】架构的精妙编织&#xff1a;Gin框架中组合模式的革新实践与技术深度解析(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分…

QT--线程

一、线程QThread QThread 类提供不依赖平台的管理线程的方法&#xff0c;如果要设计多线程程序&#xff0c;一般是从 QThread继承定义一个线程类&#xff0c;在自定义线程类里进行任务处理。qt拥有一个GUI线程,该线程阻塞式监控窗体,来自任何用户的操作都会被gui捕获到,并处理…

Umi-OCR:功能强大且易于使用的本地照片识别软件

Umi-OCR是一款开源且免费的离线OCR&#xff08;光学字符识别&#xff09;软件&#xff0c;可让您轻松从照片中提取文本。它支持多种语言&#xff0c;并具有许多其他功能使其成为照片识别任务的绝佳选择。 Umi-OCR的优势 离线操作&#xff1a; Umi-OCR无需互联网连接即可工作&…

Python实现websocket连接服务器报rejected WebSocket connection: HTTP 401

1. websockets报HTTP 401解决办法 代码如下&#xff1a; #!/usr/bin/env python import asyncio import websockets import requestsuri ws://192.168.20.167/websocket msg {"type":6,"param":{"businessType":3,"cmd":1,"f…

mysql 数据库空间统计sql

mysql 数据库空间统计 文章目录 mysql 数据库空间统计说明一、数据库存储代码二、查询某个数据库的所有表的 代码总结 说明 INFORMATION_SCHEMA Table Reference 表参考 information_schema是‌MySQL中的一个特殊数据库&#xff0c;它存储了关于所有其他数据库的元数据信息。…

20240724-然后用idea创建一个Java项目/配置maven环境/本地仓储配置

1.创建一个java项目 &#xff08;1&#xff09;点击页面的create project&#xff0c;然后next &#xff08;2&#xff09;不勾选&#xff0c;继续next &#xff08;3&#xff09;选择新项目名称&#xff0c;新项目路径&#xff0c;然后Finsh&#xff0c;在新打开的页面选择…

无人机上磁航技术详解

磁航技术&#xff0c;也被称为地磁导航&#xff0c;是一种利用地球磁场信息来实现导航的技术。在无人机领域&#xff0c;磁航技术主要用于辅助惯性导航系统&#xff08;INS&#xff09;进行航向角的测量与校正&#xff0c;提高无人机的飞行稳定性和准确性。其技术原理是&#x…

康谋分享 | 自动驾驶联合仿真——功能模型接口FMI(四)

在上一篇文章 “康谋分享 | 自动驾驶联合仿真——功能模型接口FMI&#xff08;三&#xff09;”&#xff0c;我们讲述了在构建FMU中&#xff0c;如何通过fmi_simple_car.cpp来实现FMI2.0&#xff0c;即如何实现一个简单的车辆模型来进行车辆动力学仿真。今天康谋接着展示如何通…

MFC与QT中禁用Esc、Alt+F4、关闭图标

在业务中&#xff0c;我们需要按指定的方式才能关闭当前对话框。如下图需输入密码点击确认后&#xff0c;界面才能关闭。 1.禁用关闭按钮 在对话框初始化部分添加将关闭按钮禁用 //MFC CMenu *pSysMenu GetSystemMenu(FALSE); ASSERT(pSysMenu ! NULL); pSysMenu->EnableM…

Visual Studio Code + vue快速安装配置Node.js+Vue+webpack+vscode

第一部分&#xff1a;Node.js 第一步&#xff1a;下载Node.js 方法1&#xff1a;链接 下载 | Node.js 中文网 (nodejs.cn) 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1zIqu8H9rb_I1i-1OWD7swQ?pwdaurk 提取码&#xff1a;aurk --来自百度网盘…