当前位置: 首页 > news >正文

Ansible Playbook 保姆级教程:从基础配置到 Roles 实战,运维自动化必看

文章目录

  • 前言
  • 一、Playbook 基础概念
    • 1.1 Playbook 结构概述
  • 二、Playbook 示例解析
    • 2.1 基础Playbook示例
  • 三、Playbook 执行与管理
    • 3.1 命令行运行 Playbook
    • 3.2 认证相关参数
  • 四、变量定义与使用
    • 4.1 变量定义方法
    • 4.2 命令行传递变量
  • 五、条件判断与循环
    • 5.1 条件判断 when
    • 5.2 迭代循环 with_items 和 loop
  • 六、模板系统 Templates
    • 6.1 Jinja2 模板引擎
    • 6.2 模板使用示例
  • 七、Tags 模块
    • 7.1 Tags 的作用
    • 7.2 Tags 使用示例
    • 7.3 执行指定Tags
  • 八、Roles 模块
    • 8.1 Roles 概念与优势
    • 8.2 Roles 目录结构
    • 8.3 使用Roles的步骤
    • 8.4 Roles 实战案例
      • 8.4.1 创建项目目录
      • 8.4.2 编写httpd模块
      • 8.4.3 编写mysql模块
      • 8.4.4 编写php模块
      • 8.4.5 编写roles剧本
  • 总结

前言

在现代IT基础设施管理中,自动化配置管理工具已成为不可或缺的一部分。Ansible作为一款强大的自动化工具,以其简单易用、无需代理的特点受到广泛欢迎。

而Playbook作为Ansible的核心功能,允许用户以YAML格式定义自动化任务,实现基础设施即代码(IaC)的理念。本文将全面介绍Ansible Playbook的编写方法,从基础结构到高级应用,帮助您掌握这一强大工具。

一、Playbook 基础概念

1.1 Playbook 结构概述

Ansible的Playbook是一个包含多个Play的YAML文件,每个Play负责对指定的主机组执行一系列的任务。Playbook通常由以下几个核心组成部分:

  • Tasks(任务):每个任务调用一个模块在目标主机上执行操作
  • Variables(变量):通过定义和使用变量增加Playbook的灵活性和可重用性
  • Templates(模板):通过Jinja2模板动态生成配置文件
  • Handlers(处理器):用于响应任务执行后的变更(由notify触发)
  • Roles(角色):将多个任务、变量、模板、文件和处理程序组织成模块化结构,便于复用

二、Playbook 示例解析

2.1 基础Playbook示例

以下是一个简单的Playbook示例,展示了基本的任务执行流程和Ansible模块的使用方法:

vim test1.yaml---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play1     #定义一个play的名称,可省略gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root    #指定被管理主机上执行任务的用户tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection    #自定义任务名称ping:     #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped enabled=no   #使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=yes name=httpd state=startedhandlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd    #notify和handlers中任务的名称必须一致service: name=httpd state=restarted

请注意:Ansible在执行完某个任务后并不会立即执行对应的handler,而是在当前play中所有普通任务执行完后再执行handler。这样的好处是可以多次触发notify,但最后只执行一次对应的handler,避免多次重启。

# demo02 安装maridb
---
- name: install mysqlhosts: dbserverstasks:- name: install mysql serveryum:name: mariadb,mariadb-serverstate: latestbecome: yes- name: start mysqlservice:name: mariadbstate: startedbecome: yes

三、Playbook 执行与管理

3.1 命令行运行 Playbook

运行Playbook时,可以使用以下常用参数调整执行行为:

ansible-playbook test1.yaml  # 运行playbook

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

ansible-playbook test1.yaml --syntax-check  # 检查语法
ansible-playbook test1.yaml --list-task  # 查看任务列表

在这里插入图片描述

ansible-playbook test1.yaml --list-hosts  # 查看影响的主机

在这里插入图片描述

ansible-playbook test1.yaml --start-at-task='install httpd'  # 从指定任务开始执行

在这里插入图片描述

3.2 认证相关参数

如果需要使用SSH密码或sudo密码,可以使用以下选项:

ansible-playbook test1.yaml -k  # 提示输入SSH密码
ansible-playbook test1.yaml -K  # 提示输入sudo密码

四、变量定义与使用

4.1 变量定义方法

变量在Playbook中非常有用,可以通过vars或命令行进行定义:

---
- name: second playhosts: dbserversremote_user: rootvars:groupname: mysqlusername: nginxtasks:- name: create groupgroup:name: "{{ groupname }}"system: yesgid: 306- name: create useruser:name: "{{ username }}"uid: 306group: "{{ groupname }}"- name: copy filecopy:content: "{{ ansible_default_ipv4 }}"dest: /opt/vars.txt
# 执行playbook
ansible-playbook test2.yaml# 验证执行结果
ansible dbservers -a 'id nginx'
ansible dbservers -a 'cat /opt/vars.txt'

在这里插入图片描述

4.2 命令行传递变量

变量也可以通过-e参数在命令行中传递:

#  Ansible 的 ​幂等性​(Idempotency)——即 Playbook 可以安全地重复执行而不会产生副作用
ansible-playbook test2.yaml -e 'username=nginx'

