Ansible 中 Playbook 的介绍
1. Playbook 的功能
- playbook 是由一个或多个 play 组成的列表;
- Playboot 文件使用 YAML 来写的。
2. YAML
-
简介:
YAML 是一种表达资料序列的格式,类似XML;
Yet Another Markup Language;
2001年首次发表;
www.yaml.org; -
特点
可读性好、和脚本语言交互性好、易于实现、适用程序执行流梳理方式、可扩展性强 -
语法简介
在文件中用[---]
开始;
在文件中用[...]
结尾;
次行一般书写文件内容,缩进严格,大小写敏感;
key/value
可以多行书写也可一行书写,一行书写用,
隔开;
value可以是个字符串,也可是list;
一个play需要包括name
和tasks
;
name 是描述,,tasks 是动作;
一个 name 只能包含一个 task;
扩展名称yml
或者yaml
; -
YAML 列表
[Linux,C++,Java,Python]
或者是
-Linux
-C++
-Java
-Python
- YAML 的字典
字典作用存放键值,键值存放在列表中;列表也可以在字典中;
name:westos
age:12
jobs:linux
{name: "westos", age: "12", jobs: "linux"}
前面有 - 的是列表,没有 - 的是字典。
如编写一个 playbook ,内容如下图所示,其中前面的---
为固定的开始格式,- name
为一个列表,列表里面包含一个字典,字典的内容是一一对应的,可见列表里面包含字典,字典里面也可以包含列表。
3. playbook 执行命令
ansible-playbook xxx.yml ... ##执行动作
--check|-C ##检测
--syntax-check ##check language
--list-hosts ##列出hosts
--list-tags ##列出tag
--list-tasks ##列出task
--limit ##指定执行主机
-v -vv ##显示过程
对于上面编写的脚本可以用命令来执行;
命令 ansible-playbook -C test.yml
表示预执行,有输出的效果;
命令 ansible-playbook --syntax-check test.yml
用来检测语言,不做执行动作,只做检测;如图所示没有问题时只显示 playbook 脚本;
用命令 ansible-playbook --list-hosts test.yml
来列出执行的所有主机;
用命令 ansible-playbook --list-tags test.yml
来列出所有的tag;
用命令 ansible-playbook --list-tasks test.yml
来列出所有的 task;
用命令 ansible-playbook --limit 172.25.254.100 test.yml -C
来指定主机执行;
在执行 playbook 剧本的时候,默认是只会有运行过程,但是并没有详细信息,可以加参数 -v -vv -vvv
当 v 越多时代表越详细,最多就是三个;
4. Playbook的核心组件
- name :可选,建议使用多用于说明
- hosts :受控主机列表
- tasks :任务,用与选择执行部分代码
基本示例
有无 name
来观察效果;可以看到有无 name
的执行效果一致,但一般建议写上,因为当 play 片段比较多时,当检测出错时方便定位问题。
示例:用 playbook 的方式在受控主机中安装 httpd 服务
编写 playbook 如下图所示:
第1行为起始标识,第5行 name 表示安装 apache,调用 dnf 模块,其中 state: latest
表示更新,disable_gpg_check
表示安装时不检测;
第11行至15行,表示开启 apache,调用的模块是 service
,其中 state: started
表示开启, enabled
表示设定开机自启;
第17至23行表示设定火墙策略,允许 apache,调用 firewalld
模块,其中 immediate
表示立即生效,service
服务名称,zone
火墙的域,permanent
永久生效,state: enbaled
允许;
第25至29行表示设定发布页面内容,调用 lineinfile
模块,其中 ipath
指定要操作的文件,line
指定文本内容,create
表示当文件不存在时,创建对应的文件。
在执行前先查看一下被控主机中是否已经安装了 apache,在检测一下剧本是否有语法上的错误;
如图表示被控主机上还没有安装 apache ;
检测剧本的语法问题,如图所示表明剧本没有问题;
执行剧本来安装 apache ;
访问被控主机的 IP,查看发布页面是否正常显示;
注:在写的过程中如果对于某一个模块的设定不是很确定,可以用命令 ansible-doc
加上对应的模块来查看其帮助。
5. vim 设定技巧
-
autocmd FileType yaml setlocal ai ts=2 sw=2 et
-
setlocal ##设定当前文件
-
ai ##自动退格对齐 auto indent
-
ts ##tab建长度为2空格 tabstop=2
-
sw ##缩进长度为2 shiftwidth=2
-
et ##把tab键变成空格 expandtab
可以编辑 vim 的设定,如图所示,表示设定行号,指定一个 Tab 为两个空格,ai 表示自动补齐,et 表示将 tab 可以拆分。
设定文件内容入下图所示,第一行 autocmd Filetype
表示在指定什么类型的文件; yaml
表示 yaml 的文件时会生效,setlocal
表示只对当前的文件生效,再次打开其他的文件时还是不生效;指定一个 Tab 为两个空格,ai 表示自动补齐,et 表示将 tab 可以拆分;sw 表示缩进长度为2。
练习:
- 用 playbook 剧本的方式在安装 vsftpd 服务,允许匿名用户访问,并发布一个文件 /var/ftp ;
编写剧本信息如下图所示:
[root@Ansible .ansible]# vim vsftpd.yaml
[root@Ansible .ansible]# cat vsftpd.yaml
---
- name: vsftpd server
hosts: 172.25.254.100
tasks:
- name: install vsftpd ##安装 vsftpd 服务
dnf:
name: vsftpd
state: latest
disable_gpg_check: yes
- name: install ftp ##客户端,用来测试,可以不需要这一步
dnf:
name: lftp
state: latest
disable_gpg_check: yes
- name: vsftpd setup ##修改配置文件,允许匿名用户访问
lineinfile:
path: /etc/vsftpd/vsftpd.conf
regexp: "anonymous_enable"
line: "anonymous_enable=YES"
- name: start vsftpd ##开启服务
service:
name: vsftpd
state: started
enabled: yes
- name: firewalld setup ##设定火墙策略
firewalld:
service: ftp
permanent: yes
state: enabled
immediate: yes
zone: public
- name: touch zxkfile ##建立发布文件
file:
path: /var/ftp/zxkfile
state: touch
测试结果如下图所示:
完成之后,访问发布目录查看发布文件结果如图所示:
注:以上过程要确定受控主机中的 selinux
的开启状态,此过程没有考虑到 selinux 为开启的状态,当 selinux 开启时,需要关闭重启系统来可以允许客户端访问。
- 用 playbook 剧本的方式在安装 dns 服务,维护
westos.org
的域,在这个域中有三个网址,www.westos.org 对应的 ip 是 172.25.254.100,bbs.westos.org 对应的是 westosa.westos.org 对应的 ip 是 172.25.254.111 和 172.25.254.222。
在当前主机上安装软件,提供复制的模板文件;然后将生成的模板文件复制到 /tmp/ 目录中再进行编辑;
[root@Ansible tmp]# yum install bind -y
[root@Ansible .ansible]# ls
ansible.cfg apache.yml cp inventory test.yml tmp vsftpd.yaml westos.yml
[root@Ansible .ansible]# cd /tmp/
[root@Ansible tmp]# cp /var/named/named.localhost westos.org.zone
[root@Ansible tmp]# cp /etc/named.rfc1912.zones named.rfc1912.zones
[root@Ansible tmp]# cp /etc/named.conf .
[root@Ansible tmp]# ll
total 12
-rw-r-----. 1 root root 1705 May 10 10:20 named.conf
-rw-r-----. 1 root root 1029 May 10 10:18 named.rfc1912.zones
-rw-r-----. 1 root root 152 May 10 10:17 westos.org.zone
[root@Ansible tmp]# vim named.conf
10 options {
11 listen-on port 53 { any; };
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named";
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 secroots-file "/var/named/data/named.secroots";
18 recursing-file "/var/named/data/named.recursing";
19 allow-query { any; };
31 recursion yes;
32
33 dnssec-enable yes;
34 dnssec-validation no;
35
[root@Ansible tmp]# vim named.rfc1912.zones
28
29 zone "westos.org" IN {
30 type master;
31 file "westos.org.zone";
32 allow-update { none; };
33 };
34
[root@Ansible tmp]# vim westos.org.zone
1 $TTL 1D
2 @ IN SOA dns.westos.org. root.westos.org. (
3 0 ; serial
4 1D ; refresh
5 1H ; retry
6 1W ; expire
7 3H ) ; minimum
8 NS dns.westos.org.
9 dns A 172.25.254.100
10 www A 172.25.254.100
11 bbs CNAME westosa.westos.org.
12 westosa A 172.25.254.111
13 westosa A 172.25.254.222
~
编辑 playbook
脚本内容如下所示:
[root@Ansible tmp]# cat dns.yml
---
- name: dns server
hosts: 172.25.254.100
tasks:
- name: install dns ##安装服务
dnf:
name: bind
state: latest
- name: make configure file ##复制文件
copy:
src: ./tmp/named.conf
dest: /etc/named.conf
owner: root
group: named
mode: "0660"
- copy: ##复制文件
src: ./tmp/named.rfc1912.zones
dest: /etc/named.rfc1912.zones
owner: root
group: named
mode: "0660"
- copy: ##复制文件
src: ./tmp/westos.org.zone
dest: /var/named/westos.org.zone
owner: root
group: named
mode: "0660"
- name: start named ##开启服务
service:
name: named
state: started
enabled: yes
- name: firewalld setup ##设定火墙
firewalld:
service: dns
state: enbaled
permanent: yes
zone: public
immediate: yes
测试结果如图所示: