运维必会:ansible剧本(piaybook)

news2024/11/25 1:05:52

playbooks 概述以及实例操作

Playbooks 组成部分:

Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks: 任务,即调用模块完成的某些操作
Variables: 变量
Templates: 模板
Handlers: 处理器,由某时间触发执行的操作
Roles: 角色

YAML 介绍

YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言。

YAML Ain’t Markup Language,即YAML不是XML。

其特性:

可读性好
和脚本语言的交互性好
使用时限语言的数据类型
有一个一直的信息模型
易于实现
可以基于流来处理
表达能力强,扩展型好

YAML 语法

YAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、变量等数据结构。其结构(Structure)通过空格来展示,序列(Squence)里的项用-来代办,Map里的键值对用:分割

案例

name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gennder: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age: 13
        gender: Female

YAML 文件扩展名通常为: .yaml,如 example.yaml

List

列表中的所有元素均使用-打头,例如:

# A list of t asty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary

字典通过key与value进行表示,例如:

# An exployee record
name: Example Developer
job: Developer
skill: Elite

也可以将key:value 放置于{}中进行描述

# An exployee record
{name: Example Developer, job: Developer, skill: Elite}

Ansible 基础元素

变量

变量名仅能由字母、数字和下划线组成,且只能以字母开头。

facts

facts是由正在通信的远程目标主机发挥的信息,这些信息被保存在ansible变量中,要获取指定额远程主机所支持的所有facts,可以使用如下命令进行:

#ansible hostname -m setup

registre

把任务的输出定义为变量,然后用于其他任务,示例如下:

tasks:
- shell: /usr/bin/foo
  register: foo_result
  ignore_errors: true

通过命令传递变量

在运行playbook的时候也可以通过一些变量供playbook使用,示例如下:

ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"

通过roles传递变量

当一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

- hosts: webservs
  roles:
  - common
  - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

Inventory

ansible 的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的Inventory file 为 /etc/ansible/hosts。

inventory file 可以有多个,且也可以通过Dynamic Inventory来动态生成

主机变量

可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:

[webservs]
10.0.0.65 http_port=80 maxRequestsPerChild=888
10.0.0.66 http_port=8080 maxRequestsPerChild=909

组变量

组变量是指赋予给特定组内所有主机上在playbook中可用的变量。例如:

[webservs:vars]
ntp_server=ntp.aliyun.com
nfs_server=nfs.aliyun.com

注意:[组名:vars] 组名中的:vars 是固定用法

组嵌套

inventory中,组还可以包含其他的组,并且也可以像组中的主机指定变量。不过这些变量只能在ansible-playbook中使用,而不支持ansible。例如:

[apache]
http1.magedu.com
http2.magedu.com
[nginx]
nginx1.magedu.com
nginx2.magedu.com
[webservs:children]
apache
nginx
[webservs:vars]
ntp_server=ntp.magedu.com

注意::childer 同样是固定用法

inventory 参数

ansible基于ssh链接inventory中指定的远程主机时,还可以通过参数指定其交互方式;这些擦桉树如下所示:

ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
ansible_connection
ansible_ssh_private_key_file
ansible_shell_type
ansible_python_interpreter
ansible_*_interpreter

编写 ansible playbooks 剧本

playbook是由一个或多个play组成的列表。play的主要功能在于将事先归并一组的主机装扮成事先通过ansible中的tasks定义好的角色。从根据上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们联通起来按事先编排的机制同唱一台大戏。下面是一个简单的示例:

- hosts: webnodes
  vars:
    http_port: 80
    max_clients: 256
  remote_user: root
  tasks:
  - name: ensure apache is at the lastest version
    yum: name=httpd state=latest
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
  - name: restart apache
    service:name=httpd state=restarted

在这里插入图片描述

playbook 基础组件

Hosts 和 Users
playbook 中的每一个play的目的都是为了让某个或某些主机一某个指定的用户执行任务。hosts用于指定要执行指定任务的主机,其可以使一个或多个由冒号分割主机组;remote_user则用于指定远程主机上的执行任务的用户。例如上面示例中的:

- hosts: webnodes
  remote_user: root

在这里插入图片描述
不过,remote_user也可用于各task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务,甚至可以在sudo时sudo_user指定sudo时切换的用户。

