1、https://blog.csdn.net/zfw_666666/article/details/124691877

1.Playbook介绍
        Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用。
        Playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
        上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

2.Playbook核心元素
Hosts :执行的远程主机列表
Tasks :任务集
Varniables :内置变量或自定义变量在playbook中调用
Templates :模板,即使用模板语法的文件,比如配置文件等
Handlers :和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags :标签,指定某条任务执行,用于选择运行playbook中的部分代码。

3.Playbook语法
①playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。
②在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
③次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
④使用#号注释代码。
⑤缩进必须统一,不能空格和tab混用。
⑥缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
⑦YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感。
⑧k/v的值可同行写也可以换行写。同行使用:分隔,v可以是个字符串,也可以是一个列表。
⑨一个完整的代码块功能需要最少元素包括 name: task。

4.Playbook的运行方式
通过ansible-playbook命令运行
格式:ansible-playbook <filename.yml> ... [options]
[root@ansible PlayBook]# ansible-playbook -h
#ansible-playbook常用选项:
--check  or -C    #只检测可能会发生的改变,但不真正执行操作
--list-hosts      #列出运行任务的主机
--list-tags       #列出playbook文件中定义所有的tags
--list-tasks      #列出playbook文件中定义的所以任务集
--limit           #主机列表 只针对主机列表中的某个主机或者某个组执行
-f                #指定并发数,默认为5个
-t                #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v                #显示过程  -vv  -vvv更详细
5.Playbook中元素属性
①主机与用户
在一个playbook开始时,最先定义的是要操作的主机和用户

    - hosts: 192.168.1.31
      remote_user: root

除了上面的定义外,还可以在某一个tasks中定义要执行该任务的远程用户
tasks:

  - name: run df -h
    remote_user: test
    shell: name=df -h

还可以定义使用sudo授权用户执行该任务

tasks:
  - name: run df -h
    sudo_user: test
    sudo: yes
    shell: name=df -h
②tasks任务列表
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,
如果没有定义name,action的值将会用作输出信息中标记特定的task。

每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,
在hosts中定义的主机或者主机组都将会执行这个被定义的tasks。

tasks:
  - name: create new file
    file: path=/tmp/test01.txt state=touch
  - name: create new user
    user: name=test001 state=present
