Ansible之playbook的使用总结

之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结.

为什么引入playbook?
一般运维人员完成一个任务, 比如安装部署一个httpd服务会需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,它的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。YAML语法能够简单的表示散列表,字典等数据结构。简单来说, playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情。

Ansible核心功能
-  pyYAML用于ansible编写剧本所使用的语言格式(saltstack---python);
-  rsync-ini语法, sersync-xml语法, nsible-pyYAML语法;
-  paramiko远程连接与数据传输;
-  Jinja2用于编写ansible的模板信息;

YAML三板斧
缩进: YAML使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs;
冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格;
短横线: 表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表;

YAML基本语法
列表:每一个列表成员前面都要有一个短横线和一个空格


1

2

3

4

5

6

7

8

fruits:

    - Apple

    - Orange

    - Strawberry

    - Mango

或者:

fruits: [‘Apple‘‘Orange‘‘Strawberry‘‘Mango‘]

字典:每一个成员由键值对组成,注意冒号后面要有空格


1

2

3

4

5

6

martin:

    name: Martin D‘vloper

    job: Developer

    skill: Elite

或者

martin: {name: Martin D‘vloper, job: Developer, skill: Elite}

列表和字典可以混合使用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

-  martin:

    name: Martin D‘vloper

    job: Developer

    skills:

      - python

      - perl

      - pascal

-  tabitha:

    name: Tabitha Bitumen

    job: Developer

    skills:

      - lisp

      - fortran

      - erlang

playbook基础组件
Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表
handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
templates:使用模板语言的文本文件,使用jinja2语法。
variables:变量,变量替换{{ variable_name }}

整个playbook是以task为中心,表明要执行的任务。hosts和remote_user表明在哪些远程主机以何种身份执行。其他组件让其能够更加灵活。下面介绍下这些插件:

1.  variable
变量定义在资产 (inventory) 中, 默认就是/etc/ansible/hosts文件中


1

2

3

4

5

6

7

8

9

10

11

12

主机变量:

192.168.200.136 http_port=808 maxRequestsPerChild=808

192.168.200.137 http_port=8080 maxRequestsPerChild=909

主机组变量:

[websers]

192.168.200.136

192.168.200.137

[websers:vars] 

ntp_server=ntp.exampl.com

proxy=proxy.exampl.com

变量定义在playbook中


1

2

3

- hosts: webservers

  vars:

    http_port: 80

使用facts变量


1

2

3

4

facts变量是由setup模块获取远程主机的信息。

用法:

# ansible 192.168.200.136 -m setup

在roles中定义变量, 这个后面会介绍到.

ansible-playbook 命令中传入参数


1

2

使用 -e选项传入参数

# ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml

变量的引用


1

{{ var_name }}

2.  templates
它是一个模块功能,与copy不同的是他的文本文件采用了jinga2语法,jinga2基本语法如下:


1

2

3

4

5

6

7

8

9

10

11

12

字面量:

  字符串:使用单引号或双引号

  数字:整型,浮点数

  列表:{item1,item2,...}

  字典:{key1:value1,key2:value2,...}

  布尔型:true/false

算术运算:

  +,-,*,/,//,%,**

比较运算:

  ==,!=,>,>=,<,<=

逻辑运算:

  and,or,not

注意:template只能在palybook中使用。

3.  tasks
执行的模块命令


1

2

3

4

5

6

7

8

9

10

11

12

13

格式:

  action:模块参数(此种方式只在较新的版本中出现)

  module:参数(已键值对的形式出现)

每一个task都有一个名称,用于标记此任务。任务示例:

  name: install httpd

  yum: name=httpd state=present

注意:shell和command没有参数,可在后面直接跟命令

  shell: ss -tnl | grep :80

1)某任务的运行状态为changed后,可通过相应的notify通知相应的handlers

2)任务可以通过tags打标签,然后通过palybook命令-t选项调用.

playbook调用方式

用法:
ansible-playbook  <filename.yml> ... [options]

<filename.yml>: yaml格式的playbook文件路径,必须指明
[options]: 选项

