playbook使用

Posted 爱敲代码的三毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了playbook使用相关的知识,希望对你有一定的参考价值。

文章目录


接上一篇文章ansible环境搭建

一、playbook

playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。使用的格式为yaml格式
文档

1. YMAL格式

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实现

  1. 配置yum
  2. 安装vsftpd包
  3. 修改配置文件(要求拒绝匿名用户登录)
  4. 启动服务并实现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

需定制三个角色: httpd,mysql,php

第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使用的主要内容,如果未能解决你的问题,请参考以下文章

人人都会设计模式:观察者模式--Observer

观察者模式与事件委托

ansible playbook实践-yaml文件写法

Ansible之roles使用

Spring Cloud Kubernetes:等待通知者缓存准备就绪的超时

Spring 由缓存切点驱动的通知者