在这里插入图片描述

五、条件判断与循环

5.1 条件判断 when

在Ansible中,when指令是唯一通用的条件判断方式。当when指令的值为true时,执行该任务,否则不执行

when用于根据条件执行任务。它的常见用法包括:

  • 根据主机的 IP 地址来执行任务
# when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务。---
- hosts: allremote_user: roottasks:- name: shutdown host command: /sbin/shutdown -r now  when: ansible_default_ipv4.address == "192.168.10.14"  #注意:变量不需要加{{}}

在这里插入图片描述

  • 或者根据主机名执行任务
# 需要修改/etc/hosts做主机名映射
when: inventory_hostname == "<主机名>"
  • 条件判断when的其他案例
1、判断 内存是否 >=4096 如果大于就安装mariadb
2、判断 cpu 核数 如果是双核 就安装 http
---
- name: when demohosts: allgather_facts: true  remote_user: root        tasks:- name: Install MariaDB yum:name: mariadb,mariadb-serverstate: presentwhen: ansible_memtotal_mb >= 4096 - name: Print message if memory insufficientdebug:msg: "Memory is only {{ ansible_memtotal_mb }}MB"when: ansible_memtotal_mb < 4096- name: Install Apacheyum:name: httpdstate: presentwhen: ansible_processor_cores >= 2- name: Print message if cores insufficientdebug:msg: "cores is only {{ ansible_processor_cores }}"when: ansible_processor_cores < 2

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

5.2 迭代循环 with_items 和 loop

playbook迭代是指持续修改和优化ansible-playbook 以适应不断变化的运维的需求。 这种迭代提升了自动化任务的效率和准确性。

Ansible支持使用with_itemsloop进行迭代。两者作用相同,loop是较新的推荐用法。

# Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。---
- name: demo5.ymlhosts: dbserversremote_user: roottasks:- name: create directorysfile:path: "{{ item }}"state: directoryloop:    # 等同于with_items:- /tmp/test1- /tmp/test2- name: create usersuser:name: "{{ item.name }}"state: presentgroups: "{{ item.groups }}"loop:- name: test1groups: wheel- name: test2groups: root

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

六、模板系统 Templates

6.1 Jinja2 模板引擎

Jinja是基于Python的模板引擎。Template类是Jinja的重要组件,可以看作编译过的模板文件,用于生成目标文本,传递Python变量替换模板中的标记。

templates模块通过 jinjia2把变量和固定内容结合,生成最终的配置文件,并可控制权限和属主,用于自动化部署中灵活生成个性化的配置,来提高管理的效率

Jinja2 模板引擎在 Ansible 中用来动态生成文件。例如,在配置 Apache 时,可以使用模板文件来替换动态值。

6.2 模板使用示例

  1. 创建Jinja模板文件 (.j2)
# 准备.j2后缀的template模板文件,设置引用变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2
Listen {{ http_port }}				#42行,修改
ServerName {{ server_name }}			#95行,修改
DocumentRoot "{{ root_dir }}"          #119行,修改
  1. 在主机清单中定义变量
#修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts  
[webservers]
192.168.10.14 http_port=80 server_name=www.simon.com:80 root_dir=/etc/httpd/htdocs
  1. 使用模板的Playbook
- hosts: webserversremote_user: rootvars:service: httpdtasks:- name: install "{{ service }}"yum:name: "{{ service }}"state: latest- name: install configure filetemplate:src: /opt/httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: - restart httpd- name: create root dirfile:path: "{{ root_dir }}"state: directory- name: start httpd serverservice:name: "{{ service }}"state: startedenabled: yeshandlers:- name: restart httpdservice:name: "{{ service }}"state: restarted

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

七、Tags 模块

7.1 Tags 的作用

Tags 允许你指定只执行某些特定任务。通过命令行传入 --tags 参数来执行带有特定标签的任务。

这在大型Playbook中特别有用,可以只运行部分任务而不需要执行整个Playbook。

7.2 Tags 使用示例

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用**–tags**选项能实现仅运行指定的tasks。

playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

---
- hosts: webserversremote_user: roottasks:- name: touch file1file: path=/opt/test1 state=touchtags:- always  # 始终执行,无论指定哪个tags- name: touch file2file: path=/opt/test2 state=touchtags:- only

7.3 执行指定Tags

ansible-playbook webhosts.yaml --tags="only"

特殊标签always的作用是当使用always tags的task时,无论执行哪一个tags,定义有always的tags都会执行。
在这里插入图片描述

# tags=only不会执行
ansible-playbook webhosts.yaml --tags="always"

在这里插入图片描述

八、Roles 模块

8.1 Roles 概念与优势

随着业务增长,数据中心会有各种不同类型的主机(Web服务器、数据库服务器、开发环境服务器等)。处理这些情况的Ansible playbook会变得庞大复杂。

Roles提供了以下优势

  • 简化剧本管理:将剧本分解为较小的模块后,每个角色处理特定功能,使得整体管理更加清晰。
  • 模块化和重用性:角色可以在不同的项目或场景中反复使用,减少重复代码的编写。
  • 易于维护和扩展:当某个部分的逻辑需要更新时,只需修改相应的角色,而不必修改整个playbook。

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

