Ansible的Playbook与 Roles

本文详细介绍了Ansible的Playbook和Roles的使用。Playbook是Ansible持久化配置管理的方式,涉及YAML基本规则、参数、配置文件、变量、标签和模板的使用。Roles则是一种层次化、结构化的组织Playbook的方法,适用于代码复用度高的场景。文章通过实例展示了如何创建和应用Roles,包括目录结构、任务编写、变量配置和模板操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 Playbook的介绍与运用

(一)、介绍

1、laybookad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstackstate状态文件。ad-hoc无法持久使用,playbook可以持久使用
2、playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

(二)、Playbook的核心元素

Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates(模板) 即使用模板语法的文件,比如配置文件等
Handlers 和notity结合使用 由特定条件触发的操作,满足条件方才执行,否则不执行
tags(标签) 指定某条任务执行,用于选择运行playbook中的部分代码

(三)、playbook的YAML基本规则

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml
1、在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略
2、次行开始正常写playbook的内容,一般都会写上描述该playbook的功能
3、使用#号注释代码
4、缩进必须统一,不能空格和tab混用
5、缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的
6、YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v 的值均需大小写敏感
7、k/v的值可同行写也可以换行写。同行使用 : 分隔
8、v可以是个字符串,也可以是一个列表
9、一个完整的代码块功能需要最少元素包括 name: task

案例

[root@Ansible ~]# vim jb.yaml

---
- hosts: node
  remote_user: root

  tasks:
  - name: "测试"
    file: name=/home/aaa.txt state=touch

  - name: "创建用户"
    user: name=aaa system=yes shell=/sbin/nologin

  - name: "安装服务"
    yum: name=httpd

  - name: "复制html页面"
    copy: src=/var/www/html/index.html dest=/var/www/html/index.html

  - name: "启动服务"
    service: name=httpd state=started

保存
——————————————————————————————————————————————————————————
  ---------              说明  
---                                        #固定格式
- hosts: node1                             #定义需要执行主机
  remote_user: root                        #远程用户
  tasks:                                   #定义一个任务的开始
  - name: "测试"                           #定义任务的名称
    file: name=/home/aaa.txt state=touch   #调用模块,具体要做的事情

——————————————————————————————————————————————————————————
[root@Ansible ~]# mkdir -p /var/www/html/
[root@Ansible ~]# echo "<h1>playbook 测试</h1>" >>/var/www/html/index.html
[root@Ansible ~]# ansible-playbook -C jb.yaml             #使用-C进行测试

PLAY [node] **************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [192.168.2.11]
ok: [192.168.2.12]

TASK [测试] ****************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

TASK [创建用户] **************************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]

TASK [安装服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

TASK [复制html页面] **********************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

TASK [启动服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

PLAY RECAP ***************************************************************************************************
192.168.2.11               : ok=6    changed=5    unreachable=0    failed=0   
192.168.2.12               : ok=6    changed=5    unreachable=0    failed=0   

正式执行命令


[root@Ansible ~]# ansible-playbook jb.yaml          

PLAY [node] **************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [192.168.2.12]
ok: [192.168.2.11]

TASK [测试] ****************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

TASK [创建用户] **************************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]

TASK [安装服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

TASK [复制html页面] **********************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]

TASK [启动服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]

PLAY RECAP ***************************************************************************************************
192.168.2.11               : ok=6    changed=5    unreachable=0    failed=0   
192.168.2.12               : ok=6    changed=5    unreachable=0    failed=0   

 验证访问

 (四)、playbook的参数

格式
ansible-playbook <filename.yml> ... [options]            
参数 说明
--syntax-check 检测yaml文件的语法
-C(--check) 预测试,不会改变目标主机的任何设置
--limit 主机列表 只针对主机列表中的某个主机或者某个组执行
--list-hosts 列出yaml文件影响的主机列表
--list-tasks 列出playbook文件执行的所有任务
--list-tags 列出playbook文件中所有可用的标签(tags)
-t TAGS (--tags=TAGS) 表示只运行标记此标签的任务
--skip-tags=SKIP_TAGS 表示跳过运行标记此标签的任务,执行其他任务
--start-at-task=START_AT 从指定的任务开始往下运行
--flush-cache 清除fact缓存
--force-handlers 如果任务失败,也要运行handlers
--step 在运行之前确认每个任务
-e 传入变量
-f 指定并发数,默认为5个
-t 指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v 显示过程  -vv  -vvv更详细

(五)、Playbook中配置文件

1、 主机与用户

 在一个playbook的开头,最先定义的是要操作的主机和用户


---
- hosts: node
  remote_user: root     

在某一个tasks中定义要执行该任务的远程用户


tasks: 
  - name: run df -h
    remote_user: aaa
    shell: name=df -h   

也可以定义使用sudo授权用户执行该任务


tasks: 
  - name: run df -h
    sudo_user: aaa
    sudo: yes
    shell: name=df -h      

2、tasks任务列表

 每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,如果没有定义 nameaction的值将会用作输出信息中标记特定的task
每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行这个被定义的tasks


tasks:
  - name:"创建文件" 
    file: path=/tmp/aaa.txt state=touch
  - name: "创建用户"
    user: name=aaa state=present        

3、Handlers(动作)与Notify(触发)

在很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlersnotify了;
(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次

  ————————————————————给2.10 服务器拷贝一份配置文件
[root@node1 ~]# cd /etc/httpd/conf/               
[root@node1 conf]# ls                 
httpd.conf  magic
[root@node1 conf]# scp httpd.conf root@192.168.2.10:/root/               
The authenticity of host '192.168.2.10 (192.168.2.10)' can't be established.
ECDSA key fingerprint is SHA256:W/vWUUz52EWoxAj6qq8J91ffWH4p8nCvmdGQCmUbRNo.
ECDSA key fingerprint is MD5:b2:4f:b6:ff:94:3a:1e:3d:2e:f8:f4:4e:f5:8c:ca:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.10' (ECDSA) to the list of known hosts.
root@192.168.2.10's password: 
httpd.conf                                                                  100%   11KB  15.1MB/s   00:00  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘浪初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值