ansible剧本快速上手

playbook剧本介绍

  • 是什么:能户长期保存,且能实现批量配置、部署…的文件
  • 格式:yaml格式。用 空格 冒号 头号 句号
  • 语法检测:ansible-playbook --syntax-check install-zabbix.yaml或则 -C检测
  • 取消默认任务:gather_facts: no
剧本ans ad-hoc
共同点批量管理,使用了模块
区别重复使用一次性使用
应用场景大规模部署服务用于少量测试
ansible命令说明
-C | --syntax-check语法检测
–step单步运行,每次输入yes进入下一步
-t + 自定义的步骤名称只运行指定的步骤
---
- hosts: alltasks:- name: 01 oneshell: echo 01 >/tmp/one.log- name: 02 secendshell: echo 02 >/tmp/two.log- name: 03 threeshell: echo 03 >/tmp/two.log

在这里插入图片描述

使用案例

file和copy

1.在客户端创建/test/dir1

2.把本地hosts文件放入创建好的目录

这是一种简单的写法:

- hosts: alltasks:- name: 01 create directorfile: path=/test/dir1 state=directory- name: 02 flader filecopy: src=/etc/hosts dest=/test/dir1

第2中写法,最常用:

- hosts: alltasks:- name: 01 create directorfile:path: /test/dir1 state: directory- name: 02 flader file。# copy 远端主机的文件到指定目录copy:src: /etc/hostsdest: /test/dir1

3.执行剧本,以方式2为例

ansible-playbook role.yaml -i hosts

查看文件

cat /test/dir1/hosts 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# 这是ansible主机传过来的文件

安装软件

validate_certs: no,不检查证书

- hosts: alltasks:- name: 01下载安装软件get_url:url: "https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.3/rhel/7/x86_64/zabbix-agent-6.4.1-rc2.release1.el7.x86_64.rpm"dest: /tmp/validate_certs: no- name: 02yum安装yum:name: /tmp/zabbix-agent-6.4.1-rc2.release1.el7.x86_64.rpmstate: present- name: 03配置zabbixdebug:msg: "进行配置zabbix"- name: 04启动zabbixsystemd:name: zabbix-agentenabled: yesstate: started

部署nfs并挂载

- hosts: nfstasks:- name: 01下载nfsyum:name: nfs-utils,rpcbindstate: installed- name: 02修改配置文件lineinfile:path: /etc/exportsline: "/backup-nfs 172.16.1.0/24(rw,all_squash,anonuid=666,anongid=666)"create: true#也还可以用copy模块#copy:#content: "/backup-nfs 172.16.1.0/24(rw,all_squash,anonuid=666,anongid=666)"#dest: /etc/exports- name: 02-1创建组wwwgroup:name: wwwgid: 666state: present- name: 02-2创建用户wwwuser:name: wwwuid: 666group: wwwshell: /sbin/nologincreate_home: nostate: present- name: 03创建共享目录file:path: /backup-nfsstate: directoryowner: wwwgroup: www- name: 04-1启动rpncbindsystemd:name: rpcbindenabled: yesstate: started- name: 04-2启动nfssystemd:name: nfsenabled: yesstate: started        
- hosts: webtasks:- name: 01安装nfsyum:name: nfs-utilsstate: present- name: 02挂载mount:src: 172.16.1.31:/backup-nfspath: /mntfstype: nfsstate: mounted

剧本中的变量

自定义变量

手动在剧本中定义

1.在剧本中定义一个目录变量,此变量只会在当前剧本中生效

- hosts: all# 自定义一个关于目录的变量vars:dir: /wzy/wzy/wzytasks:- name: 创建变量中的目录file:path: "{{dir}}"state: directory- name: debug测试变量空格问题debug:msg: "变量内容:{{ dir }}"

引用变量时,什么时候加引号?

1️⃣加引号:应用的变量单独开头时,如上方:path: “{{dir}}”

