第三章·自动化运维工具-Ansible playbook

Ansible PlayBook基本概述

什么是playbook

playbook即"剧本",playbook是由以下部分组成的

  • play:定义的是主机的角色
  • task:定义的是具体执行的任务
  • playbook:是由一个或多个play组成,一个play可以包含多个task

简单理解为:使用不同的模块完成一件事情

在Ansible中"剧本文件"是以yml结尾的文件。

在SaltStack中"剧本文件"是以sls结尾的文件。

但是语法,使用的都是yaml语法

file

PlayBook与ad-hoc

1.PlayBook功能比ad-hoc更全,是对ad-hoc的一种编排.

2.PlayBook能很好的控制先后执行顺序, 以及依赖关系.

3.PlayBook语法展现更加的直观.

4.playbook可以持久使用,ad-hoc无法持久使用.

Yaml语法

语法 描述
缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB
冒号 以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表
- hosts: web_group          ## play部分,指定要执行的主机
remote_user: root           ## 以root身份执行 (默认)
tasks:                      ## 定义任务
- name: install httpd and php ## 给任务起名
yum:                        ## 模块
- httpd                     ## 动作
- php
- name: configure httpd conf
copy:
src: /root/web/httpd.conf
dest: /etc/httpd/conf

PlayBook部署httpd

安装httpd

# 1.创建工作目录
[root@m01 ~]# mkdir /root/ansible
# 2.编写httpd剧本
[root@m01 ansible]# vim httpd.yml
- hosts: web_group
  tasks:
  - name: Install httpd
    yum:
    name: httpd
    state: present

# 3.执行剧本
[root@m01 ansible]# ansible-playbook httpd.yml

## 检测剧本语法
[root@m01 ansible]# ansible-playbook --syntax-check httpd.yml

## 检测剧本语法
[root@m01 ansible]# ansible-playbook --syntax-check httpd.yml

启动httpd并加入开机自启

- hosts: web_group
  tasks:
- name: Install httpd
  yum:
    name: httpd
    state: present

- name: Start httpd Service
  service:
    name: httpd
    state: started
    enabled: True

编写http前端页面

[root@m01 ansible]# cat httpd.yml
- hosts: web_group
  tasks:
  - name: Install httpd
    yum:
      name: httpd
      state: present

  - name: Start httpd Service
    service:
      name: httpd
      state: started
      enabled: True

  - name: Set Web Index
    copy:
      content: lw_http_web
      dest: /var/www/html/index.html

不同的主机配置不同的网站

目前来说,想要根据不同主机配置不同的网站,我们可以使用多个play的方式,但是在生产环境中,我们需要写循 环,来满足我们的需求,多个play了解即可

[root@m01 ansible]# cat httpd.yml
- hosts: web_group
  tasks:
  - name: Install httpd
    yum:
      name: httpd
      state: present

  - name: Start httpd Service
    service:
      name: httpd
      state: started
      enabled: True

- hosts: web01
  tasks:
  - name: Set Web01 Index
    copy:
      content: lw_http_web01
      dest: /var/www/html/index.html

- hosts: web02
  tasks:
  - name: Set Web01 Index
    copy:
      content: lw_http_web02
      dest: /var/www/html/index.html

PlayBook实战

环境准备

主机名 WanIP LanIP 服务
m01 10.0.0.61 172.16.1 Ansible
nfs 10.0.0. 172.16.1 nfs服务端
web01 10.0.0. 172.16.1 nfs客户端
web02 10.0.0. 172.16.1 nfs客户端

部署nfs

#编辑Ansible Inventory
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[backup_group]
backup ansible_ssh_host=10.0.0.41

[nfs_group]
nfs ansible_ssh_host=10.0.0.31

[nfs_all:children]
web_group
nfs_group

#创建项目存放目录
[root@m01 ~]# mkdir nfs

#准备nfs配置文件
[root@m01 ~]# cat /root/nfs/nfs.j2
/data 10.0.0.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@m01 ~]# vim /root/nfs/nfs.yml
- hosts: nfs_all
  tasks:

#安装nfs
    - name: Install nfs-utils
      yum:
        name: nfs-utils
        state: present

#创建www组
    - name: Create www Group
      group:
        name: www
        gid: 666

#创建www用户
    - name: Create www User
      user:
        name: www
        group: www
        uid: 666
        create_home: false
        shell: /sbin/nologin

- hosts: nfs
  tasks:

#推送配置文件
    - name: Scp NFS Server
      copy:
        src: ./nfs.j2
        dest: /etc/exports
        owner: root
        group: root
        mode: 0644

#创建挂载目录并授权
    - name: Create data Directory
      file:
        path: /data
        state: directory
        owner: www
        group: www
        mode: 0755
        recurse: yes

#启动nfs-server
    - name: Start NFS Server
      systemd:
        name: nfs-server
        state: started
        enabled: yes

#web01和web02挂载目录
- hosts: web_group
  tasks:
    - name: Mount NFS Server
      mount:
        path: /opt
        src: 10.0.0.31:/data
        fstype: nfs
        opts: defaults
        state: mounted

#检查语法
[root@m01 ~]# ansible-playbook --syntax-check /root/nfs/nfs.yml
playbook: /root/nfs/nfs.yml

#执行
[root@m01 ~]# ansible-playbook /root/nfs/nfs.yml

环境准备

主机名 WanIP LanIP 服务
m01 10.0.0.61 172.16.1.61 Ansible
web01 10.0.0.7 172.16.1.7 nfs客户端
web02 10.0.0.8 172.16.1.8 nfs客户端

#创建项目目录
[root@m01 ~]# cd lamp/

#编辑Inventory
[root@m01 lamp]# cat /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[backup_group]
backup ansible_ssh_host=10.0.0.41

[backup_all:children]
web_group
backup_group

[nfs_group]
nfs ansible_ssh_host=10.0.0.31

[nfs_all:children]
web_group
nfs_group
[root@m01 ~]# vim /root/lamp/lamp.yml
- hosts: web_group

  tasks:

#安装指定服务
    - name: Install httpd  mariadb php Server
      yum:
        name: "{{ packages }}"
      vars:
        packages:
        - httpd
        - mariadb-server
        - php
        - php-mysql
        - php-pdo

#启动httpd服务
    - name: Start httpd Server
      systemd:
        name: httpd
        state: started
        enabled: yes

#启动mariadb服务
    - name: Start httpd Server
      systemd:
        name: mariadb
        state: started
        enabled: yes

#下载wordpress
    - name: Get WordPress Package
      get_url:
        url: "http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz"
        dest: /var/www/html

#解压wordpress
    - name: Unarchive WordPress Package
      unarchive:
        src: /var/www/html/wordpress-5.0.3-zh_CN.tar.gz
        dest: /var/www/html
        copy: no

#检查语法
[root@m01 lamp]# ansible-playbook --syntax-check /root/lamp/lamp.yml

playbook: /root/lamp/lamp.yml

#执行
[root@m01 lamp]# ansible-playbook  /root/lamp/lamp.yml

山林不向四季起誓 荣枯随缘