1. playbook简介

playbook的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个个模块。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。

playbook 是一个 由 yaml 语法编写的文本文件,它由 playtask 两部分组成。

  • play : 主要定义要操作主机或者主机组
  • task :主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个任务(模块)

playbookad-hoc的主要区别如下:

    1. playbook 是对 AD-Hoc 的一种编排方式。
    1. playbook 可以持久运行,而 Ad-Hoc 只能临时运行。
    1. playbook 适合复杂的任务,而 Ad-Hoc 适合做快速简单的任务。
    1. playbook 能控制任务执行的先后顺序。

2. playbook编写规范

2.1 YAML语法规范

yaml的语法规范如下:

  • 在单一档案中,可用连续三个连字号"-"区分多个档案,也就是说在一个文件里可以写多个playbook。另外,还有选择性的连续三个点号“…”用来表示档案结尾,当文件只有一个playbook时,写上比较规范,不写也不会报错。

  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能,使用#号注释代码。

  • 短横线“-”表示列表项,使用一个短横杠加一个空格。

  • 缩进必须是统一的,不能空格和tab混用。

    缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。

  • YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感。

  • k/v的值可同行写也可换行写。同行使用:分隔。v可是个字符串,也可是另一个列表。

  • 以冒号结尾的除外,其他所有冒号后面所有必须有空格。

  • YAML文件扩展名通常为ymlyaml

2.2 YAML语法要素

YAML的语法要素:

  • 列表

    其所有元素均使用“-”打头,表示平级关系,示例:

    # A list of tasty fruits
    - Apple
    - Orange
    - Strawberry
    - Mango
  • 字典

    Dictionary,通常由多个keyvalue构成,类似于变量赋值,key相当于变量,value为值,只不过连接用冒号,示例:

    # An employee record
    name: Example Developer
    job: Developer
    skill: Elite

    也可以将key:value放置于{}中进行表示多个key:value,多个key:value使用逗号“,”隔开:示例:

    # An employee record
    {name: Example Developer,job: Developer,skill: Elite}
  • 列表和字典的结合使用:

    name: John Smith
    age: 41
    gender: Male spouse: <==字典嵌套,spouse:表示key
    name: Jane Smith <==name/age/gender三个字典为值
    age: 37
    gender: Female children: <==字典与列表嵌套
    - name: Jimmy Smith <==被嵌套的列表
    age: 17 <==列表内的字典
    gender: Male
    - name: Jenny Smith
    age: 13
    gender: Female

2.3 Playbook核心元素

  • Hosts

    执行的远程主机列表,Hostskey,其值为将来要执行的主机列表。

  • Tasks

    任务集。

  • Varniables

    内置变量或自定义变量在playbook中调用。

  • Templates (模板)

    可替换模板文件中的变量并实现一些简单逻辑的文件。

  • Handlers 和notity结合使用

    由特定条件触发的操作,满足条件方才执行,否则不执行。

  • tags (标签)

    指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

2.4 Playbook的基础组件

  • Hosts

    playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。

  • remote_user

    可用于Hosttask中。表示在远程的主机上以谁的身份去进行后面的任务。也可以指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

    - hosts: websrvs
    remote_user: root <==指定全局为root身份
    tasks:
    - name: test connection
    ping:
    remote_user: xu <==表示针对name这个模块使用xu
    sudo: yes <==默认sudo为root
    sudo_user:wang <==指定sudo切换时,使用wang
  • task列表

    play的主体部分是task list

    task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务。

    task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

    每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。

  • tasks:任务列表

    格式:

    action: module arguments
    action: command /sbin/setenforce 0
    module: arguments 建议使用
    command: /sbin/setenforce 0

    注意:

    • shellcommand模块后面跟命令,而非key=value

    • 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers(触发任务);

    • 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

3 Playbook编写示例

3.1 ansible部署NFS示例

  • 编写NFSplaybook文件:

    ---
    - hosts: 192.168.20.23
    remote_user: root tasks:
    - name: Install NFS Server
    yum:
    name: nfs-utils
    state: present - name: Configure NFS Server
    copy:
    src: conf/exports.j2
    dest: /etc/exports
    notify: Restrat NFS Service - name: Init NFS Server
    file:
    path: /data/nfs
    state: directory
    owner: “nginx”
    group: ”nginx“
    mode: "0644" - name: Start NFS service
    service:
    name: nfs
    state: started
    enabled: yes handlers:
    - name: Restrat NFS Service
    service:
    name: nfs
    state: restarted #NFS配置文件:
    [root@xuzhichao playbook]# cat conf/exports.j2
    /data/nfs 192.168.20.0/24(rw,all_squash,anonuid=887,anongid=887)
  • 检查文件语法:

    [root@xuzhichao playbook]# ansible-playbook install_nfs.yml --syntax-check
    playbook: install_nfs.yml
  • 运行playbook文件:

    #测试运行:
    [root@xuzhichao playbook]# ansible-playbook install_nfs.yml -C [root@xuzhichao playbook]# ansible-playbook install_nfs.yml PLAY [192.168.20.23] ***************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************
    ok: [192.168.20.23] TASK [Install NFS Server] ************************************************************************************************************************************
    ok: [192.168.20.23] TASK [Configure NFS Server] **********************************************************************************************************************************
    changed: [192.168.20.23] TASK [Init NFS Server] ***************************************************************************************************************************************
    changed: [192.168.20.23] TASK [Start NFS service] *************************************************************************************************************************************
    changed: [192.168.20.23] RUNNING HANDLER [Restrat NFS Service] ************************************************************************************************************************
    changed: [192.168.20.23] PLAY RECAP ***************************************************************************************************************************************************
    192.168.20.23 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 检查NFS服务情况:

    [root@xuzhichao playbook]# showmount -e 192.168.20.23
    Export list for 192.168.20.23:
    /data/nfs 192.168.20.0/24

3.2 ansible部署httpd示例

  • 编写httpdplaybook文件:

    [root@xuzhichao playbook]# cat install_httpd.yml
    ---
    - hosts: 192.168.20.23
    remote_user: root tasks:
    - name: Install Htttpd Server
    yum:
    name: httpd
    state: present - name: Configure Httpd Server
    copy:
    src: conf/httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
    owner: "root"
    group: "root"
    mode: "0644"
    notify: Restart Httpd Server - name: Init Httpd Server
    copy:
    src: file/test.html.j2
    dest: /var/www/html/test.html
    owner: "apache"
    group: "apache"
    mode: "0644" - name: Start Httpd Server
    service:
    name: httpd
    state: started
    enabled: yes handlers:
    - name: Restart Httpd Server
    service:
    name: httpd
    state: restarted
  • 编写httpd的配置文件和主页文件:

    #httpd的主页文件:
    [root@xuzhichao playbook]# cat file/test.html.j2
    ansible autodev web site #httpd的主配置文件:
    [root@xuzhichao playbook]# cat conf/httpd.conf.j2
    Listen 8000
  • 运行playbook

    [root@xuzhichao playbook]# ansible-playbook install_httpd.yml 
    
    PLAY [192.168.20.23] *****************************************************************************************************************************************
    
    TASK [Gathering Facts] ***************************************************************************************************************************************
    ok: [192.168.20.23] TASK [Install Htttpd Server] *********************************************************************************************************************************
    ok: [192.168.20.23] TASK [Configure Httpd Server] ********************************************************************************************************************************
    changed: [192.168.20.23] TASK [Init Httpd Server] *************************************************************************************************************************************
    ok: [192.168.20.23] TASK [Start Httpd Server] ************************************************************************************************************************************
    changed: [192.168.20.23] RUNNING HANDLER [Restart Httpd Server] ***********************************************************************************************************************
    changed: [192.168.20.23] PLAY RECAP ***************************************************************************************************************************************************
    192.168.20.23 : ok=6 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 测试httpd的运行情况:

    [root@xuzhichao playbook]# curl http://192.168.20.23:8000/test.html
    ansible autodev web site