2️⃣不加引号:变量前有参数了。path: /test/{{dir}}

  • 案例2,定义多个变量
- hosts: nfsvars:- p1: tree- p2: sltasks:- name: 安装软件yum:name:- "{{ p1 }}"- "{{ p2 }}"state: present
  • 案例3一个变量含有多个值
- hosts: webvars:- pk:- 'sl'- 'cowsay'tasks:- name: 安装软件yum:name: "{{ pk }}"state: present

使用变量文件定义

  • 变量文件是:供其他剧本文件调用其中的变量

1.写一个变量文件vars.yaml

user: www
dir: /tmp/wzy/wzy/wzy
file: /etc/hosts

2.写一个普通的yaml文件

- hosts: allvars_files: ./vars.yamltasks:- name: 引用变量文件中的变量file:path: "{{dir}}"state: directory- name:copy:src: "{{file}}"dest: /tmp/

分组变量

  • 分组变量的特点:自动寻找属于改组的变量

1.准备组变量文件

[root@gitlabansible]# cat group_vars/web/vars.yaml 
user: web_user
[root@gitlabansible]# cat group_vars/db/vars.yaml 
user: db_user

2.书写剧本

cat 12-group_variable.yaml 
- hosts: webgather_facts: falsetasks:- name: 测试web组变量是否可用debug:msg: "web组的user变量值是{{ user }}"- hosts: dbgather_facts: falsetasks:- name: 测试db组变量是否可用debug:msg: "db组的user变量值是{{ hostvars['10.0.0.51']['user'] }}"- name: 获取db组的主机列表debug:msg: "db组的主机是{{ groups['db'] }}"

3.host列表如下:

[root@gitlabansible]# cat hosts
[web]
10.0.0.62[db]
10.0.0.51

4.执行剧本

PLAY [web] TASK [测试web组变量是否可用] 
ok: [10.0.0.62] => {"msg": "web组的user变量值是web_user"
}PLAY [db] TASK [测试db组变量是否可用] 
ok: [10.0.0.51] => {"msg": "db组的user变量值是db_user"
}TASK [获取db组的主机列表] 
ok: [10.0.0.51] => {"msg": "db组的主机是[u'10.0.0.51']"
}

register注册变量

  • 本质是 `反引号` ,把结果赋值给了register
  • 通过命令获取的内容都会存放到 Register 变量中

1.使用shell模块把当前时间注册为一个变量

- hosts: alltasks:- name: 定义一个shell,获取时间shell: date +%Fregister: result- name: 打印出date变量debug:msg: "date变量结果是{{result}}"

2.运行后发现结果是一堆json格式的数据。在,回车分隔原始数据后:

也叫键|值,也就是原变量|变量值

ok: [10.0.0.7] => {"msg": "date变量结果是{'stderr_lines': [], u'changed': True, u'end': u'2024-04-29 17:08:36.889077', 'failed': False, u'stdout': u'2024-04-29', u'cmd': u'date +%F', u'rc': 0, u'start': u'2024-04-29 17:08:36.873612', u'stderr': u'', u'delta': u'0:00:00.015465', 'stdout_lines': [u'2024-04-29']}"
}

3.若要取出单独的时间,需要改为 msg: "date变量结果是{{result.stdout}}" ,即要标出输出

在这里插入图片描述

facts变量

  • facts变量相当于是ansible内置变量,存放被管理机器的基本信息

  • 当管理不同的主机 CentOS、Ubuntu 时,可以使用 when 判断配合 facts 变量实现不同的操作

  • 用于记录主机信息的变量,关闭facts变量后可以加速剧本的执行

  • 默认开启,关闭方法:gather_facts: no

    • - hosts: webgather_facts: false
      
  • 查看主机的facts变量:ansible -i hosts web -m setup

在这里插入图片描述

2.使用facts变量查看主机信息