- hosts: webnodes
  remote_user: mageedu
  tasks:
  - name: test connection
    ping:
    remote_user: mageedu
    sudo: yes

在这里插入图片描述

任务列表和action

play的主体部分是task list。task list中的个任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行playbook 时,如果中途发生错误,所有已执行任务都将会滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果为提供name,则action的结果将用于输出

定义task的可以使用"action: module options" 或 “module: options” 的格式,推荐使用候着以实现向后兼容。如果action一行的内容过度,也使用在行首使用几个空白字符进行换行

tasks:
- name: make sure apache is running
  service: name=htpd state=running

在这里插入图片描述
在众多模块中,只有command 和shell模块仅需要给一个列表而无需使用"key=vale"格式,例如:

tasks:
- name: disable selinux
  command: /sbin/setenforce 0

在这里插入图片描述
如果命令或脚本的退出码不为零,可以使用如下方式替代:

tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand || /bin/true
  ignore_errors: true

在这里插入图片描述
或者使用ignore_errors来忽略错误信息

tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand
  ignore_errors: true

在这里插入图片描述

playbook 案例 1

在所有的webservs组的主机上创建nginx用户和用户组

并模拟拷贝文件到dbservs中

[root@node01 ansible]# cat nginx.yml
- hosts: webservs
  remote_user: root
  tasks:
  - name: create nginx group
    group: name=nginx system=yes gid=208
  - name: create nginx user
    user: name=nginx system=yes uid=208 group=nginx
- hosts: dbservs
  remote_user: root
  tasks:
  - name: copy file to dbservs
    copy: src=/etc/inittab dest=/tmp/inittab.ans

在这里插入图片描述
使用ansible-playbook命令执行:

[root@node01 ansible]# ansible-playbook nginx.yml 
PLAY [webservs] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65]
TASK [create nginx group] *************************************************************************************************
changed: [10.0.0.65]
TASK [create nginx user] **************************************************************************************************
changed: [10.0.0.65]
PLAY [dbservs] ************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.66]
TASK [copy file to dbservs] ***********************************************************************************************
ok: [10.0.0.66]
PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=3    changed=2    unreachable=0    failed=0
10.0.0.66                  : ok=2    changed=0    unreachable=0    failed=0  

在这里插入图片描述
验证: webservs的nginx用户和组以及dbservs的/tmp/inittab.ans文件

