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] 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部