Ansible-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,他可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后再另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
playbook通过ansible-playbook命令使用,它的参数和ansible命令类似,如参数-k(-ask -pass) 和-K( -ask-sudo)来询问ssh密码和sudo密码,-u指定用户,这些指令也可以通过规定的单元写在playbook。ansible-playbook的简单使用方法:
ansible-playbook example-play.yml

YAML基本语法

image.png

Play-book的基本规则

打印详细信息:

-v:打印任务运行结果
-vv:打印任务运行结果以及任务的配置信息
-vvv:包含了远程连接的一些信息

校验playbook语法

ansible-playbook —syntax-check manage_apache.yml
playbook:manager_apache.yml

测试运行playbook

  • 一个play-book可以拥有多个play
  • 每个play-book只能拥有一个tasks

    playbook的结构说明:

    主要有一下四个部分:
    Target section:用于定义将要执行playbook的远程主机及远程主机组上的用户,还包括定义通过什么养的方式连接远程主机(默认ssh)
    Variable section:定义playbook运行时需要使用的变量
    Task section:定义将要在远程主机上执行的任务列表
    Handler section:定义task执行完成以后需要调用的任务

    数据类型

    1.纯量:

    不可在分割的量 A=100


    2.列表:


    特点:每个元素都有索引号,从0开始
    每个元素可以重复
    每个元素之间相互独立,没有直接关系
    类似数组:
    B=[1,2,2,4]
    0 1 2 3

B[0]=1
B[1]=2
B[2]=2
B[3]=4

yaml语法

例子

  • marry
  • harry
  • natasha
  • name: marry
  • name: arry
    age:20
  • name: natasha
    age: 20

转换成python的语法
[marry,harry,natasha]

3.字典


python
C={name: marry, age: 18}
C[name]=marry
C[age]=18

例子

yaml语法
name: marry
age: 18
name: install httpd
yum:
name: httpd
state: present

{name: “install httpd”, yum: {name: httpd, state: present} }

特点:
字典的每个元素都是由键值对组成 key: value
key是唯一的,不可重复
value可以重复
每个key都是用来描述一个对象的,key之间有关联
冒号后面一定要有空格

play-book例子

  1. # cat user.yml
  2. - name: create user
  3. hosts: all
  4. remote_user: root
  5. gather_facts: false
  6. vars:
  7. user:"test"
  8. tasks:
  9. - name: create user
  10. user: name="{{ user }}"

参数说明

name:对该playbook实现的功能做一个概述,后面执行过程中,会打印name变量的值
hosts:指定对哪些被管理机进行操作
remote_user:指定再远程被管理机上执行操作时使用什么用户,如果不指定,则会使用ansible.cfg中配置的remote_user
gather_facts:指定再执行任务之前,是否先执行setup模块获取主机相关信息,如未用到,可不指定
vars:定义后续任务中会使用到的变量,如未用到,可不指定
tasks:定义具体需要执行的任务
name:对任务的描述,再执行过程会打印出来
user:指的是一个模块
name:user中的 一个参数,用来创建用户

Target section

  • name: create files
    hosts: datacenter
    tasks:
    • name: install httpd
      说明:play的主体部分是任务列表。任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行,在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时,如果中途发生错误,则整个playbook会停止执行,由于playbook的幂等性,playbook可以被反复执行,所以即使发生了错误,在修复错误后,再执行一次即可。

      Handler section

      定义task执行完成以后需要调用的任务
      1. -name: create files
      2. hosts: datacenter
      3. tasks:
      4. -name: install httpd
      5. handlers:
      6. -name: restarted httpd

      hanlder的用法

      ```yaml
  • hosts: node3 force_handlers: yes #报证被触发的handler会运行,就需要设置一个参数 tasks:

    • name: install httpd yum: name: httpd state: present
    • name: copy httpd.conf to remote hosts copy: src: /home/admin/ansible/httpd.conf dest: /etc/httpd/conf/httpd.conf notify:

      • restarted httpd
      • install php
    • name: start httpd systemd:

      1. name: httpd
      2. state: started
      3. enabled: yes
    • name: stop firewalld systemd:
      1. name: firewalld
      2. state: stopped
      ignore_errors: yes #表示如果任务运行失败,则忽略该错误继续运行
    • name: edit index.html copy: content: | #代表换行
      1. hello yutianedu
      2. welcome to yutian
      dest: /var/www/html/index.html notify: restarted httpd
    • shell: | #代表换行 ls /root setenforce 0
      handlers:
      • name: restarted httpd systemd: name: httpd state: restarted
      • name: install php yum: name: php state: present ```

        说明:

        1.handler里面也是任务,需要notify监控的任务发生变声,才能触发handler里面的任务
        2.因为handler里面的任务被触发时,不会立即运行,而是在playbook的最后运行
        3.为了报证被触发的handler会运行,就需要设置一个参数
        force_handlers: yes
        附:当playbook其中的一个任务运行失败,后面的任务都不会继续运行