一站式自动化:Ansible Playbook的全面学习之旅

1 Playbook介绍

1.1 Playbook介绍

playbook 是由一个或多个play组成的列表
Playbook 文件使用YAML来写的

1.2 YAML

1.2.1 介绍

是一种表达资料序列的格式,类似XML
Yet Another Markup Language
2001年首次发表
www.yaml.org

1.2.2 特点

可读性好
和脚本语言交互性号
易于实现
适用程序执行流梳理方式
可扩展性强

1.2.3 语法简介

在文件中用[---]开始
在文件中用[...]结尾
次行一般书写文件内容
缩进严格
大小写敏感
key/value可以多行书写也可一行书写,一行书写用,隔开
value可以是个字符串,也可是list
一个play需要包括name和tasks
name 是描述
tasks 是动作
一个name只能包含一个task
扩展名称yml或者yaml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.4 YAML 列表

[Linux,C++,Java,Python]
- Linux
- C++
- Java
- Python

1.2.5 YAML的字典

字典作用存放键值

name:westos
age:12
jobs:linux

在这里插入图片描述

1.3 playbook执行命令

  • Playbook的核心组件

name #可选,建议使用多用于说明
hosts #受控主机列表
tasks #任务
#用与选择执行部分代码

ansible-playbook xxx.yml ...
--check|-C ##检测
--syntax-check ##check language
--list-hosts ##列出hosts
--list-tags ##列出tag
--list-tasks ##列出task
--limit ##指定执行主机
-v -vv ##现实过程

在这里插入图片描述

1.4 vim 设定技巧

autocmd FileType yaml setlocal ai ts=2 sw=2 et
setlocal ##设定当前文件
ai ##自动退格对齐 auto indent
ts ##tab建长度为2空格 tabstop=2
sw ##缩进长度为2 shiftwidth=2
et ##把tab键变成空格 expandtab

在这里插入图片描述

1.5 playbook项目

2 Playbook的使用

2.1 变量

2.1.1 变量命令

只能包含数字,下划线,字母
只能用下划线或字母开头

2.1.2 变量级别

全局: 从命令行或配置文件中设定的
paly: 在play和相关结构中设定的
主机: 由清单,事实收集或注册的任务

变量优先级设定:
狭窄范围高 paly>主机>全局

2.1.3 在playbook中直接定义变量

vars: msg: sxl666

在这里插入图片描述

2.1.4 在文件中定义变量

vars_files: var_file.yml

在这里插入图片描述

2.1.5 使用变量

msg: "{{msg}}"

在这里插入图片描述

2.1.6 设定主机变量和清单变量

[westos1]
192.168.1.10
192.168.1.20[westos1:vars]
msg=sxl000

在这里插入图片描述

2.1.7 目录设定变量

group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致

在这里插入图片描述
在这里插入图片描述

2.1.8 用命令覆盖变量

ansible-playbook user.yml -e "USER=hello"

2.1.9 使用数组设定变量

#vim user_var.yml
---
USER:lee:age: 18obj: linuxwestos:age: 20obj: java
#vim user.yml
- name: Create Userhosts: allgather_facts: novars_files:./user_var.ymltasks:- name: create usershell:echo "{{USER['lee']['age']}}"echo "{{USER.westos.obj}}"
create web vhost
www.westos.com 80 ------ > /var/www/html ------> www.westos.com
linux.westos.com 80 ------> /var/www/virtual/westos.com/linux -----> linux.westos.com

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.10 注册变量

#register 把模块输出注册到指定字符串中
---
- name: test registerhosts: 172.25.0.254tasks:- name: hostname commandshell:hostnameregister: info- name: show messagesshell:echo "{{info['stdout']}}"

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.11 事实变量

事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test registerhosts: 172.25.0.254tasks:- name: show messagesdebug:msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.12 魔法便变量

hostvars: ##ansible软件的内部信息
#eg:
ansible localhost -m debug -a "var=hostvars"
group_names: ##当前受管主机所在组
#eg:
ansible localhost -m debug -a "var=group_names"
groups: ##列出清单中所有的组和主机
#eg:
ansible localhost -m debug -a "var=groups"
inventory_hostname: ##包含清单中配置的当前授管主机的名称
#eg:
ansible localhost -m debug -m "var=inventory_hostname"

在这里插入图片描述

2.1.13 JINJA2模板

Jinja2是Python下一个被广泛应用的模版引擎
他的设计思想来源于Django的模板引擎,
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能

