html婚纱网站源码,建站系统破解源码,c2c平台下载,受欢迎的企业网站建设目录
Playbook的定义
Playbook组成
Playbook命令
Playbook剧本编写格式
基本组件
Handlers处理器
tags标签
Facts组件
Register#xff1a;注册变量
Debug模块
Playbook循环
With_items循环
With_dict循环#xff08;字典循环#xff09;
With_nested循环注册变量
Debug模块
Playbook循环
With_items循环
With_dict循环字典循环
With_nested循环嵌套循环
Loop循环
playbook条件
when判断
Black定义任务组
Ansible变量
通过vars定义变量
通过vars_files定义变量
通过变量目录定义变量
通过命令行定义变量 Playbook的定义
Playbook其实是Ansible服务的一个配置文件Ansible使用Playbook的YAML语言配置编写成操作需求实现对远端主机的策略部署以及对远端主机的控制与管理。如果说单个模块执行类似于Linux系统中的命令那么Playbook就类似于shell脚本将多个模块组合起来实现一组的操作。
Playbook组成
剧本Playbook
Playbook是一个或多个play的集合。
一个playbook文件可以包含多个play每个play定义了一组要执行的任务。 剧目Play
一个play定义了一组要执行的任务以及这些任务适用的主机或主机组。
Play包含一个或多个任务task这些任务按顺序执行。
每个play开始时可以指定要应用任务的主机或主机组以及一些可选的设置如变量、角色等。
这里可以这样来理解play就相当于是shell中的一个脚本shell≈playbook而shell中可以有很多脚本所以playbook中也可以有很多play而task就相当于是shell中封装的函数一个脚本中可以有多个函数所以play中也可以有多个task每个task就是为了实现一个功能 其核心元素 任务Task
任务是playbook的基本执行单元。
每个任务都是一个模块的调用用于在目标主机上执行特定的操作。
任务可以有名称name用于描述任务的目的。
任务可以使用变量来参数化模块的参数。 变量Variable
变量用于存储和传递playbook中的动态值。
变量可以在playbook的不同位置定义如inventory文件、play中的vars部分、任务中的参数等。
变量可以在任务中使用Jinja2模板语法进行引用和操作。
条件和循环
Ansible支持在任务中使用条件语句when来控制任务的执行。
可以根据变量的值、主机的状态等条件来决定是否执行某个任务。
Ansible还支持使用循环loop来重复执行任务可以遍历列表或字典等数据结构。
处理程序Handler
处理程序是一种特殊的任务在满足特定条件时触发执行。
处理程序通常用于重启服务、重新加载配置等操作。
任务可以使用notify关键字来通知处理程序当任务执行成功时处理程序将被触发。
模板Template
模板是一种使用Jinja2模板语言编写的文件。
模板允许你在文件中使用变量、条件语句、循环等功能动态生成配置文件。
Ansible的template模块用于将模板文件渲染并复制到目标主机上。 Playbook命令
执行剧本的格式
ansible-playbook [参数] playbook.yml
常用参数 参数 解析 -T 建立SSH连接的超时时间 -i 指定Inventory文件 -f 并发执行的进程数默认为5 - -list-hosts 匹配的服务器列表 - -list-tasks 列出任务列表 - -step 每执行一个任务后停止等待用户确认 - -syntax-check 语法检测 - -list-tags 列出此yml文件中的所有tag标签 - -skip-tags 执行–skip-tags之外的标签任务 -C 检查当前这个Playbook是否会修改受控端模拟执行
Playbook剧本编写格式
从上文定义可知playbook剧本的配置文件为YAML格式的文件
YAML的格式如下 .文件的第一行应该以“---”三个连字符开始表明YAML文件的开始。常见的缩进为4格方式也可以使用 2 个空格或制表符但要保持一致。在同一行中#之后的内容表示注释类似于shellpython和ruby。YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。同一个列表之中的元素应该保持相同的缩进否则会被当做错误处理。play中hosts、variables、roles、tasks等对象的表示方法都是以键值中间以“”分隔表示并且“”之后要加一个空格。 基本组件
这里通过一个http.yml文件来对组件进行解析
---- name: apachehosts: web01remote_user: rootbecome: yestasks:- name: Install httpd Serveryum:name: httpdstate: present
name定义一个Playbook的名称用于标识Playbook的用途
hosts指定要在哪个主机上执行也是写主机或主机组名需要提前在/etc/ansible/hosts中配置好
remote_user: 指定playbook运行时的用户身份可以写在hosts下也可以每个tasks做定义
becomeyes表示使用特权用户一般和remote_user一起使用
tasks属于是一个任务列表主要写具体执行什么的可以有多个 name每个任务的名称用于描述干什么的上述yml中则是安装httpd服务 yum表示使用哪个模块来进行操作模块的参数可以看ad-hoc中的用的都是一样的写法不一样就是 name要安装的服务名称我们这里是httpd state要进行的操作可以是安装、卸载、更新 生产环境中为了可读性与可维护性通常一个playbook中只编写一个play如果某些主机需要执行多个play,那么可以使用include关键字在一个playbook中导入其他的playbook。
Handlers处理器
Handlers 不会自动执行只有当被notify语句调用时才会执行。
handlers和notify指定的名称必须相同否则无法触发。
handlers 中需要- name指定名称 handlers只会在所有的tasks执行完后执行并且即便一个handlers被触发多次也只会执行一次。 handlers是一种特殊的tasks。 Handlers多用于重启服务等操作
下面举一个redis示例 ---- name: redishosts: web01tasks:- name: install redisyum:name: redisstate: installed- name: copy_filecopy:src: /etc/redis.confdest: /etc/redis.conf.bak#给任务打标签tags: copy_file#触发开关触发的名称notify: restart- name: startservice:name: redisstate: startedenabled: yes#触发后的一个动作handlers:- name: restartservice:name: redisstate: restarted 测试是否能够启动 tags标签
这里举例到了tags组件就把tags来讲一下吧
默认情况下Ansible在执行一个playbook时会执行playbook中定义的所有任务Ansible playbook中的tags标签是一种用于选择性运行特定任务或任务集的机制。通过为每个任务指定标签您可以在运行playbook时选择只运行带有特定标签的任务而不运行其他任务。这对于控制和管理Ansible playbook的执行非常有用特别是当playbook中包含许多任务时。 如果只需要运行单独的任务就可以通过标签指定 通过任务列表可以看到它只执行了copy模块
Facts组件
Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。 前面setup模块也说过可以指定facts组件的内置变量去获取主机信息原理是一样的
使用shell模块引用facts组件变量存储输出的信息利用debug把存储的信息输出到终端
[rootlocalhost ansible]# cat facts.yml---- hosts: web01tasks:- shell: echo {{ ansible_memory_mb }}register: my_memory- debug:var: my_memory.stdout_lines
setup模块输出和playbook利用facts输出 上述编写的剧本中用到register和debug下面对此展开讲解
Register注册变量
它用于将一个任务的执行结果存储到一个变量中以便在后续的任务中可以引用这个变量进行条件判断、输出显示或者其他操作。这个变量可以包含任务执行的返回码、标准输出、标准错误输出等信息。常和debug结合使用register用于存储debug用于输出。
[rootweb01 ansible]# cat register.yml---- hosts: web01tasks:- shell: echo 这是一个registerregister: shell_print- debug:var: shell_print.stdout_lines
测试 Debug模块
debug模块在 Ansible Playbook 中主要用于输出调试信息帮助你了解变量的值、任务执行情况等内容以便排查问题、验证配置是否符合预期。它可以将指定的变量值或者自定义的消息打印出来使得整个 Playbook 的执行过程更加的清晰
常用参数 msg 调试输出的消息 var: 将某个任务执行的输出作为变量传递给debug模块debug会直接将其打印输出一般会和register的变量配合输出 verbosity: debug的级别默认是0级 这里举例msg参数自定义信息
[rootweb01 ansible]# cat debug.yml---- hosts: web01tasks:- yum: namehttpd stateinstalled- debug:msg: httpd安装完成 Playbook循环
With_items循环
with_items是 Ansible 中最常用的循环机制之一。它允许你在一个任务中对一个列表中的每个元素执行相同的操作。这个列表可以包含各种数据类型如字符串、数字、字典等。
这里直接举实例
批量创建用户
[rootweb01 ansible]# cat user.yml---- name: creathosts: web01tasks:- name: create useruser:name: {{ item }}state: presentwith_items:- ha1- ha2- ha3
验证 With_dict循环字典循环
由于ansible是由python开发的所以ansible字典完全遵守python字典的定义
字典即由键值对组成键值对的键和键值对的值讲究 一 一对应且在同一个字典中键必须唯一值任意。
键值对格式item.keyitem.value
概念当你有一个字典数据结构并且想对字典中的每个键值对进行操作时可以使用with_dict循环。在循环中item.key表示字典的键item.value表示字典的值。 这里有新添的内容还没讲到其实前面主机清单提到过大致用法相同不多做赘述大致先来讲一下
Vars定义了一个变量services这个变量里包含两个字典service1service2他们下面分别有两个键值对
[rootweb01 ansible]# touch /etc/services.conf[rootweb01 ansible]# cat dict.yml---- name: using a dictionaryhosts: web01vars:services:service1:port: 8080protocol: tcpservice2:port: 8888protocol: udptasks:- name: Configure Service Portslineinfile:path: /etc/services.confline: {{ item.key }} {{ item.value.port }}/{{ item.value.protocol }}with_dict: {{ services }} With_nested循环嵌套循环
with_nested是 Ansible 中用于实现嵌套循环的一种方式。它允许你在一个任务中对多个嵌套的列表进行迭代生成所有可能的组合来执行任务。这在处理多层数据结构需要对组合后的元素进行操作时非常有用。 例如有两个列表一个是服务器类型列表server_types另一个是数据中心列表data_centers你想要为每个服务器类型在每个数据中心创建一个配置文件。
[rootweb01 playbook_file]# mkdir /root/configs[rootweb01 playbook_file]# cat nested.yml---- name: with_nested 循环hosts: web01vars:server_types: [web, db]data_centers: [dc1, dc2]tasks:- name: Create config filescommand: touch /root/configs/{{ item.0 }}_{{ item.1 }}.confwith_nested:- {{ server_types }}- {{ data_centers }} 通过这个结果可以得到item.0在这里代表着server_types列表里的所有元素item.1代表着data_centers列表的所有元素所以最后才得到了这4个配置文件且是进行的有序创建那么可以得到item可以同时包含多个值且为有序序列所以item是一个元组。
Loop循环
概念是 Ansible 2.5 版本引入的一种更通用的循环结构。它可以用于遍历多种数据类型包括列表list、字典dict等对嵌套也能进行操作提供了一种统一的循环语法相当于是with_*的升级版。
推荐使用loop循环它能够更好地与 Ansible 的其他新特性如条件判断、标签等相结合而with_items在一些复杂场景可能会受限制。 也可以参考官方文档循环 — Ansible 社区文档 - Ansible 文档 常用过滤器 select / reject这两个过滤器允许您根据条件选择或排除列表中的元素。unique去除重复项元素flatten列表包含其他列表您可以使用 flatten 来将所有子列表中的元素提取出来合并成一个新的列表具有一个可选参数levels用于指定需要合并几层嵌套的列表dict2items loop本身默认的数据格式通常是一个列表所以需要将字典转换为包含键 - 值对的列表形式product在我理解来看这个过滤器主要用于计算两个或多个列表时的的组合问题在数学中称它为笛卡尔积例如若 A {1,2}B {3,4}则 A×B {(1,3),(1,4),(2,3),(2,4)}这4个组合。 基本格式loop {{变量名 | 过滤器可选}} 使用loop循环遍历字典时需要使用dict2items过滤器将其转换成可被loop遍历的列表形式其中每个元素都是一个包含key和value属性的对象
[rootweb01 ansible]# cat dict.yml---- name: Configure services using a dictionaryhosts: web01vars:services:service1:port: 8080protocol: tcpservice2:port: 8888protocol: udptasks:- name: Configure Service Portslineinfile:path: /etc/services.confline: {{ item.key }} {{ item.value.port }}/{{ item.value.protocol }}loop: {{ services | dict2items }} 使用loop做一个嵌套循环
这里使用了product过滤器最后通过list将结果组合转化为列表
[rootweb01 playbook_file]# cat loop.yml---- name: Loop with custom variable namehosts: localhostvars:my_list: [apple, banana, cherry]your_list: [orange, peach, pear]tasks:- name: Print elements with custom loop variabledebug:msg: This is what you and I like to eat {{ item.0 }}_{{ item.1 }}loop: {{ my_list|product(your_list)|list }} playbook条件
when判断
在 Ansible - Playbook 中when语句用于条件判断它决定了任务是否执行。只有当when条件为真时对应的任务才会被执行。 通过判断内置变量是否正确从而下载服务
[rootweb01 playbook_file]# cat when.yml---- name: System judgmenthosts: web01tasks:- shell: echo {{ ansible_os_family }}register: my_family #存储shell输出的变量- debug:var: my_family.stdout #打印内置变量- name: Install serveryum:name: redisstate: installedwhen: ansible_os_family RedHat 通过定义变量判断下载服务
[rootweb01 playbook_file]# cat when2.yml---- name: Install a packagehosts: web01vars:install_package: truetasks:- name: Installyum:name: httpdstate: installedwhen: install_package Black定义任务组
在 Ansible 2.4 及以上版本中block通常用于组织一些做重复任务的结构。它允许将多个相关的任务组合在一起形成一个逻辑单元。这个逻辑单元可以看作是一个任务块这些任务要么全部成功执行要么在出现错误时按照特定的错误处理机制如rescue和always进行处理。
通过black定义任务块
[rootweb01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: 文件已创建tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: {{ my_info }}when: install_package 通过rescue进行错误处理
如果block中的任务出错rescue中的任务会执行。
[rootweb01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: 文件已创建tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: {{ 错误变量 }} #通过自定义一个不存在的变量让task2出错when: install_packagerescue:- name: other taskdebug:msg: 前面任务执行失败了现在通过rescue处理 通过always处理进行追加任务
always中的任务无论block中的任务成功与否都会执行。
[rootweb01 playbook_file]# cat black.yml---- name: blockhosts: web01vars:install_package: truemy_info: 文件已创建tasks:- name: blockblock:- name: Task 1 in blockfile:path: /root/httpd.confstate: touch- name: Task 2 in blockdebug:msg: {{ 错误变量 }}when: install_packagerescue:- name: other taskdebug:msg: 前面任务执行失败了现在通过rescue处理always:- name: add taskdebug:msg: {{ my_info }} Ansible变量
其实前面已经对变量有很多的应用了不论是在主机清单中设置变量还是在play文件中设置变量
这里主要对playbook中的变量进行讲解
变量的定义方式
通过命令行进行变量定义在play文件中进行变量定义通过Inventory主机信息文件中进行变量定义
变量读取的优先级为: 命令行 playbook文件 Inventory文件
通过vars定义变量
通过vars定义变量packages_name下载mariadb-server服务
---- name: mysqlhosts: web01vars:packages_name:- mariadb-servertasks:- name: install mysqlyum:name: {{packages_name}}state: present 通过vars_files定义变量
当变量较少时使用vars定义没有问题当变量较多时可以将变量保存到一个独立的文件中
创建一个专门保存变量的文件
[rootweb01 playbook_file]# cat my_vars.yml---httpd_package: httpd
通过主文件调用变量文件 [rootweb01 playbook_file]# cat vars.yml---- name: mysqlhosts: web01vars:packages_name:- mariadb-servervars_files:- my_vars.yml #调用文件操作tasks:- name: install mysqlyum:name: {{packages_name}}state: present- name: install httpdyum:name: {{ httpd_package }}state: present 通过变量目录定义变量
这里需要注意这是官方制订的定义方法所以目录名字不能做修改
主机目录host_vars
在host_vars目录中定义的变量只能给对应的主机使用没有定义变量的主机不能使用此处的变量
host_vars目录然后在创建一个文件夹文件的文件名称要与inventory清单中的主机名称要保持完全一致如果是IP地址则创建相同IP地址的文件即可。 在ansible目录下创建一个host_vars目录
[rootweb01 ansible]# tree.├── ansible.cfg├── hosts├── host_vars #目前的一个目录结构│ └── web01 # 此为文件非目录[rootweb01 ansible]# cat host_vars/web01---my_info: 这是定义在host_vars中的变量
主机组目录group_vars
在项目目录中创建group_vars目录然后在创建一个文件文件的文件名称要与清单文件中定义的组名保持完全一致。
在ansible目录下创建一个group_vars目录
[rootweb01 ansible]# tree.├── ansible.cfg├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01[rootweb01 ansible]# cat group_vars/web_groupgroup_info: 这是在group_vars里的信息 主机清单inventory.ini
ansible-playbook命令提供-i选项用于在命令行定义主机清单inventory.ini命令行定义主机清单的优先级最高。
命令行主机清单inventory.ini /etc/ansible/hosts
[rootweb01 ansible]# tree.├── ansible.cfg├── group_play.yml├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini
主机清单的配置
配置这个inventory.ini文件如果直接填写主机名需要在/etc/hosts文件添加映射且需要给填写主机配置免密登录
[rootweb01 ansible]# cat inventory.ini#主机web01web02#主机组[web_group]web01web02
最后创建play.yml文件来调用主机变量host_vars/web01
├── ansible.cfg├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini├── play.yml[rootweb01 ansible]# cat play.yml---- name: infohosts: web01tasks:- name: 记录信息debug:msg: {{ my_info }} 执行play.yml文件 创建group_play.yml文件来调用主机变量group_vars/web_group
[rootweb01 ansible]# tree.├── ansible.cfg├── group_play.yml├── group_vars│ └── web_group├── hosts├── host_vars│ └── web01├── inventory.ini├── play.yml[rootweb01 ansible]# cat group_play.yml---- name: infohosts: web_grouptasks:- name: 记录信息debug:msg: {{ group_info}} 执行group_play.yml文件 通过命令行定义变量
ansible-playbook命令提供-e选项用于在命令行定义变量命令行定义变量的优先级最高。
[rootweb01 ansible]# cat group_play.yml---- name: infohosts: web_grouptasks:- name: 记录信息debug:msg: {{ group_info}}
命令行定义变量暂时替代group_vars/web_group中的变量
[rootweb01 ansible]# ansible-playbook -i inventory.ini group_play.yml -e group_info这是在命令行定义的变量