优势特点:
| 1)实现自动化功能更加全面 |
| 2)可以更好的控制逻辑关系 |
| 3)剧本展现命令语法更直观 |
| 4)拥有持久反复执行的特性 |
剧本作用:
管理多个主机,完成多个任务操作
剧本编写规范:
| 1)使用空格: |
| 每个两个空格表示一个层级,剧本中拥有缩进关系 |
| 2)使用冒号 : |
| 指定具体参数的信息 →→ name:(空)说明信息 |
| 冒号后面需要有空格信息,但是如果冒号后面没有内容,冒号后不再需要空格 |
| 3)短横线 |
| 添加多个项目列表 |
| 构成列表需要加上短横线,后面需要加上一个空格 |
| |
模式:
1.playbook
简介:playbook是ansible中的一个术语,它指的是用于配置管理的脚本。
1.1 YAML格式的playbook
ansible的playbook是使用YAML语法编写的,YAML是一种类似于json的文件格式,不过YAML更适合人来读写。
1.2 文件起始
YAML文件以三个减号开头用于标记文档的开始
| --- |
| |
| 不过。如果往日在playbook文件开头键入三个减号,并不会影响ansible的运行 |
1.3 注释
注释以井号开始一直到本行结束,这与shell、Python以及ruby是一样的。
示例
This is a YAML comment
1.4 字符串
一般而言。YAML字符串不需要使用引号引起来。加上引号也是没有问题的。即便字符串中含有空格,也是不需要引号的。
| this is YAML comment |
| |
| 等价于json格式为: |
| |
| “this is YAML comment” |
当然在ansible中有几种情况也是比较特殊的,需要对字符串使用引号。
1.5 布尔型
YAML具有内置的布尔类型,并且提供了很多种释义为true和false的字符串。在ansible playbook中使用True和False的占大多数,所以我们在“是”“否”中使用True和False就就可以。
示例
| YAML中的布尔型 |
| True |
| 等同于json格式的 |
| true |
1.6 列表
YAML中的列表就好像JSON中的数组或者Python中的列表。严格的来说,在YAML中它应该被叫做序列。但为了和官方文件保持一致,我们还是成为列表。
列表使用减号“-”作为定界符
| - My fair lady |
| - ok |
| - the is |
| |
| 等价于JSON格式为: |
| |
| { |
| "My fair lady", |
| "ol", |
| "the is" |
| } |
1.7 为什么在有的地方使用True,而其他地方又使用Yes**
如何在playbook中表示“是”和“否”这一点上ansible是非常灵活的。严格来说,模块参数(例如,update_cache=yes)的处理方式不同于playbook中其他地方的值(例如,sudo:True )。这是因为其他地方有YAML解析器来处理,所以只能说用YAML的真实性值得约定:
| YAML“是”值 |
| true True TRUE yes Yes YES on On ON y Y |
| |
| YAML“否”值 |
| false False FALSE no No NO off Off OFF n N |
| |
| 模块参数是作为字符串传递的,因此 使用ansible的内置约定: |
| 模块参数为“真” |
| yes on 1 true |
| 模块参数为“假” |
| no off 0 false |
应该倾向于遵从ansible官方文档的示例,向模块传递参数是使用yes和no(这是因为为了保持和模块官方文档一致),而playbook中其他地方使用了True和False
1.8 主机/主机组名称如何定义
| 1)all: 清单里面的所有主机都进行管理 |
| 2)主机组名称: 清单里面指定主机组中的主机进行管理 |
| 3)主机名称/ip地址:清单里面指定的单个主机 |
| 4)localhost 只管理自己 |
2.0 剧本编写
2.1 参数:
| play:角色,定义的是主机信息 |
| - hosts:all |
| tasks: |
| - name: |
| file: |
| remote_user: root |
| {{ }}:填写变量信息 |
| stdout_lines:标准输出,优化了下格式 |
| vars:在剧本中定义变量 |
| --extra-vars=EXTRA_VARS:在命令行定义变量 |
| register:注册变量 |
| |
| --syntax-check 进行剧本配置信息语法检查 |
| -C:模拟剧本执行(彩排) |
| ignore_errors: yes |
简单剧本格式
PS:就是不断的堆积模块信息,但是一般需要加上注释 ,一个name信息下面只能写一个任务内容
2.2 剧本执行过程
| 1)先对剧本语法进行检查 |
| ansible-playbook --syntax-check test01.yml |
| 2)先对剧本进行模拟执行 |
| |
| |
| 第一步:定义主机信息 |
| 第二部:收集主机信息 |
| 第三部:执行具体任务 |
| 第四部:执行结果 |
| 3)真实执行剧本 |
| 4)进行检查确认 |
3. ansible-playbook定义变量的方法
意义:重复信息设置变量方便调用调整
定义变量的方法说明:
1)在ansible程序剧本中进行定义 (次优先)
| vars: |
| file_name: file_var.txt |
2)利用执行参数赋值变量 (最优先)
| --extra-vars=EXTRA_VARS=file_name=oldboy.txt |
| |
| ansible-playbook --extra-vars=file_name=file_ext.txt test03.yml |
| |
| ansible-playbook -e file_name=file_ext.txt test03.yml |
3)在ansible程序主机清单中定义 (最后执行)
| [server:vars] file_name=oldboy.txt |
| [oldboy:vars] |
| file_name=file_host.txt |
4)采用注册方式定义变量
| |
| 目的:让我们执行剧本的时候输出一些信息 |
| - hosts: oldboy |
| tasks: |
| - name: bianliang |
| shell: hostname shell:执行命令 |
| register: aaa 将shell命令的结果,注册授权变量aaa |
| |
| - name: info |
| debug: msg={{ aaa.stdout_lines }} 利用debug模块,命令 msg,调用变量将变 量显示出来,stdout_lines:标准输出,优化了下格式 |
4. 实现剧本的循环功能
4.1 定义:
示例
| 循环下载软件 |
| - name: Installed Pkg |
| yum: |
| name: ['wget','tree','lrzsz'] #8个空格 |
| state: present |
| 循环创建用户 |
| user: name={{ item.name }} groups={{ item.groups }} state=present |
| with_items: |
| - { name: 'gou1', groups: 'bin' } |
| - { nam e: 'gou2', groups: 'root' } |
| 将信息放在文件里进行循环 |
| shell: echo {{ item }} >>/oldboy.txt |
| with_items: |
| - gou1 |
| - gou2 |
| |
5. 利用标签功能,只执行剧本中指定任务
5.1 定义:
| 剧本完成多个任务可以灵活的执行 tags |
| tags:t? ?(任何数) |
示例
| |
| ansible-playbook --tags=t3,t1,t2 test07.yml |
| |
| |
| ansible-playbook --skip-tags=t3 |
| |
| -t t1 |
5.2 定义方式
| 1)一对一定义:一个任务对应一个标签 |
| 2)一对多定义:一个任务对应多个标签 |
| 3)多对一定义:多个任务对应一个标签 |
6. 忽略错误
定义:
先整体执行剧本内容,忽略部分操作错误
ignore_errors: yes
7. 触发器 handlers
handlers:触发器,剧本完成什么操作就触发相应操作
** notify: rsync restart 监控模块里的内容是否发生变化**
| handlers: |
| - name: rsync restart |
| service: name=rsyncd.service state=restarted |
8. ansible将多个剧本进行整合的方法:动态汇总
8.1 方法一:汇总剧本信息
| - hosts: all |
| remore_user: root |
| tasks: |
| - include_tasks: test08.yml |
| - include_tasks: test07.yml |
| 剧本中不可以存在重复的变量, |
| 需要在执行的剧本重新编写 |
8.2 方法二:
| ansible-playbook summary02.yml |
| - include: test07.yml |
| - include: test08.yml |
8.3方法三:
| ansible-playbook summary03.yml (入口文件-puppet) |
| - import_playbook: test07.yml |
| - import_playbook: test08.yml |
9. ansible剧本编写错误排除思路
| 第二个历程: 对剧本错误task进行标记 |
| a 排除标记的操作, 检查是否还有其他问题 |
| b 重新执行标记任务 |
| 第三个历程: 利用模块方式执行操作 |
| 单独对一个远程主机进行测试操作 |
| |
| 第四个历程: 将模块中的操作在远程主机上直接运行 |
| 将模块中的操作转换成命令, 在远程主机测试 |
| setenforce 0 无法反复 |
| |
10 综合架构批量管理(roles角色)
概念:将剧本中的角色和任务进行拆分,让批量管理更加灵活
角色文件编写应用:可以应用在大规模环境中应用
10. 1 编写角色剧本信息:
将原有剧本中所有信息进行拆分细化
细化之后需要创建不同的目录进行管理不同的数据信息
10.2 目录结构
| site.yml:任务服务目录:定义角色名称 |
| 合并文件目录- hosts: backup |
| remote_user: root |
| roles: |
| |
| handlers:任务触发目录:用于存放文件 ;至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含 |
| |
| tasks:任务文件目录:具体信息任务存放 |
| |
| main.yml 用于存放整合的目录 |
| - include_tasks: directory.yml |
| - include_tasks: directory01.yml |
| |
| templates:任务模板目录:模板文件存放 ;查找所需要模块文件的目录 |
| |
| vars:任务变量目录:具体变量文件存放 ;定义的是变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含; |
| |
| files:任务文件目录:用于存放原文件配置文件 ;存放copy或script模块等调用的文件 |
批量创建所需要的目录
| mkdir {nfs,rsync,web,sersync}/{vars,tasks,templates,handlers,files}/ |
| |
10.3 角色设置变量的方法
1)在相应角色信息vars目录中的main.yml中定义变量信息 (最先执行)
| nfs: oldboy123 (以这种形式书写在文件中) |
| |
2)在相应的roles目录(角色目录)中创建group_vars:作为变量目录 (次优先)
| vim all (会跟/etc/ansible/hosts文件进行匹配)使用hosts模块进行定义文件名称 |
| backup: woaini (变量名称):(变量内容) |
10.4 执行过程ansible-playbook site.yml
| 1)先加载site文件 |
| 2)加载目录文件(tasks)下的main.yml文件 |
| 3)如果main.yml文件中有变量会先到vars中寻找变量 |
| 4)如果vars中没有变量,就回到roles目录下寻找group_vars下寻找有没有该主机组的 变量 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!