Ansible Playbook剧本用法

复制代码
Ansible Playbook剧本
使用Playbook剧本的目的
将需要经常执行的任务写入一个文件(剧本),适用于周期性执行的复杂任务
剧本中可以包含多个任务并可以重复使用
Playbook剧本要求按照YAML格式编写
YAML是什么
YAML(YAML Ain't Markup Language)

是一种人类可读性高且面向数据序列化的格式
是一种格式而不是语言
具备易读性、简洁和可扩展性,对人类友好,支持跨语言操作
常用于配置文件、数据传输等场景
YAML语法格式

文件以 .yaml 或 .yml 扩展名为常见
文件一般以---作为第一行,不是必须的,但是常用
键值对使用冒号:表示,冒号后面必须有空格
数组使用-表示,-后面必须有空格
相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格
全文不能使用tab,必须使用空格
YAML格式数据样例

## 键值对样例
- "诗仙": "李白"
或
- "诗仙":
     "李白"   
    
## 数组样例
- "诗人": ["李白", "杜甫"]
或
- "诗人":
    - "李白"
    - "杜甫"

## 综合样例
- "诗人":
    - "唐代":
        - "李白"
        - "杜甫"
    - "宋代":
        - "苏轼"
        - "李清照"
配置VIM编辑器
## 编辑vimrc文件,配置yml编写约束
[root@pubserver ansible]# vim ~/.vimrc
set nu ai et paste ts=4
autocmd FileType yaml setlocal ai et ts=2 sw=2
set cursorline
set cursorcolumn
Playbook剧本样例
一个剧本(Playbook)可以包含多个剧(Play)
每个剧(Play)用于在指定的主机或组上执行一个或多个任务(Task)
每个任务(Task)由模块和参数组成
## 剧本样例
---
- 名字: 三兄弟初遇
  人物: 刘备,关羽,张飞
  场景:
    - 场景一: 刘备卖草鞋
    
    - 场景二: 关羽卖绿豆
    
    - 场景三: 张飞卖肉
    
    - 场景四: 三人相遇
    
- 名字: 三英战吕布
  人物: 刘备,关羽,张飞,吕布,曹操,袁绍
    - 场景一: 吕布叫阵
    
    - 场景二: 张飞大战吕布
    
    - 场景三: 关张大战吕布
    
    - 场景四: 刘关张三英战吕布
    
- 名字: 三顾茅庐
  人物: 刘备,关羽,张飞,诸葛亮,书童
    - 场景一: 一请诸葛亮
    
    - 场景二: 二请诸葛亮
    
    - 场景三: 三请诸葛亮
Playbook基础语法
ping模块
## 编写Playbook使用ping模块测试网络连通

[root@pubserver ansible]# vim test_ping.yml
---
- name: test network        #剧本名称(可选项)
  hosts: all                #作用主机(组)
  tasks:                    #任务
    - name: test via ping   #任务1(名称可选,可以写中文)
      ping:                 #使用的模块
      
[root@pubserver ansible]# ansible-playbook --syntax-check test_ping.yml #检查文件语法

playbook: test_ping.yml
[root@pubserver ansible]# ansible-playbook test_ping.yml                #执行剧本
file模块
## 编写剧本完成以下目标
# 在dbs组的主机和web1上创建/tmp/demo目录,权限是0755
# 将控制端/etc/hosts拷贝到目标主机的/tmp/demo中

[root@pubserver ansible]# vim fileop.yml
---
- name: create dir and copy file
  hosts: dbs,web1
  tasks:
    - name: create dir
      file:
        path: /tmp/demo/
        state: directory
        mode: '0755'
    - name: copy file
      copy:
        src: /etc/hosts
        dest: /tmp/demo/hosts
[root@pubserver ansible]# ansible-playbook --syntax-check fileop.yml 

playbook: fileop.yml
[root@pubserver ansible]# ansible-playbook fileop.yml 
copy模块
## |和>的区别:|保留换行符;>不保留换行符

# 一剧本一剧多任务样例
[root@pubserver ansible]# vim copy_con.yml
---
- name: test | and >
  hosts: webservers
  tasks:
    - name: test |
      copy:
        dest: /tmp/f1.txt
        content: |
          Hello World!
          Hello Linux!
    - name: test >
      copy:
        dest: /tmp/f2.txt
        content: >
          Hello Ansbile!
          Hello Playbook!
[root@pubserver ansible]# ansible-playbook --syntax-check copy_con.yml 

playbook: copy_con.yml
[root@pubserver ansible]# ansible-playbook copy_con.yml 

# 检查|效果,目标主机文件内为2行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f1.txt"
web1 | CHANGED | rc=0 >>
Hello World!
Hello Linux!
web2 | CHANGED | rc=0 >>
Hello World!
Hello Linux!

# 检查>效果,目标主机文件内为1行
[root@pubserver ansible]# ansible webservers -a "cat /tmp/f2.txt"
web2 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
web1 | CHANGED | rc=0 >>
Hello Ansbile! Hello Playbook!
user模块
## 编写剧本完成以下目标
# 在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123
# 在webservers组中的主机上删除tom用户

# 一剧本多剧一任务样例
[root@pubserver ansible]# vim man_user.yml
---
- name: create user
  hosts: webservers
  tasks:
    - name: add user
      user:
        name: john
        uid: 1040
        group: daemon
        password: "{{'123'|password_hash('sha512')}}"
        state: present

- name: delete user
  hosts: webservers
  tasks:
    - name: del user
      user:
        name: tom
        state: absent
        remove: true
[root@pubserver ansible]# ansible-playbook --syntax-check man_user.yml
[root@pubserver ansible]# ansible-playbook man_user.yml

[root@pubserver ansible]# ansible webservers -a "id john"   #黄色结果,命令执行成功
[root@pubserver ansible]# ansible webservers -a "id tom"    #红色结果,命令执行失败
磁盘管理综合应用
## 编写剧本完成以下目标
# 在web1主机的/dev/vdc磁盘上创建2个分区,分区1为1G,分区2为5G
# 在web1主机创建名为my_vg的卷组,由vdc1和vdc2组成
# 在web1主机的my_vg卷组上创建名为my_lv大小为2G的逻辑卷
# 将web1主机的my_lv逻辑卷格式化成ext4文件系统
# 将web1主机的my_lv逻辑卷永久挂载到/data目录


# 一剧本一剧多任务
[root@pubserver ansible]# vim disk.yml
---
- name: manage disk
  hosts: web1
  tasks:
    - name: create partition 1
      parted:
        device: /dev/vdc
        label: gpt
        number: 1
        part_end: 1GiB
        state: present

    - name: create partition 2
      parted:
        device: /dev/vdc
        label: gpt
        number: 2
        part_start: 1GiB
        part_end: 6GiB
        state: present

    - name: create vg   #创建卷组,名字为my_vg,卷组由/dev/vdc1和/dev/vdc2组成
      lvg:
        vg: my_vg
        pvs:            #也可以写成pvs: /dev/vdc1,/dev/vdc2
          - /dev/vdc1
          - /dev/vdc2
        state: present

    - name: create lv   #创建逻辑卷
      lvol:
        vg: my_vg
        lv: my_lv
        size: 2G
        state: present

    - name: format lv       #格式化逻辑卷my_lv
      filesystem:
        dev: /dev/my_vg/my_lv
        fstype: ext4

    - name: mount lv        #实现开机自动挂载
      mount:
        src: /dev/my_vg/my_lv
        path: /data
        fstype: ext4
        state: mounted
[root@pubserver ansible]# ansible-playbook --syntax-check disk.yml 

playbook: disk.yml
[root@pubserver ansible]# ansible-playbook disk.yml 
[root@pubserver ansible]# ansible web1 -a "lsblk;vgs;lvs;df -hT | grep data;tail -1 /etc/fstab"
yum模块
## 管理系统软件样例
# 在webservers组安装httpd/php/php-mysqlnd软件,安装Development Tools组,更新系统所有软件
[root@pubserver ansible]# yum group list    #获取包组名称
[root@pubserver ansible]# vim pkgs.yml 
---
- name: manage packages
  hosts: webservers
  tasks: 
    - name: install pkg
      yum:
        name: 
          - httpd
          - php
          - php-mysqlnd
        state: present

    - name: install group
      yum:
        name: "@Development Tools"  # @组名,开发工具
        state: present

    - name: update available pkg    #等效于执行yum update
      yum:
        name: '*'       #*指系统上面已安装的所有软件
        state: latest   #把系统上已经安装的软件包更新到最新版本
[root@pubserver ansible]# ansible-playbook --syntax-check pkgs.yml 

playbook: pkgs.yml
[root@pubserver ansible]# ansible-playbook pkgs.yml

## 补充说明多软件包写法
name: httpd,php,php-mysqlnd
name: [httpd,php,php-mysqlnd] 

Ansible Playbook剧本

使用Playbook剧本的目的

将需要经常执行的任务写入一个文件(剧本),适用于周期性执行的复杂任务

剧本中可以包含多个任务并可以重复使用

Playbook剧本要求按照YAML格式编写

YAML是什么

YAML(YAML Ain't Markup Language)

是一种人类可读性高且面向数据序列化的格式

是一种格式而不是语言

具备易读性、简洁和可扩展性,对人类友好,支持跨语言操作

常用于配置文件、数据传输等场景

YAML语法格式

文件以 .yaml 或 .yml 扩展名为常见

文件一般以---作为第一行,不是必须的,但是常用

键值对使用冒号:表示,冒号后面必须有空格

数组使用-表示,-后面必须有空格

相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。每一级缩进,建议2个空格

全文不能使用tab,必须使用空格

YAML格式数据样例

键值对样例

  • "诗仙": "李白"

  • "诗仙":

"李白"

数组样例

  • "诗人": "李白", "杜甫"

  • "诗人":

  • "李白"

  • "杜甫"

综合样例

  • "诗人":

  • "唐代":

  • "李白"

  • "杜甫"

  • "宋代":

  • "苏轼"

  • "李清照"

配置VIM编辑器

编辑vimrc文件,配置yml编写约束

root@pubserver ansible# vim ~/.vimrc

set nu ai et paste ts=4

autocmd FileType yaml setlocal ai et ts=2 sw=2

set cursorline

set cursorcolumn

Playbook剧本样例

一个剧本(Playbook)可以包含多个剧(Play)

每个剧(Play)用于在指定的主机或组上执行一个或多个任务(Task)

每个任务(Task)由模块和参数组成

剧本样例


  • 名字: 三兄弟初遇

人物: 刘备,关羽,张飞

场景:

  • 场景一: 刘备卖草鞋

  • 场景二: 关羽卖绿豆

  • 场景三: 张飞卖肉

  • 场景四: 三人相遇

  • 名字: 三英战吕布

人物: 刘备,关羽,张飞,吕布,曹操,袁绍

  • 场景一: 吕布叫阵

  • 场景二: 张飞大战吕布

  • 场景三: 关张大战吕布

  • 场景四: 刘关张三英战吕布

  • 名字: 三顾茅庐

人物: 刘备,关羽,张飞,诸葛亮,书童

  • 场景一: 一请诸葛亮

  • 场景二: 二请诸葛亮

  • 场景三: 三请诸葛亮

Playbook基础语法

ping模块

编写Playbook使用ping模块测试网络连通

root@pubserver ansible# vim test_ping.yml


  • name: test network #剧本名称(可选项)

hosts: all #作用主机(组)

tasks: #任务

  • name: test via ping #任务1(名称可选,可以写中文)

ping: #使用的模块

root@pubserver ansible# ansible-playbook --syntax-check test_ping.yml #检查文件语法

playbook: test_ping.yml

root@pubserver ansible# ansible-playbook test_ping.yml #执行剧本

file模块

编写剧本完成以下目标

在dbs组的主机和web1上创建/tmp/demo目录,权限是0755

将控制端/etc/hosts拷贝到目标主机的/tmp/demo中

root@pubserver ansible# vim fileop.yml


  • name: create dir and copy file

hosts: dbs,web1

tasks:

  • name: create dir

file:

path: /tmp/demo/

state: directory

mode: '0755'

  • name: copy file

copy:

src: /etc/hosts

dest: /tmp/demo/hosts

root@pubserver ansible# ansible-playbook --syntax-check fileop.yml

playbook: fileop.yml

root@pubserver ansible# ansible-playbook fileop.yml

copy模块

|和>的区别:|保留换行符;>不保留换行符

一剧本一剧多任务样例

root@pubserver ansible# vim copy_con.yml


  • name: test | and >

hosts: webservers

tasks:

  • name: test |

copy:

dest: /tmp/f1.txt

content: |

Hello World!

Hello Linux!

  • name: test >

copy:

dest: /tmp/f2.txt

content: >

Hello Ansbile!

Hello Playbook!

root@pubserver ansible# ansible-playbook --syntax-check copy_con.yml

playbook: copy_con.yml

root@pubserver ansible# ansible-playbook copy_con.yml

检查|效果,目标主机文件内为2行

root@pubserver ansible# ansible webservers -a "cat /tmp/f1.txt"

web1 | CHANGED | rc=0 >>

Hello World!

Hello Linux!

web2 | CHANGED | rc=0 >>

Hello World!

Hello Linux!

检查>效果,目标主机文件内为1行

root@pubserver ansible# ansible webservers -a "cat /tmp/f2.txt"

web2 | CHANGED | rc=0 >>

Hello Ansbile! Hello Playbook!

web1 | CHANGED | rc=0 >>

Hello Ansbile! Hello Playbook!

user模块

编写剧本完成以下目标

在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123

在webservers组中的主机上删除tom用户

一剧本多剧一任务样例

root@pubserver ansible# vim man_user.yml


  • name: create user

hosts: webservers

tasks:

  • name: add user

user:

name: john

uid: 1040

group: daemon

password: "{{'123'|password_hash('sha512')}}"

state: present

  • name: delete user

hosts: webservers

tasks:

  • name: del user

user:

name: tom

state: absent

remove: true

root@pubserver ansible# ansible-playbook --syntax-check man_user.yml

root@pubserver ansible# ansible-playbook man_user.yml

root@pubserver ansible# ansible webservers -a "id john" #黄色结果,命令执行成功

root@pubserver ansible# ansible webservers -a "id tom" #红色结果,命令执行失败

磁盘管理综合应用

编写剧本完成以下目标

在web1主机的/dev/vdc磁盘上创建2个分区,分区1为1G,分区2为5G

在web1主机创建名为my_vg的卷组,由vdc1和vdc2组成

在web1主机的my_vg卷组上创建名为my_lv大小为2G的逻辑卷

将web1主机的my_lv逻辑卷格式化成ext4文件系统

将web1主机的my_lv逻辑卷永久挂载到/data目录

一剧本一剧多任务

root@pubserver ansible# vim disk.yml


  • name: manage disk

hosts: web1

tasks:

  • name: create partition 1

parted:

device: /dev/vdc

label: gpt

number: 1

part_end: 1GiB

state: present

  • name: create partition 2

parted:

device: /dev/vdc

label: gpt

number: 2

part_start: 1GiB

part_end: 6GiB

state: present

  • name: create vg #创建卷组,名字为my_vg,卷组由/dev/vdc1和/dev/vdc2组成

lvg:

vg: my_vg

pvs: #也可以写成pvs: /dev/vdc1,/dev/vdc2

  • /dev/vdc1

  • /dev/vdc2

state: present

  • name: create lv #创建逻辑卷

lvol:

vg: my_vg

lv: my_lv

size: 2G

state: present

  • name: format lv #格式化逻辑卷my_lv

filesystem:

dev: /dev/my_vg/my_lv

fstype: ext4

  • name: mount lv #实现开机自动挂载

mount:

src: /dev/my_vg/my_lv

path: /data

fstype: ext4

state: mounted

root@pubserver ansible# ansible-playbook --syntax-check disk.yml

playbook: disk.yml

root@pubserver ansible# ansible-playbook disk.yml

root@pubserver ansible# ansible web1 -a "lsblk;vgs;lvs;df -hT | grep data;tail -1 /etc/fstab"

yum模块

管理系统软件样例

在webservers组安装httpd/php/php-mysqlnd软件,安装Development Tools组,更新系统所有软件

root@pubserver ansible# yum group list #获取包组名称

root@pubserver ansible# vim pkgs.yml


  • name: manage packages

hosts: webservers

tasks:

  • name: install pkg

yum:

name:

  • httpd

  • php

  • php-mysqlnd

state: present

  • name: install group

yum:

name: "@Development Tools" # @组名,开发工具

state: present

  • name: update available pkg #等效于执行yum update

yum:

name: '*' #*指系统上面已安装的所有软件

state: latest #把系统上已经安装的软件包更新到最新版本

root@pubserver ansible# ansible-playbook --syntax-check pkgs.yml

playbook: pkgs.yml

root@pubserver ansible# ansible-playbook pkgs.yml

补充说明多软件包写法

name: httpd,php,php-mysqlnd

name: httpd,php,php-mysqlnd

相关推荐
wuminyu6 分钟前
Java锁膨胀机制之偏向锁到轻量级锁源码剖析
java·linux·c语言·jvm·c++
半部论语11 分钟前
openEuler 安装 LibreOffice 技术指南
linux
爱装代码的小瓶子16 分钟前
muduo库 --socket的封装
服务器·开发语言·php
凡人叶枫16 分钟前
Effective C++ 条款13:以对象管理资源(RAII)
java·linux·开发语言·c++·嵌入式开发
m0_7373025828 分钟前
OpenClaw:不止于对话,能真正动手的开源 AI 智能体
服务器
红信鸽30 分钟前
5G-A+边缘计算:低延迟应用爆发的真正推手
云计算
云飞云共享云桌面34 分钟前
东莞制造业研发降本方案:1 台云主机承载 10 人 SolidWorks,钣金操作秒响应
linux·运维·服务器·安全·电脑
hanbr41 分钟前
[特殊字符] Linux 学习笔记(二):压缩、Vim 与配置
linux·技术
修炼室42 分钟前
告别天天变动的随机端口!基于 Tailscale 子网路由(Subnet Router)外网原生直连学院服务器及安装踩坑指南
运维·服务器
赛博三把手43 分钟前
实操篇一:Claude Code + Token173 国内直连 Anthropic Fable 5 完整接入教程
linux·编辑器·vim