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

Ansible Playbook:自动化配置管理的利器

Ansible Playbook:自动化配置管理的利器

  • 前言
  • 一、 Playbook 的结构
  • 二、 Ansible Playbook 示例
  • 三、 命令行运行 Playbook
  • 四、 变量和引用
  • 五、 条件判断 `when`
  • 六、 迭代:使用 `with_items` 或 `loop`
  • 七、 Templates 模块
  • 八、 Tags 模块
  • 九、 Roles 模块
      • 9.1 Roles 概念
      • 9.2 roles 内各目录含义解释
      • 9.3 在一个 playbook 中使用 roles 的步骤
      • 9.4 案列
        • 9.4.1 创建项目目录
        • 9.4.2 编写httpd模块
        • 9.4.3 编写mysql模块
        • 9.4.4 编写php模块
        • 9.4.5 编写roles
  • 结语

前言

  在当今的IT运维领域,自动化工具的应用已经成为提升效率和减少人为错误的关键手段。Ansible,作为一款开源的自动化引擎,以其简洁的语法、强大的功能和易于上手的特点,受到了广大运维工程师和开发者的青睐。特别是在配置管理和应用部署方面,Ansible通过其独特的Playbook机制,实现了对多台服务器的高效管理。本文将深入探讨Ansible Playbook的编写技巧,旨在帮助读者掌握这一强大的自动化工具,提升运维效率。

一、 Playbook 的结构

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

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

二、 Ansible Playbook 示例

下面的示例展示了一个简单的 Playbook,演示了基本的任务执行流程和 Ansible 模块使用。

- name: install httpdgather_facts: falsehosts: webserversremote_user: roottasks:- name: test connectionping:- name: disable selinuxcommand: '/sbin/setenforce 0'ignore_errors: True- name: disable firewalldservice: name=firewalld state=stopped- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.confnotify: "restart httpd"- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted

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

三、 命令行运行 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'  # 从指定任务开始执行

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

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

在这里插入图片描述

四、 变量和引用

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

- name: second playhosts: dbserversremote_user: rootvars:groupname: mysqlusername: nginxtasks:- name: create groupgroup: name={{ groupname }} system=yes gid=306- name: create useruser: name={{ username }} uid=306 group={{ groupname }}- name: copy filecopy: content="{{ ansible_default_ipv4 }}" dest=/opt/vars.txt

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

ansible-playbook test1.yaml -e "username=nginx"

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

五、 条件判断 when

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

  • 根据主机的 IP 地址来执行任务:
- name: shutdown host command: /sbin/shutdown -r now  when: ansible_default_ipv4.address == "192.168.10.14"

在这里插入图片描述

  • 或根据主机名来执行:
when: inventory_hostname == "<主机名>"

六、 迭代:使用 with_itemsloop

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

- name: play1hosts: dbserversgather_facts: falsetasks: - name: create directoriesfile:path: "{{item}}"state: directorywith_items:          - /tmp/test1- /tmp/test2		- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root

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

- name: loophosts: dbserversgather_facts: falsetasks:- name: create dirfile:path: "{{item}}"state: touchloop:- /opt/t1.txt- /opt/t2.txt- /opt/t3.txt

在这里插入图片描述

七、 Templates 模块

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

  1. 创建 Jinja 模板文件 (.j2)
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}}
ServerName {{server_name}}
DocumentRoot "{{root_dir}}"
  1. 定义变量并在主机清单中指定
[webservers]
192.168.10.40 http_port=80 server_name=www.accp.com root_dir=/etc/httpd/conf
  1. Playbook 示例
- hosts: allremote_user: rootvars:package: httpdservice: httpdtasks:- name: install httpd packageyum: name={{ package }} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dirfile: path=/etc/httpd/htdocs state=directory- name: start httpd serverservice: name={{ service }} enabled=true state=startedhandlers:- name: restart httpdservice: name={{ service }} state=restarted

在这里插入图片描述

八、 Tags 模块

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

- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touchtags:- always

在这里插入图片描述
执行时指定 --tags 参数:

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

九、 Roles 模块

9.1 Roles 概念

Roles 是将复杂的 Playbook 组织成独立的、更小的剧本和文件,提供了一种从外部文件加载任务、处理程序和变量的方法。Roles 可以编写成满足普通用途需求,并且能被重复利用。

9.2 roles 内各目录含义解释

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

9.3 在一个 playbook 中使用 roles 的步骤

  1. 创建以 roles 命名的目录。
  2. 创建全局变量目录(可选)。
  3. 在 roles 目录中分别创建以各角色名称命令的目录。
  4. 在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录。
  5. 在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件。
  6. 修改 site.yml 文件,针对不同主机去调用不同的角色。
  7. 运行 ansible-playbook。

9.4 案列

9.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} -ptouch /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

在这里插入图片描述

9.4.2 编写httpd模块
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd
9.4.3 编写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
9.4.4 编写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
9.4.5 编写roles
vim /etc/ansible/site.yml
---
- hosts: webserversremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml

在这里插入图片描述

结语

  通过对Ansible Playbook编写技巧的全面介绍,我们可以看到,Ansible不仅能够简化复杂的运维任务,还能通过模块化的设计,提高脚本的复用性和可维护性。从基础的结构和示例,到变量、条件判断、迭代、模板、标签和角色等高级功能,Ansible Playbook提供了一套完整的解决方案,以满足各种自动化需求。希望本文的介绍能够帮助读者更好地理解和应用Ansible,从而在自动化运维的道路上走得更远。

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

相关文章:

  • 光影绘新疆:解锁城市旅游宣传片拍摄全攻略
  • 龙华网站建设专业定制企业静态网页设计制作心得
  • MotionSight论文阅读
  • 大模型为什么RoPE能提升长序列表现?
  • TypeScript类型兼容性
  • 软件介绍下载网站建设广安门外网站建设
  • SpringBoot 统一功能处理:拦截器、统一返回与异常处理
  • MySQL 8.0 核心转储优化指南
  • MySQL 学习笔记 (Part.2)
  • 什么是数据治理?有哪些好用的数据治理平台?
  • 【Dubbo】Rpc与HTTP的区别、Dubbo调用过程
  • 网站需要怎么做的吗wordpress nova
  • php 做的应用网站wordpress 模板之家
  • PDFParser 的pickle.loads 寻找链(源码)wmctf2025-pdf2text
  • 如何在业务端进行正确的 reCAPTCHA 验证时序设计
  • 小九源码-springboot048-基于spring boot心理健康服务系统
  • 网站建设收费标准网络营销技术
  • 信息安全基础知识:04网络安全体系
  • 高古楼网站 做窗子pc 手机站网站制作
  • 郑州企业网站快速优化多少钱搜索词和关键词
  • 视频内容审核API选型指南:10大主流接口功能对比
  • shell 编程(1)——vim安装与使用
  • 【后端】.NET Core API框架搭建(11) --对象映射
  • Django+FastAPI+Vue微服务架构指南
  • 今日策略:年化436%,回撤7%,夏普比5.28, deap因子挖掘重构,附python代码
  • 【openrouter.ai】截止2025年9月底 openrouter可用模型清单列表(包含free免费的模型)
  • (13)ASP.NET Core2.2 中的选项模式(Options)
  • 做公司网站需要准备什么苏州网站建设企业
  • giflib5.2.2 在Qt与VS C++中实现Gif缩放示例
  • 题解:AT_abc401_c [ABC401C] K-bonacci