- hosts: webtasks:- name: 收集主机信息debug:msg: |你的系统版本是{{ansible_distribution}}你的主机名是{{ansible_hostname}}你的CPU架构是{{ansible_architecture}}你的eth0 IP是{{ansible_eth0.ipv4.address}}

运行结果如下:

ok: [10.0.0.7] => {"msg": "你的系统版本是CentOS\n你的主机名是web01\n你的CPU架构是x86_64\n你的eth0 IP是10.0.0.7\n"
}

.j2 模版

  • 假设一个文件中含有变量,host=ansible_hostname,传输过去时要体现出host=web01,要怎么实现呢?
  • 实现:传输变量文件.j2,不要用copy,而是template

1.编辑 motd.j2 文件

host={{ ansible_hostname }}

2.准备yaml

- hosts: webgather_facts: falsetasks:- name: copy motd.j2 到/tmp 下copy:src: motd.j2dest: /tmp/motdbackup: false- hosts: ubgather_facts: falsetasks:- name: copy motd.j2 到/root 下template:src: motd.j2dest: /rootbackup: false

3.1查看 web主机:web01/tmp/motd.j2 ,变量没有生效,文件内容依旧是字符串,并没有把内置的facts变量解析出来

[root@web01~]# cat /tmp/motd.j2 
host: {{ ansible_hostname }}

3.2查看Ubuntu/root/motd.j2,j2变量已经生效,显示出了主机名

root@U-Desk:~# cat /root/motd.j2 
host: U-Desk

案例2 .j2配合vars传输配置文件

  • 使用方法:
    • templates/conf.j2:{{ 变量1 }}
      acts: false
      tasks:
    • name: copy motd.j2 到/root 下
      template:
      src: motd.j2
      dest: /root
      backup: false

