Ansible playbook及 示例

Ansible-playbook 介绍

Playbook 是由一个或多个 play组成的列表,主要功能是将task定义好的角色归并为一组进行统一管理,也就是通过task调用Ansible的模板将多个play组织在一个Playbook中运行

Playbooks本身由以下各部分组成

(1) Tasks:任务,即调用模块完成的某操作

(2) Variables:变量

(3) Templates:模板

(4) Handlers:处理器,当某条件满足时,触发执行的操作

(5) Roles:角色

Hosts和Uses介绍

Playbook的设计目的是为了让某个或某些主机以某个用户的身份去执行相应的任
务。其中用于指定要执行指定任务的主机用 hosts定义,可以是一个主机也可以是由冒
号分隔的多个主机组;用于指定被管理主机上执行任务的用户用 remote user来定义。

- hosts: webserver               ##指定主机组,可以是一个或多个组。
  remote_user: root                ##指定远程主机执行的用户名

任务列表 和 action介绍

Play的主体是任务列表。任务列表中的任务按照次序逐个在hosts中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务
回滚,因此,需要在更正 Playbook中的错误后重新执行这些任务
task的任务是按照指定的参数去执行模块。每个task都使用name输出 Playbook
的运行结果,一般输出内容为描述该任务执行的步骤,如果没有提供将输出 action的
运行结果。
定义task的格式可以用 action: module options或 module: options,其中后者可以实
现向后兼容。如果 action的内容过多,可在行首使用空白字符进行换行。

示例

- hosts: abc
  remote_user: root
  tasks:
   - name: disable selinux
     command: '/sbin/setenforce 0'    ##关闭selinux
   - name: make sure apache is running
     service: name=httpd state=started    ##开启httpd服务

##play中只要执行命令的返回值不为0,就会报错,tasks停止
加上下面这句话 可以强制执行
ignore_errors: True             ##忽略错误,强制返回成功

Handlers 介绍

Handlers用于当关注的资源发生变化时所采取的操作。在 notify中列出的操作便
称为 handler,也就是在notify中需要调用 handler中定义的操作。而 notify这个动作在
每个play的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。

示例

- hosts: abc
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest    ##按照最新版本的httpd服务
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf   ##配置文件
     notify:
      -restart httpd    ##调用名字为 restart httpd 的handler
   - name: start httpd service
     service: enabled=true name=httpd state=started   ## 开启httpd服务
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

Templates介绍

Jinja是基于 Python的模板引擎。 Template类是 Jinja的另一个重要组件,可以看
作是一个编译过的模板文件,用来产生目标文本,传递 Python的变量给模板去替换模
板中的标记。

示例

从被管理端复制一份httpd.conf到管理端
并做如下修改

vi templates/httpd.conf      

Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}

vi /etc/ansible/hosts
[aaa]
192.168.x.x http_port=192.168.x.x:80 access_num=100 server_name="www.aaa.com:80"
## 在hosts文件为主机配置变量

vi httpd.yml

- hosts: aaa
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest   ##安装最新版本的httpd
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf  ##使用模板并根据变量进行配置
      notify:
        - restart httpd   ##调用handler
    - name: start httpd server
      service: name={{service}} enabled=true state=started     ##开启服务
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

Tags 介绍

如果多次执行修改 Playbook 会涉及到一些没有变化的代码,可以使用tags让 用户选择跳过没有变化的代码。只运行Playbook中发生变化的部分代码。可以在Playbook中为某个或某些任务定义“标签”,在执行此Playbook时通过 ansible-playbook命令 使用 --tags 选项能实现仅运行指定的tasks。

示例

vi hosts.yml

- hosts: aaa
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/etc/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts state=touch

执行命令:ansible-playbook hosts.yml --tags="only"
会只执行标签为 only的任务

事实上,不光可以为单个或多个task指定同一个tags。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

如果在上面的yaml文件中添加
- name: touch file
      file: path=/opt/hosts state=touch
      tags:
      - always

执行命令:ansible-playbook hosts.yml --tags="only"
会将两个task都执行

Roles 介绍

Ansible为了层次化、结构化地组织 Playbook,使用了角色( roles),可以根据层
次结构自动装载变量文件、 tasks以及 handlers等。只需要在 Playbook中使用 include
指令即可使用 roles。简单来讲, roles就是通过分别将变量、文件、任务、模块及处理
器设置于单独的目录中,便捷地使用他们。

示例

本示例为:安装搭建LAMP架构

roles内各目录含义解释

files:用来存放由copy模块或script模块调用的文件。

templates:用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。

tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。

handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。

vars:此目录应当包含一个main.yml文件,用于定义此角色用到的变量。

defaults:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。

meta:此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。

在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,但不可以不创建。

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

在每个角色的handlers、tasks、meta、defaults、vars目录下创建main.yml文件,千万不能自定义。

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

------编写httpd模块------

vi /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version 
  yum: pkg={{ pkg }} state=latest

定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vi /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd

-------编写mysql模块-------

vi /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version 
  yum: pkg={{ pkg }} state=latest

vi /etc/ansible/roles/mysql/vars/main.yml
pkg: mariadb*

-------编写php模块-----

vi /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
  yum: pkg={{ pkg }} state=latest

vi /etc/ansible/roles/php/vars/main.yml
pkg: php*

-----编写roles示例-----
vi /etc/ansible/lamp.yml

- hosts: aaa
  remote_user: root
  roles:
   - httpd
   - mysql
   - php

猜你喜欢

转载自blog.51cto.com/13625924/2154950