0%

Ansible Playbook 以及 Roles 的简单使用方法

关于 Ansible 系列其他文章的传送门

  1. 《 Ansible 介绍和基础操作 》

  2. 《 Ansible Playbook 以及 Roles 的简单使用方法 》    您当前所在位置

  3. 《 使用 Ansible Playbook 通过 yum 部署 LNMP 环境 》

  4. 《 使用 Ansible Roles 快速搭建 Nginx 代理后端的 LAMP 模型 》

  5. 《 使用 Ansible Playbook 自动完成硬盘的分区、格式化、挂载 》



playbook

一、Ansible Playbook

使用 YAML 或者 json 格式编写剧本(Playbook),剧本中定义了各种 task,按照要求和条件执行

YAML(/ˈjæməl/,尾音类似 camel 骆驼)是一个可读性高,用来表达数据序列化的格式。YAML 参考了其他多种语言,包括:C 语言、Python、Perl,并从 XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans 在 2001 年首次发表了这种语言,另外 Ingy döt Net 与 Oren Ben-Kiki 也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

1. Playbook 的核心元素

  • hosts:主机
  • tasks:任务列表
  • templates:包含了模板语法的文本文件
  • handlers:由特定条件触发的任务

2. 运行 Playbook 的方式

  1. 检查语法
    ansible-playbook --syntax-check
  2. 测试可能发生的改变,并不真的执行
    ansible-playbook --check
  3. 运行playbook
    ansible-playbook nginx.yml

3. Playbook 的基本使用方法

先定义 yml 文件,比如 nginx.yml
vim nginx.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- hosts: #运行指定任务的主机
remote_user: #指定执行任务的用户
sudo_user: #登陆后 sudo 到不同的用户,而不是使用 root

#可以定义变量的方法
vars:
- var1: value1
- var2: value2
#引用变量时格式 {{ var1 }}
#也可以在执行 ansible-playbook 时使用 -e var1=value1 对变量重新赋值
# 变量优先级 ansible-playbook > yaml 剧本中定义

tasks: #任务列表
- name: yum install nginx #先指定名字
yum: name=nginx state=installed
#<模块>: <模块参数>

#模板:templates,使用 Jinja2 格式,j2 文件中,调用变量使用 {{ var }},
#也可以直接调用 setup 模块中自带的变量
- name: copy nginx conf
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=nginx mode=644

#某任务在执行后状态为 changed 时,可通过 notify 通知给相应的 handlers,
#上面修改了 nginx 的配置文件,就需要通知 "restart nginx" 来重启 nginx 服务使新配置文件生效
notify: name= "restart nginx"

#可以通过 tags 来打标签,以后可以在 ansible-playbook 时,使用 -t 指定调用
#only run plays and tasks tagged with these values
tags:
- copy nginx conf

#定义特定条件触发的任务,上边 nginx 的配置文件发生变化后,会通知这里,来重启 nginx
handlers:
- name: "restart nginx"
service: name=nginx state=restarted

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- hosts: webserver
remote_user: ubuntu
sudo_user: root

tasks:
- name: install nginx
yum: name=nginx state=present

- name: install conf file
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags:
- install_config

- name: start nginx service
service: name=nginx state=started

handlers:
- name: restart nginx
service: name=nginx state=restarted

4. 条件测试

when 语句:在 task 中使用,jinja2 的语法格式

1
2
3
4
5
6
7
8
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7" #当变量为7时(centos7),执行上一行的模板任务

- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6" #当变量为6时(centos6),执行上一行的模板任务

5. 循环

迭代,需要重复执行的任务,对迭代项的引用,固定变量名为 item, 而后,要在 task 中使用 with_items 给定要迭代的元素列表;

语法:

  • 列表方法:
    • 字符串;
    • 字典;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm

- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13

- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11', group: 'group11' }
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }

二、角色(Roles)

roles
角色集合,先定义角色

1
2
3
4
5
roles/
mysql/
httpd/
nginx/
memcached/

每个角色,以特定的层级目录结构进行组织

1
2
3
4
5
6
7
8
mysql/
files/ #存放由 copy 或 script 模块等调用的文件:
templates/ #template 模块查找所需要模板文件的目录:
tasks/ #至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含;
handlers/ #至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含;
vars/ #至少应该包含一个名为 main.yml 的文件;其它的文件需要在此文件中通过 include 进行包含;
meta/ #至少应该包含一个名为 main.yml 的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过 include 进行包含;
default/ #设定默认变量时使用此目录中的 main.yml 文件;

调用角色
在 playbook 调用角色方法 1:

1
2
3
4
5
6
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx

在 playbook 调用角色方法 2:传递变量给角色

1
2
3
4
- hosts:
remote_user:
roles:
- {role: nginx, username: nginx} #键 role 用于指定角色名称;后续的 k/v 用于传递变量给角色;