Ansible Playbook 编写与运行

Ansible Playbook 编写与运行

一、实验环境准备

1. 目录创建

Bash 复制代码
mkdir web && cd web

2. 配置文件编写(ansible.cfg)

Bash 复制代码
vim ansible.cfg

文件内容:

TOML 复制代码
[defaults]
remote_user = laogao
inventory = ./inventory

[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False

3. 清单文件编写(inventory)

Bash 复制代码
vim inventory

文件内容(列出受管节点):

Plain 复制代码
controller
node1
node2
node3
node4

二、Playbook 核心概念

1. 定义与优势

  • ad hoc 命令:适用于一次性简单任务,无法复用
  • Playbook :YAML 格式文本文件,包含一个或多个按序执行的 play
  • 核心价值:将复杂手动操作转化为可重复、可预测的自动化流程,支持多任务串联

2. 基本结构

  • Play :针对指定主机执行的任务集合,包含 name(描述)、hosts(目标主机)、tasks(任务列表)等属性
  • Task :单个执行单元,包含 name(描述)、模块名及模块参数

三、YAML 语法规范

1. 基础规则

  • 缩进:仅使用空格,同级元素缩进一致,子元素比父元素多缩进
  • 分隔符:键值对用 : 分隔,: 后必须加空格
  • 起始与结束:第一行需写 --,最后一行 ... 可省略
  • 可读性:允许添加空白行分隔内容

2. 常用数据类型

(1)字符串
  • 单行字符串:可省略引号,含空格时也可直接书写(如 this is a string

  • 引号包裹:支持单引号 'string' 或双引号 "string"

  • 多行字符串:

    • 竖线 |:保留换行符

      YAML 复制代码
      debug:
        msg: |
          Example Company
          123 Main Street
    • 大于号 >:换行符转为空格,删除行首空白

      YAML 复制代码
      debug:
        msg: >
          This is an example
          of a long string
(2)字典(映射/哈希)
  • 缩进格式(推荐):

    YAML 复制代码
    user:
      name: laogao
      uid: 1088
      state: absent
  • 内联格式(不推荐,可读性差):

    YAML 复制代码
    user: {name: laogao, uid: 1088, state: absent}
(3)列表(序列/数组)
  • 缩进格式(推荐):

    YAML 复制代码
    yum:
      name:
        httpd
        firewalld
  • 内联格式(不推荐):

    YAML 复制代码
    yum:
      name: [httpd, firewalld]

3. 注释

  • # 标识,# 右侧为注释内容

  • 若左侧有内容,# 前需加空格

    YAML 复制代码
    # 单行注释
    Some data # 行尾注释

四、Vim 编辑器配置(优化 YAML 编辑体验)

1. 编辑配置文件

Bash 复制代码
vim ~/.vimrc

2. 添加配置(二选一)

  • 全局生效:

    Plain 复制代码
    set ai ts=2
  • 仅 YAML 文件生效:

    Plain 复制代码
    autocmd FileType yaml set ai ts=2

3. 配置说明

  • ai(autoindent):自动缩进
  • ts=2(tabstop):Tab 键转为 2 个空格

五、Playbook 编写示例(内网 Web 服务部署)

1. 编写 Playbook 文件

Bash 复制代码
vim playbook.yaml

2. 文件内容

YAML 复制代码
--
# 第一个 Play:部署内网 Web 服务
- name: Enable intranet services
  hosts: node1
  tasks:
    # 任务1:安装最新版 httpd 和 firewalld
    - name: latest version of httpd and firewalld installed
      yum:
        name:
          httpd
          firewalld
        state: latest

    # 任务2:创建测试 HTML 页面
    - name: test html page is installed
      copy:
        content: "Welcome laogao WebSite!\n"
        dest: /var/www/html/index.html

    # 任务3:启用并启动 firewalld 服务
    - name: firewalld enabled and running
      service:
        name: firewalld
        enabled: true
        state: started

    # 任务4:防火墙放行 HTTP 服务
    - name: firewalld permits access to httpd service
      firewalld:
        service: http
        permanent: true
        state: enabled
        immediate: yes

    # 任务5:启用并启动 httpd 服务
    - name: httpd enabled and running
      service:
        name: httpd
        enabled: true
        state: started

# 第二个 Play:测试 Web 服务可用性
- name: Test intranet web server
  hosts: localhost
  become: no
  tasks:
    - name: connect to intranet web server
      uri:
        url: http://node1
        return_content: yes
        status_code: 200

六、Playbook 运行与调试

1. 基本运行命令

Bash 复制代码
ansible-playbook playbook.yaml
  • 第二次执行时,任务状态全为绿色(幂等性:重复执行无副作用)

2. 语法检查(不执行任务)

Bash 复制代码
ansible-playbook playbook.yaml --syntax-check

3. 空运行(模拟执行,不实际操作)

Bash 复制代码
ansible-playbook playbook.yaml -C

4. 提高输出详细程度

Bash 复制代码
# 显示任务结果(常用)
ansible-playbook playbook.yaml -v

# 显示任务结果和配置
ansible-playbook playbook.yaml -vv

# 包含主机连接信息
ansible-playbook playbook.yaml -vvv

# 显示连接插件详情及执行脚本
ansible-playbook playbook.yaml -vvvv

七、特权升级配置(Playbook 内指定)

可在 Play 中覆盖 ansible.cfg 的提权设置:

YAML 复制代码
- name: Enable intranet services
  hosts: node1
  remote_user: laogao  # SSH 连接用户
  become: true         # 启用特权升级
  become_method: sudo  # 提权方式
  become_user: root    # 目标提权用户
  tasks:
    # 任务内容...

八、Ad Hoc 命令与 Playbook 转换示例

1. Ad Hoc 命令(创建用户)

Bash 复制代码
ansible -m user -a "name=newbie uid=4000 state=present" node1

2. 转换为 Playbook(newuser.yaml)

Bash 复制代码
vim newuser.yaml

文件内容:

YAML 复制代码
--
- name: Configure important user consistently
  hosts: node1
  tasks:
    - name: newbie exists with UID 4000
      user:
        name: newbie
        uid: 4000
        state: present

3. 运行 Playbook

Bash 复制代码
ansible-playbook newuser.yaml
相关推荐
Q741_1472 小时前
Linux UDP 服务端 实战思路 C++ 套接字 源码包含客户端与服务端 游戏服务端开发基础
linux·服务器·c++·游戏·udp
北方的流星2 小时前
华为路由协议重定向配置
运维·网络·华为
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商OCR的多语种识别能力可以应用于哪些场景?
服务器·华为云·ocr
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商HiLens的技术优势体现在哪些方面?
服务器·数据库·华为云
同聘云2 小时前
阿里云国际站云服务器是虚拟技术吗?云服务器和虚拟技术的关系是什么?
服务器·安全·阿里云·云计算
SMF19192 小时前
【FTP服务器】Linux(Centos)系统搭建FTP服务器(可根据账号独立配置每个账号的ftp地址)
linux·服务器·centos
CodeByV2 小时前
【网络】TCP 协议深度解析:从连接建立到可靠性机制
网络·网络协议·tcp/ip
熙丫 133814823862 小时前
CISAW-SS安全软件认证|2026年培训日程公布,赋能安全开发,从代码源头筑牢防线
网络·安全·web安全
希赛网2 小时前
网络工程师学习:OSPF手动汇总配置实验ensp
网络·智能路由器·网络工程师·hcie·hcia·hcip·华为认证备考