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

原文地址:http://blog.51cto.com/13625924/2154950

时间: 2024-10-18 10:54:01

Ansible playbook及 示例的相关文章

自动化运维工具ansible playbook和roles的使用

ansible的结构: Inventory 用来定义被控制端 Modules 定义被控制端可用的操作 Ad Hoc Commands 定义被控制端可以执行命令的 Playbook 批量运行的方式 Tasks: 任务:由各模块所支持执行的特定操作:可以通过ansible-doc module_name来查看帮助文档,非常详细 -m  user -a 'name= password=' Variables: 变量 Templates: 模板:(如执行httpd服务时,各节点上httpd的配置文件内容

ansible playbook使用总结

Ansible playbook的使用 playbooks概念 task: 任务:使用各模块所执行的特性操作任务,比如:-m user -a 'name= password=' Variables: 变量: Templates: 模板 在定义模板后可以实现各节点对应的变量来取代,表达式自身会根据当前节点所赋值做运算,之后生成的值则赋予这个参数,用于生产不同配置的配置文件,所以模板主要实现配置不同场景文本文件 而且这种使用模板语言来定义 模板语言中可以根据定义替换成特定主机的某些值 handler

Ansible PlayBook语法(4)

title: Ansible PlayBook语法(4) date: 2018-12-02 10:53:24 tags: Ansible categories: Ansible copyright: true --- Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署

运维自动化之ansible playbook一键化解决大量主机bash更新问题

今天发现有bash漏洞,但我这里近1000台服务器,为了方便.省时间,觉得使用ansible安装bash更新包,下面分享一下我的安装方法. 1.安装的playbook的内容 19:00:03 # cd /etc/ansible [email protected]:/etc/ansible 19:00:06 # cat update_bash.yml  --- - hosts: "{{ host }}"   remote_user: "{{ user }}"   ga

ansible playbook yummodule error

ansible playbookweb.yaml[[email protected] Desktop]# cat web.yaml- name: web servers  remote_user: root  hosts: webservers tasks:  - name: install httpd    yum: name=httpd state=present  - name: httpd service     service: name=httpd enabled=yes state

运维自动化之ansible playbook安装mysql

上次介绍了如何使用ansible playbook安装zabbix客户端(http://dl528888.blog.51cto.com/2382721/1436745),这次介绍一下如何使用playbook安装mysql. 下面是安装mysql的信息: mysql_basedir: /data/mysql/basedir                    源码目录 mysql_datadir: /data/mysql/datadir                    数据目录 mysql

Ansible playbook API 开发 调用测试

Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发. 随笔的内容分为三个部分 playbook编辑执行 python 调用API执行playbook java调用python程序进行playbook的执行 实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79 一.playboo

运维自动化之ansible playbook安装ruby环境

本来不想打算写安装ruby的,但看几个puppet的群里有人对安装ruby比较茫然,所以这里简单介绍一下如何安装ruby. ps:话说现在也就gitlab.capistrano.puppet等软件使用ruby,最新2010年的软件好的都是python了,比如ansible.salt等. 下面是安装ruby的信息: ruby_version: 1.9.3 ruby_dir: /usr/local gem_version: 1.8.23 bundle_version: 1.6.3 可以看到ruby的

Ansible Playbook - Understanding YAML

要想用Ansible操作复杂的任务,就必须要学会YAML语法的书写,不光是Ansible,连他的竞争对手saltstack也使用了YAML,下面来学习一下YAML语法的格式,省得到要你写个Playbook的时候手忙脚乱的要好. 引用一下维基:YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递回缩写.在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语