playbook使用
Posted 爱敲代码的三毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了playbook使用相关的知识,希望对你有一定的参考价值。
文章目录
接上一篇文章ansible环境搭建
一、playbook
playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。使用的格式为yaml格式
文档
1. YMAL格式
- 以
.yaml
或者.yml
结尾 - 以#号开头为注释
- 列表中的所有成员都开始于相同的缩进级别, 并且使用一个
"- "
作为开头(一个横杠和一个空格) - 一个字典是由一个简单的
键: 值
的形式组成(这个冒号后面必须是一个空格) - 注意: 写这种文件不要使用tab键,都使用空格
简单示例
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
2. Playbook常见语法
hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.
remote_user: 用于指定远程主机上的执行任务的用户.
- hosts: group1
remote_user: root
tasks: 任务列表, 按顺序执行任务.
如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.
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
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
3. playbook示例
第一步:创建一个存放playbook的目录
[root@master ~]# mkdir /etc/ansible/playbook -p
第二步:准备httpd配置文件,并修改成想要的配置
yum install httpd -y
第3步: 写一个playbook文件(后缀为.yml或.yaml)
---
# vim /etc/ansible/playbook/example.yaml
---
- hosts: group1
remote_user: root
tasks:
- name: 安装apache
yum: name=httpd,httpd-devel state=latest
- name: 编写apache配置文件
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: 重启apache
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
第4步: 执行写好的palybook
[root@master ~]# ansible-playbook /etc/ansible/playbook/example.yaml
第5步:修改apache端口号为8080,在执行playbook
[root@master ~]# vim /etc/httpd/conf/httpd.conf
4. playbook编排vsftp
写一个playbook实现
- 配置yum
- 安装vsftpd包
- 修改配置文件(要求拒绝匿名用户登录)
- 启动服务并实现vsftpd服务开机自动启动
在master上安装vsftpd
# yum -y install vsftpd
---
- hosts: group1
remote_user: root
tasks:
- name: rm yum repository
file: path=/etc/yum.repos.d/ state=absent
- name: 同步master上的yum源到group1组
copy: src=/etc/yum.repos.d dest=/etc/
- name: 同步vsftp配置文件
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: 重启vsftpd服务
service: name=vsftpd state=restarted
# 执行
[root@master ~]# ansible-playbook /etc/ansible/playbook/vsftp.yaml
5. playbook编排多个hosts任务
在master上准备nfs配置文件
# vim /etc/exports
/share *(ro)
# vim /etc/ansible/playbook/nfs.yml
---
- hosts: 192.168.44.20
remote_user: root
tasks:
- name: 安装nfs服务相关软件包
yum: name=nfs-utils,rpcbind,setup state=latest
- name: 创建文件共享目录
file: path=/share/ state=directory
- name: 同步nfs配置文件
copy: src=/etc/exports dest=/etc/exports
notify: restart nfs
- name: 启动rpcbind服务,并设置开机自启
service: name=rpcbind state=started enabled=on
- name: 启动nfs服务,并设置开机自启
service: name=rpcbind state=started enabled=on
handlers:
- name: restart nfs
service: name=nfs state=restarted
- hosts: 192.168.44.30
remote_user: root
tasks:
- name: 安装nfs客户端软件包
yum: name=nfs-utils state=latest
- name: 挂载nfs服务器的共享
shell: mount 192.168.44.20:/share /mnt
执行playbook
# ansible-playbook /etc/ansible/playbook/nfs.yaml
二、roles
roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制
1. 创建roles的目录结构
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
注意:** 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.
2. 通过roles实现lamp
第1步: 创建roles目录及文件,并确认目录结构
[root@master ~]# cd /etc/ansible/roles/
[root@master ~]# mkdir -p httpd,mysql,php/files,tasks,handlers,templates,vars,meta
[root@master ~]# touch httpd,mysql,php/tasks,handlers,vars,meta/main.yml
[root@master roles]# yum install tree -y
[root@master roles]# tree /etc/ansible/roles/
/etc/ansible/roles/
├── httpd
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── mysql
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
│ └── main.yml
└── php
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
第2步: 准备httpd服务器的主页文件,php测试页和配置文件等
[root@master roles]# echo "test main page" > vim /etc/ansible/roles/httpd/file/index.html
[root@master roles]# echo -e "<?php\\n\\tphpinfo();\\n?>" > /etc/ansible/roles/httpd/file/test.php
yum install httpd -y
按需求修改配置文件后,拷贝到httpd角色目录里的file子目录
[root@master roles]# vim /etc/httpd/conf/httpd.conf
[root@master roles]# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/file/
第3步: 编写httpd角色的main.yml文件
[root@master tasks]# vim /etc/ansible/roles/httpd/tasks/main.yml
---
- name: 安装httpd
yum: name=httpd,httpd-devel state=present
- name: 同步httpd配置文件
copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: 同步主页文件
copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html
- name: 同步php测试页
copy: src=/etc/ansible/roles/httpd/files/test.php dest=/var/www/html/test.php
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
第4步: 编写httpd角色里的handler
master# vim /etc/ansible/roles/httpd/handlers/main.yml
---
- name: restart httpd
service: name=httpd state=restarted
第5步: 编写mysql角色的main.yml文件
[root@master tasks]# vim /etc/ansible/roles/mysql/tasks/main.yml
---
- name: 安装mysql
yum: name=mariadb,mariadb-server,mariadb-devel state=present
- name: 启动mysql并开机自启动
service: name=mariadb state=started enabled=yes
第6步: 编写php角色的main.yml文件
master# vim /etc/ansible/roles/php/tasks/main.yml
---
- name: 安装php及依赖包
yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present
notify: restart httpd
第7步:编写lamp的playbook文件调用前面定义好的三个角色
master# vim /etc/ansible/playbook/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
第8步: 执行lamp的playbook文件
master# ansible-playbook /etc/ansible/playbook/lamp.yaml
以上是关于playbook使用的主要内容,如果未能解决你的问题,请参考以下文章