③Handlers与Notify
很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;
(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次。

[root@ansible ~]# cat httpd.yml
#用于安装httpd并配置启动
---
- hosts: 192.168.1.31
  remote_user: root
 
  tasks:
  - name: install httpd
    yum: name=httpd state=installed
  - name: config httpd
    template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
      - restart httpd
  - name: start httpd
    service: name=httpd state=started
 
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify

6.PlayBook中变量的使用
环境说明:这里配置了两个组,一个apache组和一个nginx组

[root@ansible PlayBook]# cat /etc/ansible/hosts
[apache]
192.168.1.36
192.168.1.33
 
[nginx]
192.168.1.3[1:2]
①命令行指定变量
执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量

[root@ansible PlayBook]# cat variables.yml
- hosts: all
  remote_user: root        
  tasks:
    - name: install pkg
      yum: name={{ pkg }}
#执行playbook 指定pkg

 [root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml
②hosts文件中定义变量
在/etc/ansible/hosts文件中定义变量,可以针对每个主机定义不同的变量,也可以定义一个组的变量,然后直接在playbook中直接调用。注意,组中定义的变量没有单个主机中的优先级高。

# 编辑hosts文件定义变量

[root@ansible PlayBook]# vim /etc/ansible/hosts
[apache]
192.168.1.36 webdir=/opt/test     #定义单个主机的变量
192.168.1.33
[apache:vars]                     #定义整个组的统一变量
webdir=/web/test
 
[nginx]
192.168.1.3[1:2]
[nginx:vars]
webdir=/opt/web
# 编辑playbook文件

[root@ansible PlayBook]# cat variables.yml
---
- hosts: all
  remote_user: root
 
  tasks:
    - name: create webdir
      file: name={{ webdir }} state=directory   #引用变量
# 执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml
③playbook文件中定义变量
编写playbook时,直接在里面定义变量,然后直接引用,可以定义多个变量;注意:如果在执行playbook时,又通过-e参数指定变量的值,那么会以-e参数指定的为准。

# 编辑playbook

[root@ansible PlayBook]# cat variables.yml
---
- hosts: all
  remote_user: root
  vars:                #定义变量
    pkg: nginx         #变量1
    dir: /tmp/test1    #变量2
 
  tasks:
    - name: install pkg
      yum: name={{ pkg }} state=installed    #引用变量
    - name: create new dir
      file: name={{ dir }} state=directory   #引用变量
# 执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml
# 如果执行时候又重新指定了变量的值,那么会已重新指定的为准

[root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml
④调用setup模块获取变量
 setup模块默认是获取主机信息的,有时候在playbook中需要用到,所以可以直接调用。常用的参数参考

# 编辑playbook文件

[root@ansible PlayBook]# cat variables.yml
---
- hosts: all
  remote_user: root
 
  tasks:
    - name: create file
      file: name={{ ansible_fqdn }}.log state=touch   #引用setup中的ansible_fqdn
# 执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml
⑤独立的变量YAML文件中定义
为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,laybook文件直接引用文件调用变量即可。

# 定义存放变量的文件

[root@ansible PlayBook]# cat var.yml
var1: vsftpd
var2: httpd
# 编写playbook

[root@ansible PlayBook]# cat variables.yml
---
- hosts: all
  remote_user: root
  vars_files:    #引用变量文件
    - ./var.yml   #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)
 
  tasks:
    - name: install package
      yum: name={{ var1 }}   #引用变量
    - name: create file
      file: name=/tmp/{{ var2 }}.log state=touch   #引用变量
# 执行playbook

[root@ansible PlayBook]# ansible-playbook  variables.yml
7.Playbook中标签的使用
一个playbook文件中,执行时如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行,

还可以通过--skip-tags选择除了某个标签外全部执行等。

# 编辑playbook

[root@ansible PlayBook]# cat httpd.yml
---
- hosts: 192.168.1.31
  remote_user: root
 
  tasks:
    - name: install httpd
      yum: name=httpd state=installed
      tags: inhttpd
 
    - name: start httpd
      service: name=httpd state=started
      tags: sthttpd
 
    - name: restart httpd
      service: name=httpd state=restarted
      tags:
        - rshttpd
        - rs_httpd
<1>通过-t选项指定tags进行执行(通过-t指定tags名称,多个tags用逗号隔开)

[root@ansible PlayBook]# ansible-playbook -t rshttpd httpd.yml
<2>通过--skip-tags选项排除不执行的tags

[root@ansible PlayBook]# ansible-playbook --skip-tags inhttpd httpd.yml
8.Playbook中模板的使用
template模板为我们提供了动态配置服务,使用jinja2语言,里面支持多种条件判断、循环、逻辑运算、比较操作等。其实说白了也就是一个文件,

和之前配置文件使用copy一样,只是使用copy,不能根据服务器配置不一样进行不同动态的配置。这样就不利于管理。

说明:

1、多数情况下都将template文件放在和playbook文件同级的templates目录下(手动创建),这样playbook文件中可以直接引用,会自动去找这个文件。如果放在别的地方,也可以通过绝对路径去指定。
2、模板文件后缀名为.j2。

示例:通过template安装httpd

<1>playbook文件编写

[root@ansible PlayBook]# cat testtmp.yml
#模板示例
- hosts: all
  remote_user: root
  vars:
    - listen_port: 88    #定义变量
 
  tasks:
    - name: Install Httpd
      yum: name=httpd state=installed
    - name: Config Httpd
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf    #使用模板
      notify: Restart Httpd
    - name: Start Httpd
      service: name=httpd state=started
      
  handlers:
    - name: Restart Httpd
      service: name=httpd state=restarted
<2>模板文件准备,httpd配置文件准备,这里配置文件端口使用了变量

[root@ansible PlayBook]# cat templates/httpd.conf.j2 |grep ^Listen
Listen {{ listen_port }}
<3>查看目录结构

# 目录结构
    [root@ansible PlayBook]# tree .
    .
    ├── templates
    │   └── httpd.conf.j2
    └── testtmp.yml
    
    1 directory, 2 files
<4>执行playbook

9.playbook条件语句 ---(when)
条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用条件测试,通过when语句执行,在task中使用jinja2的语法格式

when语句:

在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法。

tasks:
  - name: "shut down CentOS 6 systems"
    command: /sbin/shutdown -t now
    when:
      - ansible_facts['distribution'] == "CentOS"
      - ansible_facts['distribution_major_version'] == "6"
条件运算:

tasks:
  - shell: echo "only on Red Hat 6, derivatives, and later"
    when: ansible_facts['os_family'] == "RedHat" and ansible_facts['lsb']['major_release']|int >= 6
rsync服务端推送配置文件:

[root@m01 ~]# cat rsyncd/rsyncd.yml
- hosts: rsync_server
  tasks:
    - name: Install Rsyncd Server
      yum:
        name: rsync
        state: present
 
    - name: Create www Group
      group:
        name: www
 
        gid: 666
    - name: Create www User
      user:
        name: www
        group: www
        uid: 666
        create_home: false
        shell: /sbin/nologin
 
    - name: Scp Rsync Config
      copy:
        src: ./rsyncd.j2
        dest: /etc/rsyncd.conf
        owner: root
        group: root
        mode: 0644
      when: ansible_hostname == "backup"
 
    - name: Create Passwd File
      copy:
        content: 'rsync_backup:123'
        dest: /etc/rsync.passwd
        owner: root
        group: root
        mode: 0600
      when: ansible_hostname == "backup"
 
    - name: Create backup Directory
      file:
        path: /backup
        state: directory
        mode: 0755
        owner: www
        group: www
        recurse: yes
      when: ansible_hostname == "backup"
 
    - name: Start Rsyncd Server
      systemd:
        name: rsyncd
        state: started
      when: ansible_hostname == "backup"
rsync客户端推送脚本:

[root@m01 ~]# vim rsync.yml
- hosts: rsync_server
  tasks:
    - name: SCP Backup Shell
      copy:
        src: ./backup.sh
        dest: /root/backup.sh
      when: ansible_hostname is match "web*"
通过register将命令执行结果保存至变量,然后通过when语句进行判断

- hosts: web_group
  tasks:
    - name: Check Httpd Server
      command: systemctl is-active httpd
      ignore_errors: yes
      register: check_httpd
 
    - name: debug outprint
      debug: var=check_httpd
 
    - name: Httpd Restart
      service:
        name: httpd
        state: restarted
      when: check_httpd.rc == 0
10.playbook循环语句 --- (item)
with_items迭代,当有需要重复性执行的任务时,可以使用迭代机制。

对迭代项的引用,固定变量名为“item”,要在task中使用with_items给定要迭代的元素列表。

列表格式:

             字符串
             字典

示例1:通过with_items安装多个不同软件

[root@ansible PlayBook]# cat testwith.yml
# 示例with_items
---
- hosts: all
  remote_user: root
 
  tasks:
    - name: Install Package
      yum: name={{ item }} state=installed   #引用item获取值
      with_items:     #定义with_items
        - httpd
        - vsftpd
        - nginx
示例2:通过嵌套子变量创建用户并加入不同的组

[root@ansible PlayBook]# cat testwith01.yml
# 示例with_items嵌套子变量
---
- hosts: all
  remote_user: root
 
  tasks:
    - name: Create New Group
      group: name={{ item }} state=present
      with_items:
        - group1
        - group2
        - group3
 
    - name: Create New User
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
        - { name: 'user1', group: 'group1' }
        - { name: 'user2', group: 'group2' }
        - { name: 'user3', group: 'group3' }
11.playbook判断语句 --- (for if)
#循环表达式

{% for i in EXPR %}
{% endfor %}
#条件判断

{% if EXPR %}
{% elif EXPR %}
{% else %}
{% ednif %}
 #注释

{# COMMENT #}
官方示例:

1.编辑playbook

[root@m01 ~]# vim jinja2.yml
    - hosts: web_group
      tasks:
        - name: Copy Template File
          template:
            src: ./motd.j2
            dest: /etc/motd
2.准备motd.j2文件

[root@m01 ~]# vim motd.j2
    Welcome to {{ ansible_fqdn }}
    This system total mem is : {{ ansible_memtotal_mb }} MB
    This system free mem is: {{ ansible_memfree_mb }} MB
3.执行playbook

#查看结果
[root@m01 ~]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to web01
This system total mem is : 1982 MB
This system free mem is: 1106 MB
 
web02 | CHANGED | rc=0 >>
Welcome to web02
This system total mem is : 1982 MB
This system free mem is: 1096 MB
文章知识点
————————————————
版权声明:本文为CSDN博主「CN-FuWei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zfw_666666/article/details/124691877

Ansible之Playbook介绍和使用的更多相关文章

  1. ansible核心模块playbook介绍

    ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述.yaml之于json就像markdown之于html一样,极度简化了json的书写.在学习ansible pla ...

  2. Ansible(三) - playbook简介

    Ⅰ. Playbook介绍 Playbook其实就是ansible的一个任务列表,各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在顺序运行某playb ...

  3. devops工具-Ansible进阶playbook&roles

    一.playbook介绍     playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...

  4. Ansible之playbook的使用总结 - 运维笔记

    之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...

  5. ansible的playbook剧本

    一.playbook剧本介绍 1)playbook介绍 Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansibl ...

  6. 自动化运维工具——ansible剧本playbook(三)

    一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...

  7. Ansible之playbook的使用

    playbook介绍 一. 为什么引入playbook 我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成.而playbook就是组织多个 ...

  8. 利用ansible书写playbook搭建HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境续

    ansible.playbook.haproxy.keepalived.PXC haproxy+keepalived双主模式调度pxc集群 HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机 ...

  9. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  10. Ansible常用模块介绍及使用(week5_day1_part2)--技术流ken

    Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)--技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几 ...

随机推荐

  1. nuxt项目中使用store

    首先初始化创建一个nuxt项目 nuxt项目创建以后,内部已自动集成store,所以无需再单独安装和引入 在根目录的store文件夹下新建文件,例如home.js //home.js export c ...

  2. 【C学习笔记】day2-3 求10 个整数中最大值

    #include <stdio.h>#define n 10 int main() { int max=0; int a[n] = {12,15,16,546,165,654,612,23 ...

  3. bean依赖注入三种方式

    bean依赖注入的三种方式如下: 1.构造方法注入 2.set方法注入 3.P命名空间注入 此处演示的项目结构如下: 方法一: 构造方法注入 UserDaoImpl.java public class ...

  4. XSStrike-20220320

    Usage: xsstrike.py [-h] [-u TARGET] [--data PARAMDATA] [-e ENCODE] [--fuzzer] [--update] [--timeout ...

  5. 记录一次排查OOM的过程

    服务出现了oom: 查看类信息发现char[]类型实例特别多,占用堆内存特别大 跟踪几个char[]实例的GC root,发现都是保存token信息,并且根都是session 然后查看session的 ...

  6. Nebula Exchange与集群guava版本不一致问题

    1.集群版本 Hadoop 3.1.1.3.1.4.0-315 Hive (version 3.1.0.3.1.4.0-315) Spark 2.3.2.3.1.4.0-315 Scala versi ...

  7. Python编码转换图

  8. lvds接口

    1.lvds就是差分信号接口,tft-lcd屏幕,一种常用的接口. 2.有3种标准,18bit, 24bit(JEIDA) 与 24bit(VESA) 详细看https://www.topwaydis ...

  9. Android中的特殊权限

    AndroidManifest中定义的权限分为普通权限,危险权限和特殊权限. 普通权限指的是不会威胁到用户的安全和隐私的权限,只需要在AndroidManifest中声明一下就能直接使用. 危险权限指 ...

  10. Liunx安装eclipse-mosquitto之docker容器

    1.docker拉取 docker pull eclipse-mosquitto 2.查看镜像 docker images 3.建立配置目录 mkdir -p /mnt/mosquitto/confi ...