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

相关推荐
饥饿的半导体4 分钟前
Linux快速入门
linux·运维
BD_Marathon14 分钟前
Ubuntu:Tomcat里面的catalina.sh
linux·ubuntu·tomcat
BD_Marathon14 分钟前
设置LInux环境变量的方法和区别_Ubuntu/Centos
linux·ubuntu·centos
Me4神秘18 分钟前
Linux国产与国外进度对垒
linux·服务器·安全
zhaowangji34 分钟前
ubuntu 20.04 安装中文输入法 (sougou pin yin)
linux·ubuntu
两斤半1 小时前
Debian TTY环境乱码
linux·debian
搞笑的秀儿2 小时前
信息新技术
大数据·人工智能·物联网·云计算·区块链
还是奇怪2 小时前
Linux - 安全排查 2
linux·运维·安全
牛奶咖啡133 小时前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
weixin_437398213 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang