文章目录

  • 一、Ansible playbook介绍
  • 二、playbook格式
  • 2.1 基本格式
  • 2.2 核心元素
  • 2.3 基本组件
  • 2.4 role
  • 2.5 举例


一、Ansible playbook介绍

  playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。通过执行playbook中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ,而被控节点必须要完成。

二、playbook格式

2.1 基本格式

  playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,以下为playbook常用到的YMAL格式:

  • 文件的第一行应该以 “—” (三个连字符)开始,表明YMAL文件的开始;
  • 在同一行中,#之后的内容表示注释;
  • YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容;
  • 同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理;
  • 对象表示方法都是键值中间以":“分隔表示,”:"后面还要增加一个空格。

2.2 核心元素

  • Hosts:主机组;
  • Tasks:任务列表;
  • Variables:变量,设置方式有四种;
  • Templates:包含了模板语法的文本文件;
  • Handlers:由特定条件触发的任务;

2.3 基本组件

Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户;
tasks:任务列表

tasks:
      – name: TASK_NAME
       module: arguments
       notify: HANDLER_NAME
       tags:
    handlers:
      – name: HANDLER_NAME
       module: arguments
       
moudule格式:
    (1) action: module arguments
    (2) module: arguments

shell和command模块后面直接跟命令,而非key=value类的参数列表;

handlers:任务,在特定条件下触发;接收到其它任务的通知时被触发;
  (1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
  (2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

2.4 role

  对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。
  roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

角色集合:roles/
mysql/
keealived/
files/:存储由copy或script等模块调用的文件;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/:存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

2.5 举例

[root@zijie ansible]# cat rpm.yml
---
- hosts: test
  remote_user: root
  tasks:
    - name: install {{ rpmname }}
      yum: name={{ rpmname }} state=present
    - name: copy {{ rpmname }}.conf
      copy: src=/tmp/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yes
      notify: reload
      tags: reload {{ rpmname }}
    - name: start {{ rpmname }} service
      service: name={{ rpmname }} state=started
      tags: start {{ rpmname }}

  handlers:
    - name: reload
      service: name={{ rpmname }} state=restarted

[root@zijie ansible]# ansible-playbook rpm.yml -e rpmname=keepalived

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [124.70.209.222]

TASK [install keepalived] **********************************************************************************************************************************************************************************
changed: [124.70.209.222]

TASK [copy keepalived.conf] ********************************************************************************************************************************************************************************
ok: [124.70.209.222]

TASK [start keepalived service] ****************************************************************************************************************************************************************************
changed: [124.70.209.222]

PLAY RECAP *************************************************************************************************************************************************************************************************
124.70.209.222             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@zijie ansible]# ansible test -m shell -a 'systemctl stop keepalived'
124.70.209.222 | CHANGED | rc=0 >>

[root@zijie ansible]# ansible-playbook rpm.yml -e rpmname=keepalived -t startkeepalived

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [124.70.209.222]

TASK [start keepalived service] ****************************************************************************************************************************************************************************
changed: [124.70.209.222]

PLAY RECAP *************************************************************************************************************************************************************************************************
124.70.209.222             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# roles

[root@zijie ansible]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
├── roles
│   ├── keepalived
│   │   ├── default
│   │   ├── files
│   │   ├── handlers
│   │   ├── meta
│   │   ├── tasks
│   │   │   └── main.yml
│   │   ├── templates
│   │   │   └── keepalived.conf.j2
│   │   └── vars
│   └── mysql
│       ├── default
│       ├── files
│       ├── handlers
│       ├── meta
│       ├── tasks
│       ├── templates
│       └── vars
├── roles.yml
└── rpm.yml

[root@zijie ansible]# ansible-playbook roles.yml

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [124.70.209.222]

TASK [keepalived : install keepalived] *********************************************************************************************************************************************************************
changed: [124.70.209.222]

TASK [keepalived : conf] ***********************************************************************************************************************************************************************************
ok: [124.70.209.222]

TASK [keepalived : start service] **************************************************************************************************************************************************************************
changed: [124.70.209.222]

PLAY RECAP *************************************************************************************************************************************************************************************************
124.70.209.222             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0