侧边栏壁纸
  • 累计撰写 73 篇文章
  • 累计创建 23 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【Ansible】Ansible Playbook(一)

Administrator
2025-06-26 / 0 评论 / 0 点赞 / 16 阅读 / 5558 字 / 正在检测是否收录...

Ansible PlayBookAnsible的核心组件之一,用于定义自动化任务。采用YAML格式编写,允许以声明式的方式描述服务器配置、应用部署、服务管理等操作。

PlayBook即剧本,类似于电影的剧本。一部电影由很多很多个不同的场景组成,类似于第一场戏、第二场戏。一场戏中有很多很多的组成:演员、背景、道具、特效、台词等等,而这一切最终都会由剧本编排,组成最终我们看到的电影。

PlayBook也是同样的原理,可以将一个一个不同的任务进行编排,最终完成我们想要的效果。

一、Ansible Playbook 的基本结构

一个基本的PlayBook由以下内容组成:

  • 目标主机(hosts):定义在哪些机器上执行任务

  • 变量(vars):可选的变量

  • 任务(tasks):具体要执行的操作(调用模块)

  • handlers:由任务触发的事件(若执行任务后状态发生改变,则执行handlers中定义的任务)

PlayBook示例:

- name: Install and start Nginx  # Play 的名称
  hosts: web_servers             # 目标主机组(在 inventory 中定义)
  tasks:
    - name: Install Nginx        # 任务1:安装 Nginx
      yum:
        name: nginx
        state: present
    - name: Start Nginx service  # 任务2:启动服务
      systemd:
        name: nginx
        state: started
        enabled: yes

对应的ad-hoc

ansible web_servers -m yum -a "name=nginx state=present"
ansible web_servers -m systemd -a "name=nginx state=started enabled=yes"

为什么每个任务要写一个name

  • 我们可以通过指定name的方式控制整个PlayBook从哪里开始运行或只运行某个任务。

1. YAML 基础语法

  • 缩进:必须使用空格(不能使用 Tab),通常2个空格缩进(可以不是2个,但需要统一)

  • 键值对:key: value(冒号后必须有空格)

  • 列表:-开头,表示多个项。类似于Python中的list

  • 注释:#开头

  • 文件的后缀:*.yaml*.yml

---
# 这是一个注释
- name: Play 1       # 这是一个 Play(列表项)
  hosts: web_servers # Play 的字典成员(键值对)
  become: yes        # Play 的字典成员
  tasks:             # Play 的字典成员(值是一个列表)
    - name: Task1    # tasks 列表的子项

新版本的 ansible 模块分了很多个类别,所以新版的 ansible playbook 写模块的时候,写的很细。我们依旧可以使用旧版本的语法去写,也就是只写模块的名称。

2. 执行 PlayBook

ansible-playbook test.yaml
ansible-playbook -C test.yaml # -C=--check 检查语法,并不真正执行

二、实操案例

编写一个 NFS 剧本

  • NFS服务端PlayBook

- name: nfs
  hosts: nfs_servers  # 在inventory文件中定义的主机组
  become: yes         # 使用root权限

  tasks:
    # 安装必要的软件包
    - name: 安装NFS服务端软件
      yum:
        name: nfs-utils
        state: present

    # 创建共享目录
    - name: 创建共享目录
      file:
        path: /data/share
        state: directory
        mode: '0777'

    # 配置NFS导出
    - name: 配置NFS导出
      lineinfile:
        path: /etc/exports
        line: "/data/share 192.168.100.0/24(rw,sync,no_root_squash)"
        state: present

    # 启动NFS服务
    - name: 启动NFS服务
      service:
        name: nfs-server
        state: started
        enabled: yes
  • NFS客户端PlayBook

- name: 配置NFS客户端
  hosts: nfs_clients  # 在inventory文件中定义的主机组
  become: yes         # 使用root权限

  tasks:
    # 安装NFS客户端软件
    - name: 安装NFS客户端软件
      yum:
        name: nfs-utils
        state: present

    # 创建挂载点目录
    - name: 创建挂载点目录
      file:
        path: /mnt/nfs_share
        state: directory
        mode: '0777'

    # 挂载NFS共享
    - name: 挂载NFS共享
      mount:
        path: /mnt/nfs_share
        src: "192.168.100.100:/data/share"  # 替换为实际的NFS服务器IP
        fstype: nfs
        opts: "rw,sync"
        state: mounted

    # 确保开机自动挂载
    - name: 添加到fstab实现开机自动挂载
      lineinfile:
        path: /etc/fstab
        line: "192.168.100.100:/data/share /mnt/nfs_share nfs rw,sync 0 0"
        state: present
PlayBook 的简便写法
-name: 06-start
  systemd: name=fs state=started enabled=true

三、运行检查规范

  1. 检查剧本拼写规范

ansible-playbook your_playbook.yaml --syntax-check
  1. 检查这个任务执行的主机对象

ansible-playbook your_playbook.yaml --list-hosts
  1. 检查这个剧本需要执行哪些任务

ansible-playbook your_playbook.yaml --list-tasks
ansible-playbook your_playbook.yaml --list-tags
  1. 模拟执行剧本

ansible-playbook your_playbook.yaml --check(-C)
  1. 真正执行剧本

ansible-playbook your_playbook.yaml

0
博主关闭了所有页面的评论