Ansible YAML 基础语法与关键词 的详细指南

news2025/4/9 19:17:55

以下是 Ansible YAML 基础语法与关键词 的详细指南,帮助你快速掌握 Playbook 编写规范和核心概念:


目录

  • 一、Ansible Playbook 基础结构
    • 1. YAML 文件基础
  • 二、核心关键词
    • 1. Play 定义
    • 2. Task 定义
    • 3. Handler 定义
    • 4. 变量(Variables)
    • 5. 条件判断(Conditionals)
    • 6. 循环(Loops)
  • 三、常用模块
    • 1. 文件操作
    • 2. 软件包管理
    • 3. 服务管理
    • 4. 模板渲染
  • 四、高级语法
    • 1. Blocks(错误处理)
    • 2. Tags(选择性执行)
  • 五、完整 Playbook 示例
  • 六、运行 Playbook
  • 七、常见错误与调试
    • 1. 缩进错误
    • 2. 模块参数错误
    • 3. 调试模式


一、Ansible Playbook 基础结构

1. YAML 文件基础

---
# 最顶层的 --- 表示 YAML 文档开始
- name: Example Playbook     # Play 名称
  hosts: all                 # 目标主机(inventory 中定义)
  become: yes                # 是否提升权限(sudo)
  tasks:                     # 任务列表
    - name: Task 1           # 任务名称
      debug:                 # 模块名称
        msg: "Hello World"   # 模块参数

二、核心关键词

1. Play 定义

- name: Play Name
  hosts: web_servers        # 目标主机组(inventory 中定义)
  gather_facts: false       # 是否收集系统信息(如内核版本)
  vars:                     # Play 级变量
    app_port: 8080

2. Task 定义

tasks:
  - name: Install Nginx
    apt:                    # 模块名称
      name: nginx           # 参数:包名
      state: latest         # 参数:状态(latest/present/absent)
    notify:                 # 触发 Handler
      - restart nginx

  - name: Copy Config File
    copy:                   # 模块名称
      src: /local/path/nginx.conf  # 源文件
      dest: /etc/nginx/nginx.conf  # 目标路径

3. Handler 定义

handlers:
  - name: restart nginx     # Handler 名称
    service:                # 模块名称
      name: nginx
      state: reloaded

4. 变量(Variables)

- name: Use Variables
  hosts: all
  vars:
    user: alice             # Play 级变量
  tasks:
    - name: Create User
      user:
        name: "{{ user }}"  # 使用变量
        state: present

5. 条件判断(Conditionals)

- name: Check OS
  hosts: all
  tasks:
    - name: Install Apache on CentOS
      yum:
        name: httpd
        state: latest
      when: ansible_os_family == "CentOS"  # 条件判断

6. 循环(Loops)

- name: Install Packages
  hosts: all
  tasks:
    - name: Add multiple packages
      apt:
        name: "{{ item }}"
        state: present
      loop:                   # 循环列表
        - vim
        - git
        - curl

三、常用模块

1. 文件操作

- name: Ensure directory exists
  file:
    path: /tmp/mydir
    state: directory
    mode: '0755'

2. 软件包管理

- name: Install package (Debian/Ubuntu)
  apt:
    name: nginx
    state: latest

- name: Install package (RedHat/CentOS)
  yum:
    name: httpd
    state: latest

3. 服务管理

- name: Start service
  service:
    name: nginx
    state: started
    enabled: yes  # 开机自启

4. 模板渲染

- name: Generate config file
  template:
    src: nginx.conf.j2       # Jinja2 模板文件
    dest: /etc/nginx/nginx.conf

四、高级语法

1. Blocks(错误处理)

- name: Handle errors
  block:                     # 块内任务统一处理错误
    - name: Task that might fail
      command: /bin/false

  rescue:                    # 失败时执行
    - name: Rollback
      debug:
        msg: "Task failed!"

  always:                    # 无论成功/失败都执行
    - name: Cleanup
      debug:
        msg: "Cleanup done"

2. Tags(选择性执行)

- name: Tagged Tasks
  hosts: all
  tasks:
    - name: Task with tag
      debug:
        msg: "Only run with --tags debug"
      tags: debug

ansible-playbook playbook.yml --tags debug  # 仅执行带 debug 标签的任务

五、完整 Playbook 示例

---
- name: Deploy Web Application
  hosts: webservers
  become: yes
  vars:
    app_port: 8080
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

    - name: Install dependencies
      apt:
        name:
          - git
          - python3
        state: latest

    - name: Clone repository
      git:
        repo: https://github.com/example/repo.git
        dest: /var/www/app

    - name: Start application
      command: nohup python3 app.py --port {{ app_port }} &

六、运行 Playbook

ansible-playbook -i inventory.ini playbook.yml

-i inventory.ini:指定主机清单文件。
--limit:限制执行的主机范围(如 --limit web_servers)。
--check:模拟执行(dry-run)。
--tags:仅执行带特定标签的任务。


七、常见错误与调试

1. 缩进错误

