使用Ansible中的playbook
1 playbook的功能
- playbook是由一个或多个play组成的列表
- playbook文件是用YAML来写的
- playbook是一种简单的配置管理系统与多机器部署系统的基础,非常适合于复杂应用的部署
- playbook可以用于声明配置,更强大的地方在于,在playbook中可以编排有序执行过程,甚至做到在多组机器间来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务
2 YMAL
2.1 简介
YMAL全称是Yet Another Markup Language,是一种表达资料序列的格式,类似XML
2.2 特点
- 可读性好
- 和脚本语言交互性好
- 易于实现
- 适用程序执行流梳理方式
- 可扩展性强
2.3 语法简介
- 在文件中用- - -开始
- 在文件中用…结束
- 次行一般书写文件内容
- 缩进严格且大小写敏感
- Key/Value可以多行书写也可以一行书写
- Value可以是字符串也可以是List
- 一个Play需要包括Name和Tasks
- Name是描述,Tasks是动作
- 一个Name只能包含一个Task
- 扩展名为yml或者yaml
2.4 YAML列表
[Linux,C++,Java,Python]
- Linux
- C++
- Java
- Python
2.5 YAML的字典
- 字典用于存放键值
- 其表达方式有两种
- name:Test
age:12
jobs:linux - {name: “Test”, age: “12”, jobs: “linux”}
- name:Test
注意:列表元素前必须加 ‘-’,但是字典前面不加
3 playbook执行命令
常用的参数:
参数 | 含义 |
---|---|
–check / -C | 预检测 |
–syntax-check | 语法检测 |
–list-hosts | 列出hosts |
–list-tasks | 列出tasks |
–list-tags | 列出tag |
–limit | 指定执行主机 |
-v / -vv / -vvv | 显示实现过程;v越多,显示的越详细 |
1)编写一个yml文件,如下所示:
注意:上面的playbook片段,实际上和ansible westos -m shell -a ‘hostname’
的含义相同
2)进行预执行检测,实际上没有执行只是进行检测:
进行语法检测,注意语法检测是不执行的,只是检测语法:
列出受控主机:
列出yml文件中的任务:
指定主机执行检测行为:
执行该playbook文件:
加上-v参数,显示部分执行过程,此时就可以看到该文件的执行结果:
3)修改test.yml文件,如下直接将模块当作一个列表,模块的参数使用键值表达,这样的表达方法也是成立的:
显示执行过程,如下所示:
注意:默认当某个playbook片段执行失败后会自动结束,不再执行下面的语句
4 playbook的核心组件
核心组件 | 含义 |
---|---|
name | 可选的,建议用于说明 |
hosts | 受控主机列表 |
tasks | 任务,用于选择执行部分代码 |
5 vim设定技巧
- 可以在~/.vimrc文件中设定:
autocmd FileType yaml setlocal ts=2 ai et sw=2
,表示只对playbook文件生效- setlocal:设定当前文件
- ai :自动退格对齐
- ts:设置tab键长度
- sw:缩进长度为
- et:把tab键变成空格
1)playbook具有严格的缩进和语法限制,为了方便缩进,可以设置如下,tab键长度为2:
2)只对playbook文件生效的vim设定:
注意:
- 设置之后使用cat命令查看某个vim文件,是不会有行号的,但文件里里会有行号显示
- vim的set设定表示对所有打开的vim文件都有效,对新打开的vim也生效
- vim的setlocal设定表示只对当前的vim文件有效,若再打开新的vim,则不生效
6 练习
1)使用playbook配置vsftpd服务,授权匿名用户登录,并添加一个测试文件到默认发布目录下:
先将之前下载过的安装包删除:
---
- name: VSftpd server
hosts: 172.25.254.136
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: latest
disable_gpg_check: yes
- name: firewalld setup
firewalld:
service: ftp
permanent: yes
state: enabled
immediate: yes
zone: public
- name: anon yes
lineinfile:
path: /etc/vsftpd/vsftpd.conf
regexp: "anonymous_enable=NO"
line: "anonymous_enable=YES"
- name: chmod
file:
path: /var/ftp/pub/
mode: 775
group: ftp
state: directory
recurse: yes
- name: touch Testfile
lineinfile:
path: /var/ftp/pub/Testfile
line: Test
create: yes
- name: start service
service:
name: vsftpd
state: started
enabled: yes
注意:可以使用ansible-doc dnf | less
命令,查看某个模块的用法,进入查看后输入/EXAMPLE寻找实例作为参考去写playbook文件
2)使用playbook配置dnf服务的正向解析:
---
- name: dns server
hosts: 172.25.254.136
tasks:
- name: install dns
dnf:
name: bind
state: latest
disable_gpg_check: yes
- name: firewalld setup
firewalld:
service: dns
permanent: yes
state: enabled
immediate: yes
zone: public
- name: named.conf setup
lineinfile:
path: /etc/named.conf
regexp: "listen-on port 53 "
line: "listen-on port 53 { any; };"
- lineinfile:
path: /etc/named.conf
regexp: "allow-query"
line: "allow-query { any; };"
- lineinfile:
path: /etc/named.conf
regexp: "dnssec-validation yes;"
line: "dnssec-validation no ;"
- name: named.rfc1912.zones setup
lineinfile:
path: /etc/named.rfc1912.zones
line: zone "westos.org" IN {
type master;
file "westos.org.zone";
allow-update {none; };
};
- name: copy named.localhost
copy:
src: /var/named/westos.org.zone
dest: /var/named/westos.org.zone
- name: start named
service:
name: named
state: started
enabled: yes
- name: resolv.conf setup
lineinfile:
path: /etc/resolv.conf
line: nameserver 172.25.254.136
如下图所示,在主控机中编辑该文件时,需要根据受控主机的ip不同编写不同的文件内容。这里之所以直接编写好后再复制到受控主机,只是为了方便目前学习阶段观察实验效果:
测试: