Ansible-Playbook高级语法运用

Posted by Yancy on 2017-02-10

Ansible 官网学习:

免费下载的ANSIBLE WHITEPAPER ansible高级白皮书

Ansible简介, 111分钟的学习视频官网

Ansible自动化平台演示,演示

我在官网学习📚书籍 ,这里也是官网推荐我贴了3本,需要自己去下载:

  1. Ansible for DevOps, by Jeff Geerling
    FREE BOOK SAMPLE
  1. Extending Ansible eBook Preview , Extending Ansible ,by Rishabh Das
    FREE BOOK SAMPLE

  2. Mastering Ansible ebook , Mastering Ansible , by Jesse Keating
    FREE BOOK SAMPLE

这里我主要应用到Ansible-Playbook 比较多,一开始学ansible是因为运维这块需要用到自动化,以前自动化发布等等都是用shell,python复杂性的去完成,shell去实现部署一个环境,要完成多台机器之前采用,salt去实现效果,发现在公司一个大型的架构演变salt支撑不了,而且需要网络稳定性高,他们的自动化控制是用agent去控制的,需要控制的机器都要修改和配置安装agent,ansbile就不需要。

在Ansible中,我们就充当编剧的角色,亲自编写剧本(一系列的服务器操作),让一出出精彩的戏剧(play)巧妙配合,完成对服务器的一系列精确控制。

1.1 Playbook语法简介

Playbook采用一种可读性很高的且容易被人类阅读的语法的YAML语法编写,YAML: "YAML Ain't a Markup Language"(YAML不是一种置标语言)。该语言在被开发时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言),格式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345

这里语法报错有的如果按shell脚本直接去写的话就会出错:

报错: [WARNING]: Consider using unarchive module rather than running unzip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@ansible_01 ~]# ansible-playbook famly.yml
---
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [192.168.1.209]
TASK [copy-war-file] ***********************************************************
ok: [192.168.1.209]
TASK [unzip war.] **************************************************************
changed: [192.168.1.209]
[WARNING]: Consider using unarchive module rather than running unzip
PLAY RECAP *********************************************************************
192.168.1.209 : ok=3 changed=1 unreachable=0 failed=0

原这里famly.yml写这里解压步骤:

1
2
- name : 解压/root/java_war/api.war包在/home/app/newwar/api目录
shell : unzip -oq {{ famly_war }} -d {{ app_war }}/webapps/

修改以后:

1
2
- name: unzip war.
unarchive: src=/root/java_war/haozhuo-family.war dest=/srv/

经过以上更改后,软件包可以正常在client解压,不再报错。

2、特点

YAML的可读性好

YAML和脚本语言的交互性好

YAML使用实现语言的数据类型

YAML有一个一致的信息模型

YAML易于实现

YAML可以基于流来处理

YAML表达能力强,扩展性好

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用”-“来代表,Map里的键值对用”:”分隔。下面是一个示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- hosts: 10.1.0.1 #定义主机
vars: #定义变量
var1: value
var2: value
tasks: #定义任务
- name: #任务名称。
#这里就可以开始用模块来执行具体的任务了。
handlers: #定义触发通知所作的操作。里面也是跟tasks一样,用模块定义任务。
- name:
remote_user: #远程主机执行任务时的用户。一般都是root,一般也不用指定。
- hosts: web
vars:
tasks:
handlers:
remote_user:

YAML文件扩展名通常为.yaml,如family.yaml

2.playbook的基础组件:

1
2
3
4
5
6
7
8
Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:任务列表
模块,模块参数:
格式:
(1) action: module arguments
(2) module: arguments

示例1:

vim test.yaml 也可以是 .yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- hosts: tomcat_01 #运行指定任务的目标主机;
remote_user: root #在远程主机以哪个用户身份执行;root
tasks:
- name: install a group
group: name=mygrp system=true
- name: install a user
user: name=user1 group=mygrp system=true # 这里-name: graoup: 都要对齐,不然会提示语法出错。
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd
- name: start httpd service
service: name=httpd state=started

3.运行playbook,使用ansible-playbook命令

(1)检测语法

1
ansible-playbook –syntax-check /path/to/playbook.yaml

(2)测试运行

1
2
3
4
5
ansible-playbook -C /path/to/playbook.yaml
--list-hosts
--list-tasks
--list-tags

这里简单结合shell演变写安装nginx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- name: copy nginx package
copy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm
- name: install nginx package
yum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm state=present
- name: install nginx.conf file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: ngxconf
notify: reload nginx service
- name: install default.conf file
template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
tags: ngxconf
notify: reload nginx service
- name: start nginx service
service: name=nginx enabled=true state=started

自动化部署Tomcat服务。

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
---
- hosts: all
environment:
LC_ALL: zh_CN.UTF-8
LANG : zh_CN.UTF-8
vars:
#jenkins-打包目录
TESTWAR: /root/java_war/haozhuo-family.war
#生产环境中项目的tomcat所在的位置
OLDHOME: /srv/tomcat/tomcat_family/webapps/ROOT
#生产环境中老版本项目所在webapps备份目录的位置
backupwebapps: /srv/tomcat/tomcat_family/warbackup
#从jenkins-打包环境获取的新版本war包所在的位置
NEWWAR: /root/java_war/
#生产环境中项目war包的名字
WARNAME: haozhuo-family.war
#kill服务type路径
DOWNFILE: /srv/tomcat/tomcat_family
tasks:
- name: copy-war-file
copy: src={{ TESTWAR }} dest={{ NEWWAR }}
- name: mkdir-bakwar-file
file: path={{ backupwebapps }} state=directory owner=tomcat group=tomcat mode=755
- name: bakwar-file
shell: "cp -r {{ OLDHOME }} {{ backupwebapps }}"
- name: unzip war.
unarchive: src={{ NEWWAR }}/{{ WARNAME }} dest={{ OLDHOME }}
- name: stop-tomcat-service
shell: "ps -ef |grep {{ DOWNFILE }} |grep -v grep |awk '{print $2}' |xargs kill -9"
ignore_errors: yes
async: 0
- name: start-tomcat-service-nohup
shell: chdir={{ DOWNFILE }}/bin nohup ./startup.sh &
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# tree /etc/ansible/
.
├── ansible.cfg
├── group_vars # here we assign variables to particular groups
│ └── tomcat-servers # this filename must the same with the group in the 'hosts'
├── hosts
├── roles
│ ├── selinux
│ └── tomcat
│ ├── files
│ │ └── tomcat-initscript.sh # <-- script files for use with the script resource
│ ├── handlers
│ │ └── main.yml # <-- handlers file
│ ├── tasks
│ │ └── main.yml # <-- tasks file can include smaller files if warranted
│ └── templates # <-- files for use with the template resource
│ ├── iptables-save
│ ├── server.xml
│ └── tomcat-users.xml
├── app2.retry
└── app2.yml # master playbook