ansible的脚本—playbook剧本

目录

目录

一、playbook

1、简介

2、playbook组成部分:

3、如何编写Playbook?

4、语句的横向/纵向写法

二、playbook实例:

1、playbook模版:

2、playbook的条件判断:

3、playbook中的循环:

4、循环练习:

5、Templates模块

6、tags模块:

7、roles模块:



一、playbook

1、简介


Playbook 剧本是由一个或多个play组成的列表。

play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。

Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

Playbook 文件是采用YAML语言编写的。
 

2、playbook组成部分:

1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用。

2、variables变量:存储和传递数据,和shell脚本中的变量是一个意思,可以在playbook当中定义为全局变量,也可以在外部传参。

3、templates模版:主要用于生成配置文件。模版是包含占位符的文件。占位符由ansible在执行时转化为变量值

4、handlers处理器:当需要有变更的时候,可以执行触发器

5、roles角色:类似于docker-compose,是一种组织和封装playbook的。允许把相关的任务,变量和模版和处理器组织成一个可复用的单元

3、如何编写Playbook?

xxx.yaml/xxx.yml
--- #表示开始
- name:  #指定play的名称hosts: #指定主机清单中定义的主机组名remote_user: #指定远程主机的执行用户grather_facts: ture|fales #指定是否要收集远程主机的facts信息vars:   #自定义变量,只能在当前play有效- 变量1: 值1  #格式为key: value- 变量2: 值2tasks: #定义任务列表,默认从上往下依次执行- name: #定义任务的名称模块名: 模块参数        ignore errors: true  #忽略任务的失败- name: #可以定义多个任务模块名: 模块参数  notify: 任务名  #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作##条件判断##- name:模块名: 模块参数when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务##循环##- name:模块名: 模块参数={{item}}with_items: #定义循环列表##tags模块,标签## - name: 模块名: 模块参数 tags:- 标签1- 标签2handlers: - name: 任务名  #和notify中的任务名相同模块名: 模块参数#无注释版
---
- name: hosts: remote_user:grather_facts: ture|fales vars:- 变量1: 值1- 变量2: 值2tasks:- name:模块名: 模块参数        ignore errors: true- name:模块名:notify: 任务名- name:模块名:when:- name:模块名: 模块参数={{item}}with_items:handlers: - name: 任务名模块名: 模块参数

4、语句的横向/纵向写法

task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ...纵向格式:
模块名:参数1: 值参数2: "{{变量名}}"...with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...纵向格式:
with_items:
- 值1
- 值2
- 值3
...值为对象(键值对字段)时:
with_items:
- key1: "值1"key2: "值2"
- key1: "值3"key2: "值4"
...

二、playbook实例:

1、playbook模版:

ansible-playbook test1.yml
执行脚本ansible-playbook test1.yml --start-at-task='install httpd'
从指定任务模块开始执行ansible-playbook test1.yml --syntax-check
检查yml文件的语法是否正确ansible-playbook test1.yml --list-task
检查有多少tasks任务ansible-playbook test1.yml --list-hosts
检查在哪台主机生效

若要切换用户,比如从koeda切换到root用户

71行要取消注释

hosts中:

改过用户,运行时的命令

ansible-playbook test1.yml -K(大K)

-K:输入密码

若脚本中没有指定用户,可以命令指定:

ansible-playbook test1.yml -u root -k(小k)

模版实例2:

#this is second
#声明和引用变量,以及外部传参
- hosts: 192.168.10.201remote_user: rootvars:groupname: guoqiusername: wangdefutasks:- name: create groupgroup:name: "{{ groupname }}"system: yesgid: 111- name: create useruser:name: "{{ username }}"uid: 1011group: "{{ groupname }}"shell: /sbin/nologin- name: copy filecopy:content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"dest: /opt/ky32.txt
#获取目标的ip地址,然后复制到目标文件

vars:groupname: koedausername: koeda
字典方式:key-value
"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
包含所有主机变量的字典
inventory_hostname:目标主机的主机名
ansible_default_ipv4:获取目标主机的IP地址

也可以里面不指定变量参数,外部传参:

ansible-playbook test2.yaml -e 'username=koeda groupname=koeda'

2、playbook的条件判断:

when 是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

when是满足条件即执行,不满足不执行

- hosts: allremote_user: roottasks:- name: nginx whenyum: name=nginxwhen: ansible_default_ipv4.address == '20.0.0.25'- name: nginx infodebug:msg: "安装nginx"when: ansible_default_ipv4.address == '20.0.0.25'- name: httpd whenyum: name=httpdwhen: ansible_default_ipv4.address == '20.0.0.26'- name: httpd infodebug:msg: "安装httpd"when: ansible_default_ipv4.address == '20.0.0.26'

