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

news2025/1/13 10:07:57

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: 18
 obj: linux
 
 westos:
 age: 20
 obj: java
#vim user.yml
- name: Create User
 hosts: all
 gather_facts: no
 vars_files:
 ./user_var.yml
 tasks:
 - name: create user
 shell:
 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 register
 hosts: 172.25.0.254
 tasks:
 - name: hostname command
 shell:
 hostname
 register: info
 - name: show messages
 shell:
 echo "{{info['stdout']}}"

在这里插入图片描述

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

2.1.11 事实变量

事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test register
 hosts: 172.25.0.254
 tasks:
 - name: show messages
 debug:
 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 register
 hosts: xxxx
 tasks:
 - name: create hosts
 template:
 src: ./xxxx.j2
 dest: /mnt/hosts
#playbook2
---
- name: test.j2
 hosts: 172.25.0.254
 vars:
 students:
 - name: student1
 obj: linux
 - name: student2
 age: 18
 obj: linux
 
 tasks:
 - template:
 src: ./test.j2
 dest: /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 file
 hosts: 172.25.0.254
 tasks:
 - name: file module
 file:
 name: /mnt/{{item}}
 state: present
 loop:
 - westos_file1
 - westos_file2

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

2.3.2 循环散列或字典列表

- name: create file
 hosts: 172.25.0.254
 tasks:
 - name: file module
 service:
 name: "{{ item.name}}"
 state: "{{ item.state }}"
 loop:
 - name: httpd
 state: started
 - name: vsftpd
 state: 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: >
 条件1
 or
 条件2

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

2.5 触发器

notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
#实例#
---
- name: create virtualhost for web server
 hosts: 172.25.0.254
 vars_files:
 ./vhost_list.yml
 tasks:
 - name: create document
 file:
 path: "{{web2.document}}"
 state: directory
 - name: create vhost.conf
 copy:
 dest: /etc/httpd/conf.d/vhost.conf
 content:
 "<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 apache
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted

2.6 处理失败任务

2.6.1 ignore_errors

#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
#实例#
- name: test
 dnf:
 name: westos
 state: latest
 ignore_errors: yes
 
- name: create file
 file:
 path: /mnt/westos
 state: touch

在这里插入图片描述

在这里插入图片描述

2.6.2 force_handlers

#作用:
#当任务失败后play被终止也会调用触发器进程
#example
---
- name: apache change port
 hosts: 172.25.0.254
 force_handlers: yes
 vars:
 http_port: 80
 tasks:
 - name: configure apache conf file
 lineinfile:
 path: /etc/httpd/conf/httpd.conf
 regexp: "^Listen"
 line: "Listen {{ http_port }}"
 notify: restart apache
 - name: install error
 dnf:
 name: westos
 state: latest
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted
 enabled: yes

2.6.3 changed_when

#作用:
#控制任务在何时报告它已进行更改
---
- name: apache change port
 hosts: 172.25.0.254
 force_handlers: yes
 vars:
 http_port: 8080
 tasks:
 - name: configure apache conf file
 lineinfile:
 path: /etc/httpd/conf/httpd.conf
 regexp: "^Listen"
 line: "Listen {{ http_port }}"
 changed_when: true
 notify: restart apache
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted
 enabled: yes

2.6.4 failed_when

#当符合条件时强制任务失败
---
- name: test
 hosts: 172.25.0.254
 tasks:
 - name: shell
 shell: echo hello
 register: westos
 failed_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.coloradmin.cn/o/1281626.html

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

相关文章

机器学习笔记 - 什么是模型量化压缩技术?

一、简述 我们都知道现实世界是连续的状态,而计算机世界是离散的状态,这是什么意思呢?我们看一下下图,最右边的马力欧(高清)的状态,可以想象现实世界是连续的状态,而电脑世界在图像上呈现的是一格一格子的状态(左图)是离散的状态。 所以在计算机世界如果想要…

医疗器械设备模组的具体应用

直线模组是一种高精度、高速度的精密传动元件&#xff0c;目前被广泛应用在各种工业自动化领域&#xff1b;尤其是在激光加工、电子制造、医疗设备、物流设备和机器人等行业中&#xff0c;都发挥着重要作用&#xff0c;接下来我们看看医疗器械设备模组的具体应用吧&#xff01;…

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

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

Webgis学习总结

前言&#xff1a; 作者跟随视频学习了webgis内容进行如下学习复习总结 参考&#xff1a;新中地学习笔记 WebGIS第一课&#xff1a;测试高德API并通过&#xff1a; 注册申请高德API成为开发者&#xff0c;创建自己的项目和key进行项目初始化&#xff0c;可以使用JS API官方文…

PyQt6 QComboBox下拉组合框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计34条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

Apache Doris 详细教程(三)