-C, --check:并不在远程主机上执行,只是测试。
-i PATH, --inventory=PATH:资产的文件路径
--flush-cache:清楚fact缓存
--list-hosts:列出匹配的远程主机,并不执行任何动作
-t, TAGS, --tags=TAGS:运行指定的标签任务
--skip-tags:跳过指定的notify,后面详细介绍。

palybook书写格式


1

2

3

4

- hosts: 172.16.60.211                #处理指定服务器.   - (空格)hosts:(空格)172.16.20.211

  task:                               #剧本所要干的事情; (空格)(空格)task:

  - name:                             #(两个空格)-(空格)name:

    commandecho hello clsn linux    #(四个空格)command:(空格)

palybook格式示例


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

[[email protected] ~]# vim /etc/ansible/test.yaml

- hosts: 172.16.60.213

  tasks:

    - name: Install Rsync

      yum: name=rsync state=installed

playbook检查方法

[[email protected] ~]# ansible-playbook --syntax-check /etc/ansible/test.yaml

playbook: /etc/ansible/test.yaml

[[email protected] ~]# ansible-playbook -C /etc/ansible/test.yaml

PLAY [172.16.60.213] *******************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************

ok: [172.16.60.213]

TASK [Install Rsync] *******************************************************************************************************************

ok: [172.16.60.213]

PLAY RECAP *****************************************************************************************************************************

172.16.60.213              : ok=2    changed=0    unreachable=0    failed=0 

上面两个检查命令, 第一个是进行playbook剧本配置信息语法检查; 第二个是模拟playbook剧本执行(彩排)

palybook剧本文件示例

ansible-playbook编写内容扩展剧本任务编写多个任务


1

2

3

4

5

6

- hosts: all

  tasks:

    - name: restart-network

      cron: name=‘restart network‘ minute=00 hour=00 job=‘/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1‘

    - name: sync time

      cron: name=‘sync time‘ minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

剧本编写内容扩展:剧本任务编写多个主机


1

2

3

4

5

6

7

8

9

10

11

- hosts: 172.16.60.7

  tasks:

    - name: restart-network

      cron: name=‘restart network‘ minute=00 hour=00 job=‘/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1‘

    - name: sync time

      cron: name=‘sync time‘ minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

- hosts: 172.16.60.31

  tasks:

    - name: show ip addr to file

      shell: echo $(hostname -i) >> /tmp/ip.txt

playbook剧本编写方式
-  多主机单任务编写方式
-  多主机多任务编写方式
-  不同主机多任务编写方式

Ansible-playbook案例分享


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

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

1) 机器环境

角色                   外网ip                      内网ip                           部署软件

m01                  eth0:10.0.0.61         eth1:172.16.1.61         ansible

backup              eth0:10.0.0.41         eth1:172.16.1.41         rsync

nfs                    eth0:10.0.0.31          eth1:172.16.1.31         nfs、Sersync

web01               eth0:10.0.0.7           eth1:172.16.1.7            httpd

2) 目录规划

[[email protected] ~]# mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p

[[email protected] ~]# tree /etc/ansible/ansible_playbook/

/etc/ansible/ansible_playbook/

├── conf

└── file

└── scripts

3) rsync配置文件

准备对应的配置文件存放至/etc/ansible/ansible_playbook/conf/

[[email protected] conf]# cat /etc/ansible/ansible_playbook/conf/rsyncd.conf

uid = www

gid = www

port = 873

fake super = yes

use chroot = no

max connections = 200

timeout = 600

ignore errors

read only = false

list = false

auth users = rsync_backup

secrets file /etc/rsync.password

log file /var/log/rsyncd.log

#####################################

[backup]

path = /backup

[data]

path = /data

4) nfs配置文件

准备nfs配置文件exports

[[email protected] ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/nfs_exports

/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

5) Sersync软件包

下载Sersync软件包

[[email protected] ansible_playbook]# ll /etc/ansible/ansible_playbook/file/

-rw-r--r-- 1 root root 727290 Aug  1 12:04 sersync.tar.gz

6) sersync配置文件

准备sersync实时同步的配置文件

[[email protected] ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs

7) 基础环境部署

基础环境:所有机器统一的配置

需要关闭firewalld以及selinux、epel仓库、ssh端口、优化基础配置

需要安装rsync和nfs-utils

准备www用户

需要准备/etc/rsync.pass密码文件

需要准备全网备份脚本

基础的playbook剧本

[[email protected] ansible_playbook]# cat base.yaml

- hosts: all

  tasks:

    - name: Install Epel Repos

      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo

    - name: Install Rsync Nfs-Utils

      yum: name=rsync,nfs-utils state=installed

    - name: Create Group WWW

      group: name=www gid=666

    - name: Create User WWW

      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin

    - name: Create Rsync_Client_Pass

      copy: content=‘1‘ dest=/etc/rsync.pass mode=600

    - name: Create Scripts Directory

      file: path=/server/scripts recurse=yes state=directory

    - name: Push File Scripts

      copy: src=./scripts/rsync_backup_md5.sh dest=/server/scripts/

    - name: Crontable Scripts

      cron: name="backup scripts" hour=01 minute=00 job="/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null"

8) 应用环境:Rsync

安装rsync

配置rsync(配置变更,一定要进行重载操作)

创建虚拟用户,权限调整

创建目录/data/  /backup

启动rsync

配置邮箱->邮箱的发件人->校验的脚本

[[email protected] ansible_playbook]# cat rsync.yaml

- hosts: backup

  tasks:

    - name: Installed Rsync Server

      yum: name=rsync,mailx state=installed

    - name: configure Rsync Server

      copy: src=./conf/rsyncd.conf dest=/etc/rsyncd.conf

      notify: Restart Rsync Server

    - name: Create Virt User

      copy: content=‘rsync_backup:1‘ dest=/etc/rsync.password mode=600

    - name: Create Data

      file: path=/data state=directory recurse=yes owner=www group=www mode=755

    - name: Create Backup

      file: path=/backup state=directory recurse=yes owner=www group=www mode=755

    - name: Start RsyncServer

      service: name=rsyncd state=started enabled=yes

    - name: Push Check Scripts

      copy: src=./scripts/rsync_check_backup.sh dest=/server/scripts/

    - name: Crond Check Scripts

      cron: name="check scripts" hour=05 minute=00 job="/bin/bash /server/scripts/rsync_check_backup.sh &>/dev/null"

9)  应用环境:NFS

安装nfs-utils

配置nfs (当修改了配置,触发重载操作)

创建目录,授权

启动

[[email protected] ansible_playbook]# cat nfs.yaml

- hosts: nfs

  tasks:

    - name: Installed Nfs Server

      yum: name=nfs-utils state=installed

    - name: Configure Nfs Server

      copy: src=./conf/exports dest=/etc/exports

      notify: Restart Nfs Server

    - name: Create Share Data

      file: path=/data state=directory recurse=yes owner=www group=www mode=755

    - name: Start Nfs Server

      service: name=nfs-server state=started enabled=yes

  handlers:

    - name: Restart Nfs Server

      service: name=nfs-server state=restarted

10) 应用环境:Sersync

下载sersync

解压,改名,配置

启动

[[email protected] ansible_playbook]# cat sersync.yaml

- hosts: nfs

  tasks:

    - name: Scp Sersync

      copy: src=./file/sersync2.5.4_64bit_binary_stable_final.tar.gz dest=/usr/local/sersync.tar.gz

    - name: Zip

      shell: cd /usr/local && tar xf sersync.tar.gz && mv GNU-Linux-x86 sersync

      args:

        creates: /usr/local/sersync

    - name: configure Sersync

      copy: src=./conf/confxml.xml dest=/usr/local/sersync/

    - name: Start Sersync

      shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

11) 应用环境:WEB

挂载nfs共享的目录

[[email protected] ansible_playbook]# cat web.yaml

- hosts: web

  tasks:

    - name: Mount NFS Server Share Data

      mount: src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted

12) 包含include

[[email protected] ansible_playbook]# cat mail.yaml

- import_playbook: base.yaml

- import_playbook: rsync.yaml

- import_playbook: nfs.yaml

- import_playbook: sersync.yaml

- import_playbook: web.yaml