##j2模板书写规则#
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} ##使用事实变量
#j2模板在playbook中的应用#
#playbook1 
---
- name: test registerhosts: xxxxtasks:- name: create hoststemplate:src: ./xxxx.j2dest: /mnt/hosts
#playbook2
---
- name: test.j2hosts: 172.25.0.254vars:students:- name: student1obj: linux- name: student2age: 18obj: linuxtasks:- template:src: ./test.j2dest: /mnt/list

在这里插入图片描述

1 for循环
vim users.yml
users:- westos
- linux- ansible
vim test.j2
{% for NAME in users %}
{{ NAME }}
{%endfor%}loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始

在这里插入图片描述
在这里插入图片描述

2 if判断
{% for NAME in users if not NAME == "ansible" %}
User number {{loop.index}} - {{ NAME }}
{%endfor%}
loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始
{% for user in students %}
name: {{user['name']}}
{%if user['age'] is defined%}
age: {{user['age']}}
{%endif%}
{% if user['age'] is not defined %}
age: null
{% endif%}
obj: {{user['obj']}}
{%endfor%}

在这里插入图片描述

2.2 加密控制

2.2.1 创建建立文件

ansible-vault create westos
vim westos-vault
lee
ansible-vault create --vault-password-file=westos-valut westos
  • 加密现有文件
ansible-vault encrypt test
  • 查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos

在这里插入图片描述

  • 编辑加密文件
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos

在这里插入图片描述

  • 解密文件
ansible-vault decrypt westos ##文件永久解密
ansible-vault decrypt westos --output=linux ##文件解密保存为linux
  • 更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1
playbook#
ansible-playbook apache_install.yml --ask-vault-pass

在这里插入图片描述

2.3 循环

2.3.1 简单循环

loop: ##赋值列表- value1- value2- ...
{{item}} ##迭代变量名称
#实例#
---
- name: create filehosts: 172.25.0.254tasks:- name: file modulefile:name: /mnt/{{item}}state: presentloop:- westos_file1- westos_file2

在这里插入图片描述
在这里插入图片描述

2.3.2 循环散列或字典列表

- name: create filehosts: 172.25.0.254tasks:- name: file moduleservice:name: "{{ item.name}}"state: "{{ item.state }}"loop:- name: httpdstate: started- name: vsftpdstate: stopped

在这里插入图片描述

在这里插入图片描述

2.4 条件

when:- 条件1- 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
in value is in value 变量为 
not in value is not in value 变量不为
bool变量 为true value value的值为true
bool变量 false not value value的值为false
value in value2 value的值在value2列表中
#多条条件组合#
when:条件1 and 条件2- 条件1- 条件2
when:条件1 or 条件2
when: >条件1or条件2

在这里插入图片描述
在这里插入图片描述

2.5 触发器

notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
#实例#
---
- name: create virtualhost for web serverhosts: 172.25.0.254vars_files:./vhost_list.ymltasks:- name: create documentfile:path: "{{web2.document}}"state: directory- name: create vhost.confcopy:dest: /etc/httpd/conf.d/vhost.confcontent:"<VirtualHost *:{{web1.port}}>\n\tServerName {{web1.name}}\n\tDocumentRoot 
{{web1.document}}\n\tCustomLog logs/{{web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:
{{web2.port}}>\n\tServerName {{web2.name}}\n\tDocumentRoot {{web2.document}}\n\tCustomLog logs/
{{web2.name}}.log combined\n</VirtualHost>"notify:restart apachehandlers:- name: restart apacheservice:name: httpdstate: restarted

2.6 处理失败任务

2.6.1 ignore_errors

#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
#实例#
- name: testdnf:name: westosstate: latestignore_errors: yes- name: create filefile:path: /mnt/westosstate: touch

在这里插入图片描述

在这里插入图片描述

2.6.2 force_handlers

#作用:
#当任务失败后play被终止也会调用触发器进程
#example
---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 80tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"notify: restart apache- name: install errordnf:name: westosstate: latesthandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes

2.6.3 changed_when

#作用:
#控制任务在何时报告它已进行更改
---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 8080tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"changed_when: truenotify: restart apachehandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes

2.6.4 failed_when

#当符合条件时强制任务失败
---
- name: testhosts: 172.25.0.254tasks:- name: shellshell: echo helloregister: westosfailed_when: "'hello' in westos.stdout"

2.6.5 block

block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
#测试练习#
建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:/dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:/dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上

3 ansible roles

#ansible 角色简介#

  • Ansible roles 是为了层次化,结构化的组织Playbook
  • roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们
  • roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高
  • 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割
    成片段来执行。
    #roles目录结构#
    files ##存放copy或script等模块调用的函数
    tasks ##定义各种task,要有main.yml,其他文件include包含调用
    handlers ##定义各种handlers,要有main.yml,其他文件include包含调用
    vars ##定义variables,要有main.yml,其他文件include包含调用
    templates ##存储由template模块调用的模板文本
    meta ##定义当前角色的特殊设定及其依赖关系,要有main.yml的文件 defaults##要有main.yml的文
    件,用于设定默认变量
    tests ##用于测试角色
    #role存放的路径在配置文件ansible.cfg中定义#
    roles_path = path/roles (默认目录:/etc/ansible/roles)
    #创建目录结构#
    $ ansible-galaxy init apache
    $ ansible-galaxy list
    #playbook中使用roles#
    playbook中使用roles:

  • hosts: server2
    roles:
  • role: role1
  • role: role2
    var1: value1 ##此处变量会覆盖roles中的定义变量
    #控制任务执行顺序#

  • hosts: server2
    roles:
  • role: role1 ##角色任务
    pre_tasks: ##角色执行前执行的play
  • tasks1
    tasks: ##普通任务
  • tasks2
    post_tasks: ##在角色和普通任务执行完毕后执行的play
  • tasks3
    handlers:
    #ansible—galaxy命令工具#
  • Ansible Galaxy 是一个免费共享和下载 Ansible 角色的网站,可以帮助我们更好的定义和学习roles。
  • ansible-galaxy命令默认与https://galaxy.ansible.com网站API通信,可以查找、下载各种社区开发的 Ansible 角色
  • ansible-galaxy在 Ansible 1.4.2 就已经被包含了
  • 在galaxy.ansible.com网站查询roles
    #安装选择的角色#
    #install https://galaxy.ansible.com roles
    $ansible-galaxy install geerlingguy.nginx
    #install local roles
    $ vim install_apache_role.yml

  • src: file:///mnt/apache.tar.gz
    name: apache
    $ ansible-galaxy install -r install_apache_role.yml

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

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

相关文章

RPG项目01_新输入输出

基于“RPG项目01_脚本代码”&#xff0c;本次修改unity的新输入输出系统。本次修改unity需要重启&#xff0c;如果一直跟着做教学项目&#xff0c;请先保存项目&#xff0c;再继续修改unity为新输入输出系统。 向下翻&#xff0c; 向下翻&#xff0c; 选择both加入新输入输出系…

Android把宽高均小于给定值的Bitmap放大到给定值,Kotlin

Android把宽高均小于给定值的Bitmap放大到给定值&#xff0c;Kotlin 假设拉伸放大到SIZE2048 fun scaleSize(image: Bitmap): Bitmap {val w image.widthval h image.heightvar newW: Intvar newH: Intif (w > h) {newW SIZEnewH (SIZE / w.toFloat()) * h} else {newW …

PHP常用系统函数的 学习资料

输出函数 echo($string): 输出一个或多个字符串。print($string): 输出一个字符串。printf($format, $args): 根据指定的格式输出格式化的字符串。var_dump($expression): 打印变量的相关信息&#xff0c;包括类型和值。print_r($expression): 打印变量的易读版本&#xff0c;…

Harmony OS (eTS语言)的起源和演进

Harmony OS&#xff08;eTS语言&#xff09;的起源和演进 1.eTS语言的起源和演进 1.1.概括 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了eTS。eTS&#xff08;extended TypeScript&#xff09;是鸿蒙(Harmony)生态的一种应用开发语言。也是H…

qt 动态生成柱状图

cpp文件 #include "mform.h" #include "ui_mform.h" #include <QBarSeries> #include <QBarSet> #include <QtCharts> #include <QPushButton> #include <QtCharts/QChartView> #include <QtCharts/QPieSeries> #inc…

java中Integer和int有什么区别?

Java中的Integer和int是两种不同的数据类型&#xff0c;主要的区别在于&#xff1a; 1. 基本类型与引用类型&#xff1a;int是基本数据类型&#xff0c;直接存储数值&#xff0c;而Integer是对象&#xff0c;它的实例是引用类型&#xff0c;存储的是对象的引用。 2. 默认值&a…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…

51单片机应用从零开始(九)·数组

目录 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 2. 用 P0 口显示字符串常量 1. 用字符型数组控制 P0 口 8 位 LED 流水点亮 C语言中的字符型数组是一种数据类型&#xff0c;它是一个由字符组成的序列&#xff0c;以空字符\0结尾。在声明字符型数组时&#xff0c;需要指…

Git【成神路】

目录 1.为啥要学git啊&#xff1f;&#x1f615;&#x1f615;&#x1f615; 2.版本控制软件的基本功能 &#x1f91e;&#x1f91e;&#x1f91e; 3.集中式版本控制 &#x1f936;&#x1f936;&#x1f936; 4.分布式版本控制&#x1f60e;&#x1f60e;&#x1f60e; …

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 只要描述你想要的UI是什么样的&#xff0c;它就能帮你生成&#xff0c;是不是很神奇&#xff1f; v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…

Android 13.0 SystemUI电池电量为0时延迟关机的解决方案

1.简述 在13.0系统rom定制化开发中,在系统开发中可能会遇到了在电池电量为0时这时未出现立即关机的情况,产生延时关机的问题,下面就来分析这个问题所产生的原因,然后解决这个问题 2.SystemUI电池电量为0延迟关机的核心代码 /frameworks/base/services/core/java/com/andr…

含光伏发电的变电站供电系统设计

摘要 面对全球日趋严重的能源危机问题&#xff0c;可再生能源的开发和利用得到了人们的高度重视。其中辐射到地球太阳能资源是十分富饶的&#xff0c;绿色清洁的太阳能不会危害我们的生存环境&#xff0c;因而受到了人们的广泛利用。光伏发电作为可再生能源被广泛的应用&#…

关于在PyTorch中使用cudnn.benchmark= True

关于在PyTorch中使用cudnn.benchmark True 在PyTorch中&#xff0c;cudnn.benchmark True是一个参数&#xff0c;用于启用或禁用cuDNN的基准测试模式。cuDNN是一个由NVIDIA开发的深度神经网络库&#xff0c;它为GPU提供了一个优化的计算接口。 基准测试模式是cuDNN的一个特性…

informer辅助笔记:utils/timefeatures.py

定义了一套与时间特征相关的类和函数&#xff0c;旨在从时间序列数据中提取有用的时间特征&#xff0c;以支持各种时间序列分析和预测任务 from typing import Listimport numpy as np import pandas as pd from pandas.tseries import offsets from pandas.tseries.frequenc…

2023.12.3 分布式SQL查询引擎-Presto

目录 1.Prosto简介 Apache Hadoop-MapReduce Apache Hive 2.Presto的优缺点 3.个人自用启动服务 个人自用启动服务 4.presto和hive的区别 5.presto优化 1.Prosto简介 Apache Hadoop-MapReduce 优点&#xff1a;统一、通用、简单的编程模型&#xff0c;分而治之思想处理…

利用STM32内置温度传感器实现温度监测系统

STM32微控制器是一款强大的嵌入式处理器&#xff0c;具有广泛的应用领域。其中&#xff0c;一些STM32微控制器内置了温度传感器&#xff0c;可以方便地实现温度监测功能。本文将详细介绍如何利用STM32内置温度传感器实现温度监测系统&#xff0c;并提供相应的示例代码。 一、硬…

【算法思考记录】力扣1423. 可获得的最大点数[Java, 滑动窗口]

Problem: 1423. 可获得的最大点数 date: “2023-12-03” 问题重述 正难则反&#xff0c;发挥逆向思维&#xff0c;因为最终无法选择的点数是一个连续区间&#xff0c;所以问题可转换成&#xff1a;在一个给定的数组中&#xff0c;我们需要找到移除长度为 n-k 的子数组后&#…

智慧灯杆系统平台架构设计需要考虑的几个要点

智慧灯杆是一种集成了各种先进技术的道路照明设施。它不仅提供照明服务&#xff0c;还可以具有物联网技术、视频监控、环境监测、广播通讯、无线网络覆盖等多种功能。这些智能功能可以通过互联网进行控制和管理&#xff0c;从而实现智慧城市的建设。智慧灯杆能够提升城市的智能…

Wpf 使用 Prism 实战开发Day07

待办事项页面设计 效果图: 一.布局设计 页面主要分上下布局&#xff0c;分2行进行设计&#xff0c;使用 Grid.RowDefinitions 将页面分上下2行 例如&#xff1a; <Grid.RowDefinitions><RowDefinition Height"auto"/><RowDefinition/> </Gri…

React基本知识点整理

React中引入样式的2种方式 1,内联样式 import React, { Component } from react export default class index extends Component {render() {return (<div><div style{{color:"red",fontSize:"18px"}}>内联样式</div></div>)} }…