3.1查看 web主机:web01/tmp/motd.j2 ,变量没有生效,文件内容依旧是字符串,并没有把内置的facts变量解析出来```bash
[root@web01~]# cat /tmp/motd.j2 
host: {{ ansible_hostname }}

3.2查看Ubuntu/root/motd.j2,j2变量已经生效,显示出了主机名

root@U-Desk:~# cat /root/motd.j2 
host: U-Desk

案例2 .j2配合vars传输配置文件

  • 使用方法:
    • templates/conf.j2:{{ 变量1 }}
    • vars/main.yml: 变量1: 变量值1

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…

重新定义页签!Choerodon UI Tabs让管理更高效

01 引言 Tabs 组件通过提供平级区域&#xff0c;将大块内容进行有效的收纳和展现&#xff0c;从而保持界面整洁。但在企业应用的快速发展中&#xff0c;这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…

Eureka学习笔记-服务端

Eureka学习笔记 服务端 模块设计 Resources &#xff1a;这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外&#xff0c;其他的 Server 在同步 Registry 时也需要调用这些接口。Controller &#xff1a;这里提…

Java创建对象有几种方式?

大家好&#xff0c;我是锋哥。今天分享关于【Java创建对象有几种方式?】面试题。希望对大家有帮助&#xff1b; Java创建对象有几种方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Java 中&#xff0c;创建对象的方式主要有几种。以下是常见的几种对象创…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

[LeetCode-Python版]21. 合并两个有序链表(迭代+递归两种解法)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#x…

【C++】- 掌握STL List类:带你探索双向链表的魅力

文章目录 前言&#xff1a;一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…

Facebook的隐私保护政策:用户数据如何在平台上被管理?

在当今数字化世界&#xff0c;社交平台如何管理用户数据并保护隐私成为了一个热点话题。作为全球最大的社交网络&#xff0c;Facebook&#xff08;现Meta&#xff09;在数据隐私方面的政策备受关注。本文将简要介绍Facebook的隐私保护措施&#xff0c;以及用户数据如何在平台上…

Git-分支(branch)常用命令

分支 我们在做项目开发的时候&#xff0c;无论是软件项目还是其他机械工程项目&#xff0c;我们为了提高效率以及合理的节省时间等等原因&#xff0c;现在都不再是线性进行&#xff0c;而是将一个项目抽离出诸进行线&#xff0c;每一条线在git中我们就叫做分支&#xff0c;bran…

0101多级nginx代理websocket配置-nginx-web服务器

1. 前言 项目一些信息需要通过站内信主动推动给用户&#xff0c;使用websocket。web服务器选用nginx&#xff0c;但是域名是以前通过阿里云申请的&#xff0c;解析ip也是阿里云的服务器&#xff0c;甲方不希望更换域名。新的系统需要部署在内网服务器&#xff0c;简单拓扑图如…

Android Stduio 2024版本设置前进和后退按钮显示在主界面

Android Studio 2024&#xff08;Ladybug&#xff09;安装后发现前进和后退按钮不显示在主界面的工具栏&#xff0c;且以前在View中设置的办法无效&#xff1a; Android Studio 2024&#xff08;Ladybug&#xff09;的设置方式&#xff1a; File->Settings->Appearance&…

【C++算法】48.分治_归并_数组中的逆序对

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 剑指 Offer 51. 数组中的逆序对 题目描述&#xff1a; 解法 解法一&#xff1a;暴力解法&#xff1a;暴力枚举 两层for循环 本题不能用&#xff0c;用了会超时。 解法…

少样本学习之CAML算法

上下文感知元学习&#xff08;Context-Aware Meta-Learning, CAML&#xff09; 概述 在机器学习和深度学习领域&#xff0c;元学习&#xff08;Meta-Learning&#xff09;旨在通过学习如何学习&#xff0c;使模型能够在面对新任务时快速适应。传统的元学习方法通常需要在特定…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

leetcode 面试经典 150 题:长度最小的子数组

链接长度最小的子数组题序号209题型数组解题方法滑动窗口难度中等 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件…

多进程并发跑程序:pytest-xdist记录

多进程并发跑程序&#xff1a;pytest-xdist记录 pytest -s E:\testXdist\test_dandu.py pytest -s testXdist\test_dandu.py pytest -s &#xff1a;是按用例顺序依次跑用例 pytest -vs -n auto E:\testXdist\test_dandu.py pytest -vs -n auto&#xff0c;auto表示以全部进程…

Vue2二、指令补充,computed 计算属性vs方法,watch 侦听器,

一、指令补充 1.修饰符。2.动态操作class。3.动态操作style。4.v-model 用于其他表单元素 1.修饰符 ① 按键修饰符 keyup.enter → 键盘回车监听 <body><div id"app"><h3>keyup.enter → 监听键盘回车事件</h3><input v-model"…

spring\strust\springboot\isp前后端那些事儿

后端 一. 插入\更新一条数据&#xff08;老&#xff09; Map<String, Object> parameterMap MybatisUtil.initParameterSave("Send_ProjectFrozenLog", sendProjectFrozenLog); commonMapper.insert(parameterMap);parameterMap MybatisUtil.initParameter…

uniapp连接蓝牙操作(蓝牙设备地锁)

介绍&#xff1a; 本文采用uni-app框架来创建一个简单的用户界面&#xff0c;用于搜索、连接和发送命令给蓝牙设备。 1.打开蓝牙适配器 function openBluetooth() {uni.openBluetoothAdapter({success() {uni.offBluetoothDeviceFound();// 监听新设备发现事件uni.onBlueto…

安防监控Liveweb视频汇聚融合平台助力执法记录仪高效使用

Liveweb平台可接入的设备除了常见的智能分析网关与摄像头以外 &#xff0c;还可通过GB28181协议接入执法记录仪&#xff0c;实现对执法过程的全程监控与录像&#xff0c;并对执法轨迹与路径进行调阅回看。那么&#xff0c;如何做到执法记录仪高效使用呢&#xff1f; 由于执法记…