13) 操作后测试步骤

快照还原

推送公钥

使用ping模块测试

执行ansible-playbook测试

测试全网备份,测试是否能发邮件,并校验结果

测试nfs的挂载

测试实时同步

原文地址:https://www.cnblogs.com/jians/p/11940744.html

时间: 2024-11-10 14:53:13

Ansible之playbook的使用总结的相关文章

ansible的playbook配置及template模板的使用

前言: 学习下ansible的playbooks的状态配置管理,说来puppet saltstack都有类似的叫法,只是ansible的叫法更犀利,我当时一看playbook还以为是花花公子的playboy.要使用ansible就要深入学习playbook配置及模板. 注:到底是playbook还是playbooks.... 先把官网的简单几个语法给说明下. #这个是你选择的主机 - hosts: webservers #这个是变量   vars:     http_port: 80     m

ansible的playbook介绍和实战

1.playbook 介绍: 简单的说就是定义一个配置文件,文件中写入你需要安装的服务,配置文件,变量等信息,使他们可以按照事先定义好的机制完成一个任务. Playbook使用YAML语法结构,所以配置阅读起来都比较简单. 2.playbook 的组成结构: target section 定义将要执行playbook的远程主机组 variable section 定义playbook运行时需要使用的变量 task section 定义将要在远程主机上执行的任务列表 handler section

Ansible 之 playbook使用

1  概述 Playbook组织格式是YAML格式,编排的是任务(task),用来记录重复执行的命令 YAML:YAML(/?j?m?l/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式.YAML参考了其他多种语言,包括:C语言.Python.Perl,并从XML.电子邮件的数据格式(RFC 2822)中获得灵感.Clark Evans在2001年首次发表了这种语言,另外Ingy d?t Net与Oren Ben-Kiki也是这语言的共同设计者.目前已经有数种编程语言或脚本语言支

【Ansible之playbook剧本】 &#434412;

目录 基本用法 传参使用 条件判断 when 标签 tags 模板 template 循环 with_item handlers 原文: http://blog.gqylpy.com/gqy/374 @(Ansible之playbook剧本) ymal: 列表:- 字典:key-value 文件后缀名:yml ansible-playbook 命令格式: -C:--check 干跑,不会执行 -f:FORKS 并发执行 --syntax-check:语法检查 --list-hosts:列出主机列

ansible的playbook组件

playbook的核心元素: tasks: 任务 variables: 变量 templates: 模板 handlers: 处理器 roles: 角色 组织格式:YAML(被称为另外一种标记语言) 语法:(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) 例如: name:tom age:21 gender:Male spourse: name:lily gender:female children: —  name:susan age: 2 gender:female —

ansible用playbook实现定期监控各机器磁盘空间任务

目标:用ansible定期监控各机器的磁盘空间状况 和进程运行状况 1)配置playbook脚本,实现对磁盘空间 和 特定进程运行状态的每日检查: 2)通过邮件插件,把检测结果发到ops邮箱: 一.playbook的配置实现 monitor_ansible.yaml 1 --- 2 - name: diskspace_mornitor 3 hosts: local 4 user: root 5 gather_facts: no 6 vars: 7 path: /home/devops 8 9 t

二、Ansible中playbook的变量

先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debug模块,debug模块将其打印输出 verbosity:debug的任务级别 1:在playbook中直接使用 --- - hosts: db vars: vvv: china tasks: - name: test var debug: msg="The variable 'vvv' is {{ vvv }}" 输出结果: 2:在文件中定义 --- - hosts: db vars_f

【Ansible】Playbook实例

Learn to build Ansible playbooks with our guide, one step at a time In our previous posts, we introduced Ansible fundamentals, and dove deeper into Ansible playbooks. Now let's learn to create an Ansible playbook step by step. Working with a playbook

Ansible值playbook

简介 playbook是一个非常简单的配置管理和多主机部署系统.可作为一个适合部署复杂应用程序的基础.playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式.playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤. playbook通过示例展示其用法 定制一个简单的Nginx软件包管理,内容包括安装.配置模板.状态管理等. 配置文件:nginx.yml --- - hosts: webservers #hosts参数