8.2 Roles 目录结构

每个Role都有预定义的目录结构:

roles/
├── web/
│   ├── files/
│   ├── templates/
│   ├── tasks/
│   ├── handlers/
│   ├── vars/
│   ├── defaults/
│   └── meta/
└── db/├── files/├── templates/├── tasks/├── handlers/├── vars/├── defaults/└── meta/

各目录含义

  • files:存放由copy或script模块调用的文件
  • templates:存放jinjia2模板,template模块自动在此目录寻找模板文件
  • tasks:包含main.yml文件,定义此角色的任务列表
  • handlers:包含main.yml文件,定义触发条件时执行的动作
  • vars:包含main.yml文件,定义此角色用到的变量
  • defaults:包含main.yml文件,为当前角色设定默认变量
  • meta:包含main.yml文件,定义此角色的特殊设定及依赖关系

8.3 使用Roles的步骤

  1. 创建roles目录:
mkdir /etc/ansible/roles/ -p    #yum安装后默认已有
  1. 创建全局变量目录(可选):
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all     #文件名自定义,引用时注意
  1. 在roles目录中创建各角色目录:
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
  1. 在每个角色目录中创建子目录:
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
  1. 创建main.yml文件:
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
  1. 编写site.yml调用角色:
vim /etc/ansible/site.yml
---
- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremote_user: rootroles:- mysql
  1. 运行ansible-playbook:
cd /etc/ansible
ansible-playbook site.yml

8.4 Roles 实战案例

8.4.1 创建项目目录

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

在这里插入图片描述

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

在这里插入图片描述

8.4.2 编写httpd模块

vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apacheyum:name: "{{ pkg }}"state: latest
- name: start apacheservice:name: "{{ svc }}"state: startedenabled: yes# 定义变量
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd

8.4.3 编写mysql模块

vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysqlyum:name: "{{ pkg }}"state: latest
- name: start mysqlservice:name: "{{ svc }}"state: startedenabled: yesvim /etc/ansible/roles/mysql/vars/main.yml
pkg:- mariadb- mariadb-server
svc: mariadb

8.4.4 编写php模块

vim /etc/ansible/roles/php/tasks/main.yml
- name: install phpyum:name: "{{ pkg }}"state: latest
- name: start phpservice:name: "{{ svc }}"state: startedenable: yesvim /etc/ansible/roles/php/vars/main.yml
pkg:- php- php-fpm
svc: php-fpm

8.4.5 编写roles剧本

vim /etc/ansible/site.yml
---
- hosts: webserversremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml

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

总结

Ansible Playbook是自动化配置管理的核心工具,通过YAML格式的声明式语言,使基础设施管理变得简单高效。本文从Playbook基础结构入手,详细介绍了变量使用、条件判断、迭代循环、模板系统、Tags标签和Roles角色等核心功能。

通过合理使用这些功能,您可以创建出结构清晰、可重用性高的自动化脚本,大大提高运维效率。特别是Roles功能,能够将复杂的环境配置模块化,是Ansible在实际生产环境中应用的最佳实践。

掌握Ansible Playbook编写不仅能够提升个人技能,还能为团队带来标准化和自动化的运维流程,是现代运维工程师和开发者的必备技能。

http://www.dtcms.com/a/407958.html

相关文章:

  • c 网站开发简单实例设计企业vi
  • 宁夏网站建设哪里有个人品牌营销公司
  • 如何做国外的网站国外优秀门户网站
  • 个人网站 jsp 域名空间网站平台建设咨询合同
  • 栈的学习——逆波兰表达式(RPN)
  • SSM网上点餐系统g582p(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 专业app网站建设遵义企业网络推广方案
  • mysql——用户管理
  • 网博士自助建站系统进贤县住房和城乡建设局网站
  • C语言扫雷游戏
  • 做网站租空间wordpress怎样发布
  • 网站建设优選宙斯站长网站自动识别手机代码
  • 永磁同步电机无速度算法--恒is的调整方法实现IF与SMO间的平滑切换
  • 网站建设评分标准网页游戏新区开服
  • 网站的版面设计邯郸网站设计制作
  • 做个网站 多少钱网站html模板下载
  • 月票车超时配置功能
  • 网站软件下载安装网站建设项目采购公告
  • jsp购物网站开发微信小程序与wordpress
  • AlmaLinux release 9.6服务器离线安装nginx-1.24.0详细步骤
  • 淘宝获取商品详情数据API接口PC端和App端的实际操作指南
  • 在哪个公司建设网站好设计网站页面要注意什么
  • 移动固态硬盘连接手机无法读取是什么原因?
  • 做阿里巴巴1688网站程序cms网站开发实验报告
  • 做美图+网站有哪些公司网站怎么做
  • Ubuntu24搭建PHP访问SQL Server环境
  • 甘州区建设局网站做logo的网站
  • 网站名 注册钓鱼网站搭建教程
  • 电子商务网站规划与建设步骤武夷山网站建设wzjseo
  • 学校网站开发免费行情软件app网站大全下载免费入口