7、监控和报警 Doris 可以使用 Prometheus 和 Grafana 进行监控和采集&#xff0c;官网下载最新版即可。 Prometheus 官网下载&#xff1a;https://prometheus.io/download/ Grafana 官网下载&#xff1a;https://grafana.com/grafana/download Doris 的监控数据通过 FE 和…

排序算法介绍(四)快速排序

0. 简介 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;采用了分治的思想。它选择一个基准元素&#xff0c;通过一趟排序将待排序序列分割成独立的两部分&#xff0c;其中一部分的所有元素都比基准元素小&#xff0c;另一部分的所有元素都比基准…

C++-类和对象

目录 一.C语言和C的区别 二.类的引入 三.类的定义 1.类的定义 2.类的成员方法的两种定义方式&#xff1a; 3.类的成员变量的定义 四.类的访问限定符及封装 1.访问限定符 五.面向对象的三大特征 1.面向对象的三大特征分别是什么 2.封装 六.类的作用域 七.创建类对象 1.类…

【csdn默认使用操作详解】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

国际语音通知系统有哪些优点?国际语音通知系统有哪些应用场景?

国际语音通知是一种全球性的通信工具&#xff0c;它通过语音方式向用户发送各种重要信息和提示。无论是快递到货的取件提醒、机场航班的延误通知&#xff0c;还是银行账户的余额提醒&#xff0c;国际语音通知都能准确、迅速地将信息传达给用户。 三、国际语音通知系统有哪些优…

qnx修改tcp和udp缓冲区默认大小

拷贝/home/test/qnx/qos223/target/qnx7/aarch64le/sbin/sysctl进系统中 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/sysctl.html kern.sbmax 默认262144&#xff0c;这个限制住了发送、接收缓冲器大小 ./sysctl -w kern.sbmax10000…

51单片机应用从零开始(十)·指针

指针 C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据&#xff0c;而不需要通过变量名来访问。指针变量存储的是一个地址&#xff0c;这个地址指向内存中的某个位置&#xff0c;该位置存储了一个值。 在C语言中&#xff0c;可以使用&运算符取得一…

Siemens-NXUG二次开发-Java开发环境配置[20231203]

Siemens-NXUG二次开发-Java开发环境配置[20231203] 1.NX/UG Java API官方开发文档2.安装Java83.安装jetbrain idea3.windows系统环境变量配置4.使用idea创建项目5.NXOpen Java代码生效流程6.API体系简述6.代码示例 1.NX/UG Java API官方开发文档 西门子NX/UG Java api开发文档…

严蔚敏数据结构题集 p18(2.25——2.30)(c语言代码实现)

目录 2.25假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。试对顺序表编写求C的算法。 2.26要求同2.25题。是对单链表编写求C的算法 2.…

03-IDEA集成Git,初始化本地库,添加远程仓库,提交,拉取,推送,分支的快捷操作

IDEA集成Git 创建Git忽略文件 不同的IDE开发工具有不同的特点文件,这些文件与项目的实际功能无关且不参与服务器上的部署运行, 把它们忽略掉能够屏蔽之间的差异 局部忽略配置文件: 在本地仓库的根目录即项目根目录下直接创建.gitignore文件, 以文件后缀或目录名的方式忽略指定…

CnosDB FDW:打通一扇通往PostgreSQL世界的大门

本文档提供了下载、安装和使用 CnosDB FDW 的简要说明。请根据您的实际需求和环境对文档进行调整。 概述 CnosDB FDW 是一个用于在 PostgreSQL 数据库中访问 CnosDB 数据库的外部数据包装器&#xff08;Foreign Data Wrapper&#xff09;。它提供了在 PostgreSQL 中查询 CnosD…

并发编程2:Java 加锁的原理和JVM对锁的优化

为什么要加锁 在多进程的环境下&#xff0c;如果一个资源被多个进程共享&#xff0c;那么对资源的使用往往会表现的随机和无序&#xff0c;这显然是不行的。例如多个线程同时对控制台输出&#xff0c;每个线程都输出的是完整的句子但是多个线程同时同时输出&#xff0c;则输出…

sd_webui的实用插件,prompt/lama/human matting/...,持续开源更新!!

热烈欢迎大家在git上star&#xff01;&#xff01;&#xff01;冲鸭&#xff01;&#xff01;&#xff01; 1.prompt优化插件 GitHub - leeguandong/sd_webui_beautifulprompt: beautifulprompt extension performs stable diffusion automatic prompt engineering on a bro…

博途PLC数组指针应用(SCL)

CODESYS数组类型变量使用介绍 https://rxxw-control.blog.csdn.net/article/details/131375218https://rxxw-control.blog.csdn.net/article/details/131375218 博途PLC数组类型变量使用介绍还可以查看下面文章博客: https://rxxw-control.blog.csdn.net/article/details/1…