3、playbook中的循环:

四种循环方式:

with_items 最常用的

with_list 列表分组循环

with_together 列表对应的列中,以数据结合的方式循环

with_nested 相当于双层循环,第一层定义了循环的次数,第二层表示第一层中的每个元素会循环几次

ansible有多中循环格式:

with_items 循环遍历

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_items: [a,b,c,d]

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- debug:msg: "{{ item }}"with_items:- [a,b,c,d]- [1,2,3,4]

with_list:列表输出

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- debug:msg: "{{item}}"with_list:- [a,b,c]- [1,2,3]

练习:

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- name: createfile:path: "{{item}}"state: touchwith_items:- /opt/a- /opt/b- /opt/1- /opt/2

with_together:组合输出

组循环,列表中的值,一一对应打印出来

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- debug:msg: "{{item}}"with_together:- [a,b,c]- [1,2,3]- [A,B]

循环嵌套:

- hosts: 20.0.0.25remote_user: rootgather_facts: falsetasks:- debug:msg: "{{item}}"with_nested:- [a,b,c]- [1,2,3]

4、循环练习:

创建用户test1、test2,用户组分别为dn1、dn2

- name: play1hosts: 20.0.0.25gather_facts: falsetasks:- name: create groupgroup:name: "{{ item }}"state: presentwith_items:- 'dn1'- 'dn2'- name: create useruser:name: "{{ item.name }}"state: presentgroups: "{{ item.groups }}"with_items:- {name: 'test1', groups: 'dn1'}- {name: 'test2', groups: 'dn2'}

yum 一键安装多个软件  tree sl nginx httpd vsftpd dhcp

- name: play2hosts: 20.0.0.25gather_facts: falsetasks:- name: create tree sl nginx httpd vsftpd dhcpyum:name: "{{ item }}"with_list:- tree- sl- nginx- httpd- vsftpd- dhcp

5、Templates模块

Jinja模版架构,通过模版可以实现向模版文件传参 (python转义) 把占位符参数传到配置文件中去。

生产一个目标文本文件,传递变量到需要的配置文件中。(web开发)

后缀.j2 结尾 表示模版

httpd.conf.j2在文件中配置的是占位符(声明的变量)

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数)

playbook当中,template模版来把擦书传给目标的主机配置文件

实例:传递变量到httpd模块中

先在控制节点上安装httpd

/etc/httpd/conf/httpd.conf

在配置文件中,定义参数

在/etc/ansible/hosts中定义变量

20.0.0.25 http_port=20.0.0.25:80 server_name=www.koeda.com:80 root_dir=/etc/httpd/htdocs ansible_port=22 ansible_user=root ansible_password=123

编写一个调用脚本:

启动之后,通过jinja模版模式,将需要的参数传给文件

去目标主机上查看配置文件

参数传参完毕:

6、tags模块:

标签模块,可以在playbook当中作为任务设定标签(tags),我们在运行playbook时可以通过任务标签,来实现只运行设定的标签任务

--start-at-task='标签名'

指定开始的位置

任务标签的种类:

always:不管你是否指定了运行标签,任务都会执行
never:即使运行了指定标签,该任务也不会执行
debug:调试任务
setup:收集主机信息自定义标签:
per_tasks:运行指定标签之前的任务
post_tasks:运行指定标签之后的任务

ansible-playbook demo2.yml --tags="debug"

指定debug标签运行:

never标签只有指定他时才能运行

ansible-playbook demo2.yml --tags="never"

always模块永远运行

7、roles模块:

角色:

ansible中roles模块是一个层次化、结构化的组织playbook

可以根据层次的结构,自动装载变量文件,tasks,以及触发器handlers等

roles:分别把变量、文件、任务、模块以及处理器,放在单独的目录当中,使用roles模块来一键调用这些文件

roles目录大致架构:

 ------web----总目录,角色

files:存放copy和script模块调用的文件

templates:存放j2的模版文件

tasks:包含任务的目录

 ------main.yml---角色运行的任务

handlers:包含处理器的目录

--------mian.yml---

vars:存放变量的目录

---------main.yml---

defaults:包含默认变量的目录

----------main.yml---

meta:包含元信息的目录

----------main.yml---

site.yml统筹调用所有的配置文件

实例:简单的下载且启动服务

三个服务http、mysql、php,表示三个角色

------编写httpd模块------

写一个简单的tasks/main.yml

vim /etc/ansible/roles/httpd/tasks/main.yml

- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started

 

定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vim /etc/ansible/roles/httpd/vars/main.yml

pkg: httpd
svc: httpd

-------编写mysql模块-------

vim /etc/ansible/roles/mysql/tasks/main.yml

- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started

  

vim /etc/ansible/roles/mysql/vars/main.yml

pkg:- mariadb- mariadb-server
svc: mariadb

-------编写php模块-----

vim /etc/ansible/roles/php/tasks/main.yml

- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started

vim /etc/ansible/roles/php/vars/main.yml

pkg:- php- php-fpm
svc: php-fpm

-----编写roles示例-----

vim /etc/ansible/site.yml

---
- hosts: webserversremote_user: rootroles:- httpd- mysql- php

cd /etc/ansible

ansible-playbook site.yml

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

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

相关文章

Flink电商实时数仓(三)

DIM层代码流程图 维度层的重点和难点在于实时电商数仓需要的维度信息一般是动态的变化的&#xff0c;并且由于实时数仓一般需要一直运行&#xff0c;无法使用常规的配置文件重启加载方式来修改需要读取的ODS层数据&#xff0c;因此需要通过Flink-cdc实时监控MySql中的维度数据…

连获4大奖项,欧科云链成Web3行业领跑者

2023年底&#xff0c;作为深耕区块链大数据且持续关注监管与合规科技的Web3企业&#xff0c;欧科云链连续斩获4大奖项&#xff0c;包括第十三届中国证券金紫荆奖、财联社“最具创新价值奖” 、界面新闻“优致雇主奖”与“好公司50”&#xff0c;成为中国Web3领域中最受关注的企…

深入浅出堆排序: 高效算法背后的原理与性能

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;堆排序一个基于二叉堆数据结构的排序算法&#xff0c;其稳定性和排序效率在八大排序中也…

TypeScript实战——ChatGPT前端自适应手机端,PC端

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 可以在线体验哦&#xff1a;体验地址 文章目录 前言引言先看效果PC端手机端 实现原理解释 包的架构目录 引言 ChatGPT是由OpenAI开发的一种基于语言模型的对话系统。它是GPT&#xff08;…

php学习02-php标记风格

<?php echo "这是xml格式风格" ?><script language"php">echo 脚本风格标记 </script><% echo "这是asp格式风格" %>推荐使用xml格式风格 如果要使用简短风格和ASP风格&#xff0c;需要在php.ini中对其进行配置&#…

MySQL数据库 索引

目录 索引概述 索引结构 二叉树 B-Tree BTree Hash 索引分类 索引语法 慢查询日志 索引概述 索引 (index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种…

Leetcod面试经典150题刷题记录 —— 矩阵篇

矩阵篇 1. 有效的数独2. 螺旋矩阵Python 3. 旋转图像Python额外开辟数组空间原地置换法 4. 矩阵置零5. 生命游戏Python 1. 有效的数独 题目链接&#xff1a;有效的数独 - leetcode 题目描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验…

本地开发了一个项目,将其添加到 Git 仓库

背景 如果你已经在本地开发了一个项目&#xff0c;但尚未将其添加到 Git 仓库 现在要将其添加至远程git仓库 文章目录 详细步骤在gitee上申请仓库 详细步骤 打开终端&#xff1a; 打开终端或命令提示符窗口&#xff0c;进入你的项目所在的目录。 初始化 Git 仓库&#xff1a; …

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

陶建辉在 CIAS 2023 谈“新能源汽车的数字化”

近年&#xff0c;中国的新能源汽车发展迅猛&#xff0c;在全球竞争中表现出色&#xff0c;已经连续 8 年保持全球销量第一。在新兴技术的推动下&#xff0c;新能源汽车的数字化转型也正在加速进行&#xff0c;从汽车制造到能源利用、人机交互&#xff0c;各个环节都在进行数字化…

Android笔记(二十):JetPack DataStore 之 Proto DataStore

Jetpack DataStore 是一种数据存储解决方案&#xff0c;主要适用于小型数据的处理。它可以通过协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。DataStore有两种实现方式&#xff08;1&#xff09;Preferences DataStor…

“智”绘出海新航道,亚马逊云科技携手涂鸦智能助力智能家居企业全球化

随着人工智能、5G等技术的快速发展&#xff0c;智能家居行业呈现高速发展的态势。Statista数据显示&#xff0c;2022年全球智能家居行业支出总值为1145亿美元&#xff0c;欧美地区以较早的智能家居普及率&#xff0c;率先进入全屋智能时代&#xff0c;其中欧盟区国家家用智能设…