• 错误提示:syntax error: unexpected end of file
• 解决:确保 YAML 缩进使用 2 空格(不可用 Tab)。

2. 模块参数错误

• 错误提示:missing required arguments: name
• 解决:检查模块参数是否完整(参考官方文档)。

3. 调试模式

ansible-playbook playbook.yml -vvv  # 增加详细输出(最多 3 个 v)

通过掌握这些基础语法和关键词,你可以快速编写 Ansible Playbook 实现自动化运维! 🚀
官方文档参考:Ansible Documentation


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)

贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当,难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法? 贪⼼算法,或者说是贪⼼策略:企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步;解决每⼀步时…

瑞萨RA4M2使用心得-KEIL5的第一次编译

目录 前言 环境: 开发板:RA-Eco-RA4M2-100PIN-V1.0 IDE:keil5.35 一、软件的下载 编辑瑞萨的芯片,除了keil5 外还需要一个软件:RASC 路径:Releases renesas/fsp (github.com) 向下找到: …

数据分析-Excel-学习笔记

Day1 复现报表聚合函数:日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格,首先要看这个表格个构成(包含了哪些数据),几行几列,每一列的名称…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

ChatGPT 的新图像生成器非常擅长伪造收据

本月,ChatGPT 推出了一种新的图像生成器,作为其 4o 模型的一部分,该模型在生成图像内的文本方面做得更好。 人们已经在利用它来生成假的餐厅收据,这可能会为欺诈者使用的已经很广泛的 AI 深度伪造工具包添加另一种工具。 多产的…

JS页面尺寸事件

元素位置 在这里插入图片描述 父元素带有定位时输出相对于父亲元素的距离值

网络协议之基础介绍

写在前面 本文看下网络协议相关基础内容。 1:为什么要有网络协议 为了实现世界各地的不同主机的互联互通。 2:协议的三要素 协议存在的目的就是立规矩,无规矩不成方圆嘛!但是这个规矩也不是想怎么立就怎么立的,也…

初识数据结构——Java集合框架解析:List与ArrayList的完美结合

📚 Java集合框架解析:List与ArrayList的完美结合 🌟 前言:为什么我们需要List和ArrayList? 在日常开发中,我们经常需要处理一组数据。想象一下,如果你要管理一个班级的学生名单,或…

uniapp微信小程序引入vant组件库

1、首先要有uniapp项目,根据vant官方文档使用yarn或npm安装依赖: 1、 yarn init 或 npm init2、 # 通过 npm 安装npm i vant/weapp -S --production# 通过 yarn 安装yarn add vant/weapp --production# 安装 0.x 版本npm i vant-weapp -S --production …

贪心进阶学习笔记

反悔贪心 贪心是指直接选择局部最优解,不需要考虑之后的影响。 而反悔贪心是在贪心上面加了一个“反悔”的操作,于是又可以撤销之前的“鲁莽行动”,让整个的选择稍微变得“理智一些”。 于是,我个人理解,反悔贪心是…

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

架构师面试(二十七):单链表

问题 今天的问题对于架构师来说会相对容易许多。今天出一个【数据结构与算法】相关的题目,醒醒脑。 给一张【单链表】,该单链表有100个节点元素(当然,事先我们是不知道100这个数目的),要获取倒数第8个元素…

从扩展黎曼泽塔函数构造物质和时空的结构-15

回来考虑泽塔函数, 我们知道, 也就是在平面直角坐标系上反正切函数在x上的变化率,那么不难看出, 就是在s维空间上的“广义”反正切函数在单位p上的变化率,而泽塔函数,就是这些变化率的全乘积, 因…

01背包问题详解 具体样例模拟版

01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 v i v_i vi​,价值是 w i w_i wi​。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 …

网络初识 - Java

网络发展史: 单机时代(独立模式) -> 局域网时代 -> 广域网时代 -> 移动互联网时代 网络互联:将多台计算机链接再一起,完成数据共享。 数据共享的本质是网络数据传输,即计算机之间通过网络来传输数…

每日一题(小白)回溯篇4

深度优先搜索题:找到最长的路径,计算这样的路径有多少条(使用回溯) 分析题意可以得知,每次向前后左右走一步,直至走完16步就算一条走通路径。要求条件是不能超出4*4的范围,不能重复之前的路径。…

k8s进阶之路:本地集群环境搭建

概述 文章将带领大家搭建一个 master 节点,两个 node 节点的 k8s 集群,容器基于 docker,k8s 版本 v1.32。 一、系统安装 安装之前请大家使用虚拟机将 ubuntu24.04 系统安装完毕,我是基于 mac m1 的系统进行安装的,所…

C++ STL 详解 ——list 的深度解析与实践指南

在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…

按键切换LCD显示后,显示总在第二阶段,而不在第一阶段的问题

这是一个密码锁的程序,当在输入密码后,原本是要重置密码,但是程序总是在输入密码正确后总是跳转置设置第二个密码,而第一个密码总是跳过。 不断修改后, 解决方法 将if语句换成switch语句,这样就可以分离程序…

护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…