Ansible的Playbook

Playbook 特点

  • playbook 剧本是由一个或多个"play"组成的列表
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的任务角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
  • Playbook 文件是采用YAML语言编写的

二、 YAML 语言介绍

YAML:YAML Ain't Markup Language,即YAML不是标记语言。主要用来配置,大小写敏感,不支持tab, 是一个可读性高的用来表达资料序列的格式。

YAML 语言特性

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好

YAML 语法简介

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表
  • YAML文件扩展名通常为yml或yaml

支持的数据类型

  • 标量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

三、 Playbook 核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表
  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段

1. host 组件

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

2. remote_user 组件

remote_user: 可用于Host和task中。也可以指定其通过sudo的方式在远程主机上执行任务,可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

3. task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。

4. Handlers notify 组件

Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一次。
  • 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler

5. tags 标签

在playbook文件中,可以利用tags组件,为特定task指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件。

6. ignore_errors 组件

如果一个task出错,默认将不会继续执行后续的其它task

利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task

7. yml 文件 实操

建议修改vim配置

vim   ~/.vimrc
set ai    //自动对齐
set ts=2  //一个tab键等于2个空格
//每次按下Enter键换行时,新的行会自动缩进,并且缩进将会用2个空格来表示

示例1:新建用户

[root@node1 data]#  vim add_user.yml   //编写yml文件

`写法1:`
---
- hosts: lkk
  gather_facts: no

  tasks:
    - name: creat user
      user: name=cxk uid=6666 system=yes

写法2:

---
- hosts: lkk
  gather_facts: no

  tasks:
    - name: creat user
      user:
        name: wyf
        uid: 666
        system: yes

[root@node1 data]#  ansible-playbook  --syntax-check add_user.yml  //检查语法格式
[root@node1 data]#  ansible-playbook add_user.yml  //执行

示例2:yum安装httpd并启动

[root@node1 data]#  vim httpd.yml  //编写yml文件

---
- hosts: lkk
  gather_facts: no

  tasks:
    - name: yum httpd
      yum:
        name: httpd
        state: present

    - name: stop firewalld
      service:
        name: firewalld
        state: stopped
        enabled: no

    - name: start httpd
      service:
        name: httpd
        state: started

    - name: web page
      copy: src=/data/index.html dest=/var/www/html/

[root@node1 data]#  ansible-playbook  --syntax-check httpd.yml  //检查语法错误
[root@node1 data]#  ansible-playbook  httpd.yml   //执行

[root@node1 data]#  curl 172.16.88.8
7-1
[root@node1 data]#  curl 172.16.88.9
7-1

示例3:yum安装nginx并启动

[root@node1 data]#  vim nginx.yml   //编写yml文件

---
- hosts: lkk
  gather_facts: no

  tasks:
    - name: install epel
      yum: name=epel-release.noarch state=present

    - name: install nginx
      yum: name=nginx state=present

    - name: stop httpd
      service: name=httpd state=stopped

    - name: start nginx
      service: name=nginx state=started enabled=yes

    - name: web page
      copy: src=/data/index.html dest=/usr/share/nginx/html

[root@node1 data]#  ansible-playbook --syntax-check nginx.yml  //检查语法错误
[root@node1 data]#  ansible-playbook nginx.yml  //执行

[root@node1 data]#  curl 172.16.88.8
7-1
[root@node1 data]#  curl 172.16.88.9
7-1

示例4:编译安装nginx并启动

---
- hosts:  lkk
  gather_facts:  no



  tasks:
    - name:  install  packages
      yum:
        name: 
          - gcc
          - pcre-devel
          - openssl-devel
          - zlib-devel
          - openssl 
          - openssl-devel
        state:  present  
    - name:  unarchive
      unarchive: src=/opt/nginx-1.18.0.tar.gz  dest=/opt
    - name:  bianyi
      command: ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
      args:
        chdir: /opt/nginx-1.18.0

    - name:   make
      command: make
      args:
        chdir: /opt/nginx-1.18.0
   
    - name:   make  install
      command: make  install
      args:
        chdir: /opt/nginx-1.18.0

    - name: cpoy  service
      copy:  src=/usr/lib/systemd/system/nginx.service    dest=/usr/lib/systemd/system/nginx.service
   
    - name:   reload
      command: systemctl  daemon-reload
   
    - name: link
      shell:  ln -s  /apps/nginx/sbin/nginx   /usr/bin            

    - name:  start  nginx
      service:  name=nginx  state=started  enabled=yes
   
    - name:  web page
      tags:  page
      copy:  src=/data/index.html    dest=/apps/nginx/html

示例5:使用tags标签

[root@node1 data]#  vim nginx.yml   //添加tags
---
- hosts: lkk
  gather_facts: no

  tasks:
    - name: web page
      tags: page
      copy: src=/data/index.html dest=/apps/nginx/html
[root@node1 data]#  ansible-playbook -t page nginx.yml  //仅执行特定tags的task,而非整个playbook文件

四、 Playbook 命令

ansible-playbook <filename.yml> ... [options]

选项

作用

--syntax-check

语法检查,可缩写成--syntax,相当于bash -n

-C  --check

模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run

--list-hosts

列出运行任务的主机

--list-tags

列出tag标签

--list-tasks

列出task任务列表

--limit 主机列表

只针对主机列表中的特定主机执行(例:ansible-playbook  test.yml  --limit 192.168.204.20)

-i INVENTORY

指定主机清单文件,通常一个项对应一个主机清单文件(例:ansible-playbook  test.yml  -i  /opt/hosts)

--start-at-task START_AT_TASK

从指定task开始执行,而非从头开始,START_AT_TASK为任务的name 

-v -vv  -vvv

显示过程

相关推荐

  1. Ansible---playbook使用

    2024-07-12 07:32:02       53 阅读
  2. AnsiblePlaybook

    2024-07-12 07:32:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 07:32:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 07:32:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 07:32:02       58 阅读
  4. Python语言-面向对象

    2024-07-12 07:32:02       69 阅读

热门阅读

  1. Ansible

    2024-07-12 07:32:02       22 阅读
  2. RabbitMQ保证消息被成功发送和消费

    2024-07-12 07:32:02       23 阅读
  3. Python实现一对多WebSocket发送给指定多个客户端

    2024-07-12 07:32:02       26 阅读
  4. React 18 + Babel 7 + Webpack 5 开发环境搭建

    2024-07-12 07:32:02       27 阅读
  5. flutter常用库的介绍(1)

    2024-07-12 07:32:02       31 阅读
  6. 用Python和TensorFlow实现图像分类:从零开始

    2024-07-12 07:32:02       28 阅读
  7. 鸿蒙开发工程师面试题-架构篇

    2024-07-12 07:32:02       29 阅读
  8. 递推(C语言)

    2024-07-12 07:32:02       18 阅读
  9. C语言 输出图案

    2024-07-12 07:32:02       25 阅读
  10. Python Linux下编译

    2024-07-12 07:32:02       26 阅读