Linux服务器教程之十五Ansible的playbook
【摘要】 playbook(剧本):
是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。
概念
playbook
是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。
当一个设施过于复杂,需要大量的操作时候,且需要不断的重复操作,这时最好使用playbook,其使用意义类似于脚本一样,可以很方便的批处理任务,但playbook与脚本不同的是,playbook有自己的语法格式。
参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html
使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)
YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
xml:数据存储的格式;
tomcat:server.xml tomcat-user.xml
json:格式,ansible回复语法格式;python,java,前端使用.json替代xml成了不同工种 不同操作系统,数据交换格式。
YMAL格式
-
以.yaml或.yml结尾
-
文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)
-
以#号开头为注释
-
列表中的所有成员都开始于相同的缩进级别, 并且使用一个
"- "
作为开头(一个横杠和一个空格) -
一个字典是由一个简单的
键: 值
的形式组成(这个冒号后面必须是一个空格) -
注意: 写这种文件不要使用tab键,都使用空格
参考: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-syntax
下面看一个官方的示例感受一下
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
写一个playbook文件(后缀为.yml或.yml)**
# mkdir -p /server/scripts/playbook
---
- hosts: all
tasks:
- name: 01 打开冰箱门
shell: echo 01 >> /tmp/bingxiang.log
- name: 02 把大象放进冰箱
shell: echo 02 >> /tmp/bingxiang.log
- name: 03 关上冰箱的门
shell: echo 03 >> /tmp/bingxiang.log
第4步: 执行写好的palybook
-
会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识
-
执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)
# ansible-playbook /server/scripts/playbook/01.show.yml
#验证:
ansible all -a 'cat /tmp/bingxiang.log'
name:提示信息,日志里面的是shell的步骤
执行的时候有奶牛:
可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1去掉注释即可
#书写Ans playbook注意事项:
同一个层级的内容对齐的
不同层级的通过2个空格对齐
不能使用tab键
Playbook常见语法
hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.
remote_user: 用于指定远程主机上的执行任务的用户.
- hosts: all
remote_user: root
tasks: 任务列表, 按顺序执行任务.
-
如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.
tasks:
- name: 安装httpd,相关服务 ,最新版
yum: name=httpd,httpd-devel state=latest
- name: 配置文件
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
handlers: 类似task,但需要使用notify通知调用。
-
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.
-
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
案例02:创建目录并分发文件
创建目录/server/files/
mkdir -p /server/files/
#目标 /etc/hosts文件发送过去/server/files/
#剧本文件 格式一..
- hosts: all
tasks:
- name: 第一步创建目录
file: path=/server/files/ state=directory
- name: 第二步,拷贝/etc/hosts到/server/files下
copy: src=/etc/hosts dest=/server/files/
#剧本文件 格式二..
- hosts: all
tasks:
- name: 第一步创建目录
file:
path: /server/files/
state: directory
- name: 第二步,拷贝/etc/hosts到/server/files下
copy:
src: /etc/hosts
dest: /server/files/
variables: 变量
-
定义变量可以被多次方便调用
m1# vim /server/scripts/playbook/example3.yaml
---
- hosts: all
remote_user: root
vars: #关键字,var+s variable变量的意思
- myuser: test1 #定义变量: - 变量名;
tasks:
- name: 创建用户
user: name={{myuser}} state=present #{{变量}}
m1# ansible-playbook /server/scripts/playbook/example3.yaml
去掉name,出故障3;去掉state也会出故障.
playbook实例
先直接来看一个实例
第1步: 创建一个存放playbook的目录(路径自定义)
m1# mkdir /server/scripts/playbook
第2步: 准备httpd配置文件,并修改成你想要的配置
m1# yum install httpd -y
按需要修改你想要的配置(为了测试可以随意改动标记一下)
m1# vim /etc/httpd/conf/httpd.conf
第3步: 写一个playbook文件(后缀为.yml或.yaml)
# vim //server/scripts/playbook/03.yaml
---
- hosts: all
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd,httpd-devel state=latest
#先忽略
- name: write the apache config file
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
第4步: 执行写好的palybook
-
会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识
-
执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)
# ansible-playbook /server/scripts/playbook/03.httpd.yaml
案例: playbook编排vsftpd
写一个playbook实现
-
配置yum
-
安装vsftpd包
-
修改配置文件(要求拒绝匿名用户登录)
-
启动服务并实现vsftpd服务开机自动启动
---
- hosts: all
remote_user: root
tasks:
- name: 删除目标服务器上的所有,/etc/yum.repos.d/
file: path=/etc/yum.repos.d/ state=absent
- name: 同步master上的yum源到all
copy: src=/etc/yum.repos.d dest=/etc/
- name: yum模块安装,最新版
yum: name=vsftpd state=latest
- name: 将m1的配置文件,拷贝到目标机
copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf
notify: #通知,
- restart vsftpd
- name: 启动vsftp服务,设置开机自启动
service: name=vsftpd state=started enabled=yes
handlers:
- name: restart vsftpd #接受通知,注意和上面的通知名一样!!!!
service: name=vsftpd state=restarted
playbook编排多个hosts任务
--- # ---代表开始(可选项,不写也可以)
- hosts: 10.1.1.12
remote_user: root
tasks:
- name: 创建/test1/目录
file: path=/test1/ state=directory
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
- hosts: 10.1.1.13
remote_user: root
tasks:
- name: 创建/test2/目录
file: path=/test2/ state=directory
... # ...代表结束(可选项,不写也可以)
案例: 编排nfs搭建与客户端挂载⭐⭐⭐⭐⭐
-
nfs服务端:在nfs01上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody ,启动服务
-
nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)
#第1个里程碑-列出流程 服务端流程:
1. 部署nfs-utils,rpcbind
2. 修改配置文件
3. 创建共享目录并改所有者
4. 启动服务rpcbind,nfs(注意顺序)
客户端流程:
1. 安装nfs-utils
2. 挂载与永久挂载
#第2个里程碑-根据步骤流程模块
#第3个里程碑-书写剧本
---
- hosts: 172.16.1.31
tasks:
- name: 1.部署nfs-utils
yum:
name: rpcbind,nfs-utils
state: present
- name: 修改配置文件 /etc/exports
lineinfile:
path: /etc/exports
line: "/backup-nfs 172.16.1.0/24(rw,all_squash)"
create: true
- name: 创建共享目录,改所有者
file:
path: /backup-nfs
owner: nfsnobody
group: nfsnobody
state: directory
- name: 启动服务rpcbind,nfs
systemd:
name: rpcbind
enabled: true
state: started
- name: 启动服务nfs
systemd:
name: nfs
enabled: true
state: started
- hosts: 172.16.1.7
tasks:
- name: 安装nfs-untils
yum:
name: rpcbind,nfs-utils
state: present
- name: 创建目录
file:
path: /ans-upload
state: directory
- name: 挂载与永久挂载
mount:
src: 172.16.1.31:/backup-nfs
path: /ans-upload
fstype: nfs
state: mounted
针对多个任务的拆分
--- # ---代表开始(可选项,不写也可以)
- hosts: 172.16.3.9
remote_user: root
tasks:
- include_tasks: 061.yml
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
- hosts: 172.16.3.51
remote_user: root
tasks:
- include_tasks: 062.yml
#子文件
[root@m01 playbook]# cat 061.yml
- name: 创建/test1/文件
file: path=/tmp/file666 state=touch
[root@m01 playbook]# cat 062.yml
- name: 创建/test22/目录
file: path=/test22/ state=directory
总结
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的“描述”,通过执行“剧本”的内容,让受控主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列ad-hoc模块操作已将,playbook是将该一系列操作组合起来,统一完成操作。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)