ansible(19)--ansible的playbook的更多相关文章

  1. python3 ansible api 命令和playbook

    一.api代码 # coding: utf-8 import os import sys from collections import namedtuple from ansible.parsing ...

  2. ansible基础-ansible角色的使用

    ansible基础-ansible角色的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...

  3. ansible配置文件 ansible.cfg的一点说明

    ansible配置文件 ansible.cfg的一点说明 > ansible --version ansible 2.1.1.0 config file = /etc/ansible/ansib ...

  4. 什么是 Ansible - 使用 Ansible 进行配置管理

    [注]本文译自:https://www.edureka.co/blog/what-is-ansible/   Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...

  5. Ansible系列(五):playbook应用和roles自动化批量安装示例

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  6. Ansible系列(四):playbook应用和roles自动化批量安装示例

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...

  7. Ansible入门篇:playbook的使用

    playbooks介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在 ...

  8. Ansible 笔记 (3) - 编写 playbook

    playbook 相当于多个命令的编排组合然后一起运行,类似写脚本.在学习 playbook 之前需要了解 yaml 格式. 编写playbook的步骤: 定义主机与用户 编写任务列表 执行 play ...

  9. Ansible 书写我的playbook

    mysql 创建数据库 - hosts: localhost  remote_user: root  tasks: - name: test mysql    mysql_db:      name: ...

  10. ansible 常用模块和playbook

随机推荐

  1. 【已解决】ajax和flask路由传json格式数据出现undefined和object错误

    描述一下问题背景: 前台封装一个json字符串给后台传输数据,后台的ajax获取请求之后把接收的数据显示到前台html表格上. jsonify:这个方法可以把字典转化为json字符串 通过jsonif ...

  2. #线段树,树状数组#CodeChef Merciless Chef

    MLCHEF 分析 首先按照dfs序将子树转换为区间,其实就是区间减和区间维护最小值判断是否大于0 因为大于0一定最多只有 \(n\) 个,所以直接将一个数记录被删除并设为正无穷. 代码 #inclu ...

  3. 1.NCC算法实现及其优化[基础实现篇]

    NCC算法实现及其优化 本文将集中探讨一种实现相对简单,效果较好的模板匹配算法(NCC) \[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x', ...

  4. MogDB/openGauss访问控制简介

    MogDB/openGauss 访问控制简介 SQL 可以针对不同的数据库对象赋予不同的权限,这样就可以限制用户对数据的不必要访问,提高数据访问的安全性.常见的 SQL 权限如下: SELECT/UP ...

  5. openGauss/MogDB 学习笔记之 -- PITR恢复

    openGauss/MogDB 学习笔记之 -- PITR 恢复 概念描述 背景信息 当数据库崩溃或希望回退到数据库之前的某一状态时,MogDB 的即时恢复功能(Point-In-Time Recov ...

  6. css 你真的了解padding吗?

    前言 padding 简写属性在一个声明中设置所有内边距属性,实际上在使用过程中它对block元素和内联元素的处理是不一样的. 正文 对于block元素 如果宽度非auto那么容器会变大,如果容器宽度 ...

  7. 使用Oracle SQL Developer工具完成Mariadb数据库迁移到Oracle数据库

    Oracle SQL Developer 是一个免费的集成开发环境,简化了传统部署和云部署中 Oracle 数据库的开发和管理.SQL Developer 提供完整的端到端的 PL/SQL 应用开发, ...

  8. 力扣350(java&python)-两个数组的交集 II(简单)

    题目: 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集.返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值).可以不 ...

  9. 牛客网-SQL专项练习2

    ①从学生信息表(student)中提取姓名(name)列值为NULL的记录,SQL语句为: 解析:注意不是只查name值,而是查name值为空的所有信息 SQL语句为: SELECT * FROM s ...

  10. 力扣190(java)-颠倒二进制位(简单)

    题目: 颠倒给定的 32 位无符号整数的二进制位. 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型.在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论 ...