[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:208::/home/nginx:/bin/bash
[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:
[root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans'
10.0.0.66 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans

在这里插入图片描述

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

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

相关文章

Individual Tree Segmentation from LiDAR Point Clouds for Urban Forest Inventory

Abstract 本研究的目的是使用 LiDAR 点云数据开发单棵树级别的自动化城市森林清单的新算法。激光雷达数据包含三维结构信息,可用于估算树高、基高、树冠深度和树冠直径。这使得精确的城市森林库存可以细化到单棵树。与大多数已发布的从 LiDAR 派生的栅格表面检测单…

学了这么久python,不会连自己啥python版本都不知道吧?

人生苦短,我用Python 源码资料电子书:点击此处跳转文末名片获取 查看 Python 版本 我们可以在命令窗口(Windows 使用 winR 调出 cmd 运行框)使用以下命令查看我们使用的 Python 版本: python -V 或 python --version 以上命令执行结果如下: …

Axure 初学者容易涉及的雷区

​工具学习是成为产品经理的一部分学习,工具学习总是伴随着痛苦和煎熬的,因为学习本身就伴随着枯燥和重复。 在未来你的Axure学习可能会出现这些情况呢?还没接触过axure的或者打算进行axure的朋友可能会有疑问。这里根据我们学员学习axure的经…

CentOS8基础篇4:使用U盘备份文件

一、挂载点 所谓的挂载点就是文件系统中存在的一个目录,通常情况下,创建在/mnt目录下,挂载成功后,访问挂载点就是访问新的存储设备。 挂载点应该是空目录,否则原来该挂载点中存在的文件将会被隐藏。而且,…

谷粒学苑第二章前端框架-2.1登录功能

一、vue-admin-template的config模块 vue-admin-template支持多环境,config配置模块提供了dev和prod两种环境。而BASE_API存储的是URL前部分,再拼接上controller的URL,即是完整的URL。修改为自己的协议://ip:port 二、vue-admin-template的s…

.net6API使用SignalR+vue3聊天+WPF聊天

目录 一、.net6api接口 二、vue3前端 三、WPF客户端 此案例分为3部分。首先创建.net6api接口,然后使用前端vue3进行聊天,再使用wpf客户端进行聊天,并且互通聊天。 一、.net6api接口 1.首先建立一个能正常运行的api,然后增加Ch…

redis未授权访问漏洞的三种场景复现以及加固思路

1.redis简介 redis是一个 非常快速 的,开源的,支持网络,可以基于内存,也可以持久化的日志型, 非关系型 的键值对数据库。并提供了多种语言的api。有java,c/c,c#,php,JavaScript,per…

1.Linux编程-gcc编译器

gcc的工作流程 gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤: 四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程, 其中编译最耗时, 因为要逐行检查语法. gcc的工作流程: 1 预处理: cpp预处理器, 去掉注释, 展开头文件, …

Java进程CPU高负载排查步骤

近期发现服务器Java进程负载,超过100%一、采用top命令定位进程登录服务器,执行top命令,查看CPU占用情况,找到进程的pid很容易发现,PID为29706的java进程的CPU飙升到700%多,且一直降不下来,很显然…

python—requests模块详解

一、前言 1、requests简介 requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,它是python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib更简洁也更强大。 2、requests库的安装 方法…

CUDA中的数学方法

CUDA中的数学方法 文章目录CUDA中的数学方法1. Standard FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions2. Intrinsic FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions参考手册…

ROPR:一款功能强大的极速多线程ROPGadget查找工具

关于ROPR ROPR是一款速度极快且功能强大的ROPGadget查找工具,该工具支持多线程运行,可以帮助广大研究人员快速寻找和定位目标ROPGadget。 ROP(Return Oriented Programming),即返回导向编程,而ROPGadget是…

算法训练营DAY52|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

前两道题思路是一模一样的,但是需要认真理解,最后一道虽然思路不算难,但是需要注意的细节一点不少。 1143. 最长公共子序列 - 力扣(LeetCode)https://leetcode.cn/problems/longest-common-subsequence/最长公共子序列…

2-ChatGPT插件到Google浏览器、Firefox浏览器,并进行ChatGPT工作。

ChatGPT插件到Google浏览器、Firefox浏览器,并进行ChatGPT工作。1,首先,在装插件ChatGPT forGoogle插件时,我没安装成功,问题是我没有区分Google浏览器和双核浏览器的差别。2,如何使用ChatGPT在浏览器上进行…

基于北方苍鹰算法优化LSTM(NGO-LSTM)研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

2023软件测试面试全方位话术,你想要的全都有

目录 2023软件测试面试话术包含:自我介绍简历人资题话术面试题项目介绍 自我介绍 软件测试基础面试题 人资高频率问题 简历 总结 2023软件测试面试话术包含:自我介绍简历人资题话术面试题项目介绍 目录如下 自我介绍 软件测试基础面试题 需求的标准…

参数嗅探 - 为何产生

这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2部分我们介绍下如何解决这个问题…

git整体工作流程

文章目录本地流程远程仓库流程git 代码量统计本地流程 工作区 暂存区 本地仓库 远程仓库流程 git 代码量统计 # 统计本地仓库的代码量 git log --all --since2022-01-01 --until2022-01-05 --format"%aN" --no-merges | sort | uniq -c | while read data; do na…

浅析 SeaweedFS 与 JuiceFS 架构异同

SeaweedFS 是一款高效的分布式文件存储系统,最早的设计原型参考了 Facebook 的 Haystack,具有快速读写小数据块的能力。本文将通过对比 SeaweedFS 与 JuiceFS 在设计与功能上的差异,以帮助读者进行更适合自己的选择。 SeaweedFS 系统结构 S…

【树】平衡二叉搜索树的介绍与构建

二叉平衡搜索树一、平衡二叉搜索树的概述1. 平衡二叉树的性质2. 平衡二叉树的最小节点数(公式及其原理)a. 树高度和深度的区别b. 原理二、平衡二叉树的创建和调整1. 节点2. 旋转四种姿态a. LL旋转b. RR旋转c. LR旋转d. RL旋转2. 节点的插入3. 节点的删除…