Ansible Playbook剧本

1. playbook

1.1 playbook介绍

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

1.2 YAML介绍

  • YAML是一个可读性高的用来表达资料序列的格式。

  • YAML语言大小写敏感

  • YAML语言通过缩进表示层级关系
  • YAML语言禁止使用tab缩进,只能使用空格键
  • YAML语言使用#表示注释

1.3 playbook语法简介

  • 文档需以“---”(3个减号)开始,且需顶行手写。文档需以“…”(3个点号)结尾。
  • 次行开始正常写playbook的内容。
  • 使用#号注释代码。
  • 缩进必须是统一的,不能空格和Tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代码同样的级别,程序判断配置的级别是通过缩进结合换行实现的。
  • k/v的值可同行也可换行写,同行使用:分隔。
  • v可以是一个字符串,也可以是一个列表。
  • 一个完整的代码块功能需最少元素,需包括name:task。
  • 一个name只能包括一个task。
  • YAML文件扩展名通常为yml或yaml

1.4 playbook核心元素

  • hosts:执行的远程主机列表,需事先定义在主机清单里
  • tasks:任务集
  • variables:内置变量或自定义变量在playbook中调用
  • templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • handlers:和notity结合使用,由特定条件出发的操作,满足条件方可执行,否则不执行
  • tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。

 

2. playbook基本使用

---                                         #文档开始
- hosts: all                                #要执行的远程主机列表
  remote_user: root                         #用于指定远程主机上的执行任务的用户
  tasks:                                    #任务集,用于执行多个动作
    - name: "安装httpd"
      yum: name=httpd state=present
    - name: "启动httpd,设置为开机自启动"
      service: name=httpd state=started enabled=yes
...                                         #文档结束

 

如果命令或脚本的推出码不为0(也就是出错了),可以使用或代替: 

 tasks:
    - name: hello
      command: hostname || /bin/true

或者使用ignore_errors来忽略错误信息:

  tasks:
    - name: hello
      command: hostname
      ignore_errors: True

2.1 playbook运行

用法:ansible-playbook [options] playbook.yml

options选项

说明

--check/-C

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

--list-hosts

列出运行任务的主机

--limit 主机列表

只针对主机列表中的主机执行

-v

显示过程,-vv、-vvv更详细

[root@CentOS7 ~]# ansible-playbook httpd.yml 

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.146.111]
ok: [192.168.146.112]
ok: [192.168.146.122]

TASK [安装httpd] *****************************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]

TASK [启动httpd,设置为开机自启动] ********************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]

PLAY RECAP *********************************************************************
192.168.146.111            : ok=3    changed=2    unreachable=0    failed=0   
192.168.146.112            : ok=3    changed=2    unreachable=0    failed=0   
192.168.146.122            : ok=3    changed=2    unreachable=0    failed=0   

2.2 Shell与playbook

shell语法

#!/bin/bash
#install apache
yum install httpd -y
#copy configuration files
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp /tmp vhosts.conf /etc/httpd/conf.d/
#start apache
systemctl start httpd
systemctl enable httpd

yaml语法

---
- hosts: all
  remote_user: root

  tasks:
  - name: 'install apache'
    yum: name=httpd state=present
  - name: 'copy index.html'
    copy: src=/var/www/html/index.html dest=/var/www/html/index.html
  - name: 'start apache'
    service: name=httpd state=started enabled=yes
...

2.3 handlers和notify结合使用触发条件

handlers是task列表指定的操作,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

notify,此action可用于在每个play的最后被触发,这样可避免多次有改变发生时都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

[root@CentOS7 ~]# vim httpd.yml

---
- hosts: all
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd state=present
    - name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
      notify: restart service
    - name: start apache
      service: name=httpd state=started enabled=yes
  handlers:
    - name: restart service
      service: name=httpd state=restarted
...
[root@CentOS7 ~]# ansible-playbook httpd.yml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.146.111]
ok: [192.168.146.112]
ok: [192.168.146.122]

TASK [install httpd package] ***************************************************
ok: [192.168.146.112]
ok: [192.168.146.111]
ok: [192.168.146.122]

TASK [copy index.html] *********************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]

TASK [start apache] ************************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]

RUNNING HANDLER [restart service] **********************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]

PLAY RECAP *********************************************************************
192.168.146.111            : ok=5    changed=2    unreachable=0    failed=0  
192.168.146.112            : ok=5    changed=2    unreachable=0    failed=0  
192.168.146.122            : ok=5    changed=2    unreachable=0    failed=0 

2.4 playbook中tags使用

  • 通过指定标签来指定执行指定的action,多个标签之间用逗号隔开
  • 多个action可以公用一个标签
[root@CentOS7 ~]# vim httpd.yml

---
- hosts: all
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd state=present
      tags: install httpd
    - name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
      notify: restart service
    - name: start apache
      service: name=httpd state=started enabled=yes
      tags: restart httpd
  handlers:
    - name: restart service
      service: name=httpd state=restarted
...

 

[root@CentOS7 ~]# ansible-playbook -t 'restart httpd'  httpd.yml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]

TASK [start apache] ************************************************************
changed: [192.168.146.112]
changed: [192.168.146.122]
changed: [192.168.146.111]

PLAY RECAP *********************************************************************
192.168.146.111            : ok=2    changed=1    unreachable=0    failed=0  
192.168.146.112            : ok=2    changed=1    unreachable=0    failed=0  
192.168.146.122            : ok=2    changed=1    unreachable=0    failed=0

2.5 playbook中变量的使用

变量名:仅能由字母、数字和下划线组成,且只能以字母开头

变量来源:1.ansible setup facts远程主机的所有变量都可以直接调用

                  2.在/etc/ansible/hosts中定义

                     普通变量:主机中中主机单独定义,优先级高于公共变量

                     公共(组)变量:针对主机组中所有主机定义统一变量

                 3.通过命令行指定变量,优先级最高: ansible-playbook -e varname=name

                 4.在playbook中定义

vars:
  - var1: value1
  - var2: value2

                 5.在role中定义

命令行的优先级一般优于配置文件

 

2.在/etc/ansible/hosts中定义

[root@CentOS7 ~]# vim /etc/ansible/hosts

[webservers:vars]
prname=www.
poname=.cn
[webservers]
192.168.146.111 http_port=81
192.168.146.112 http_port=82
192.168.146.122 http_port=83

 

[root@CentOS7 ~]# vim hostname.yml

---
- hosts: all
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name={{ prname }}{{ http_port }}{{ poname }}
[root@CentOS7 ~]# ansible-playbook hostname.yml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]

TASK [set hostname] ************************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]

PLAY RECAP *********************************************************************
192.168.146.111            : ok=2    changed=1    unreachable=0    failed=0  
192.168.146.112            : ok=2    changed=1    unreachable=0    failed=0  
192.168.146.122            : ok=2    changed=1    unreachable=0    failed=0  

 

[root@CentOS7 ~]# ansible all -m shell -a 'echo $HOSTNAME'

192.168.146.112 | SUCCESS | rc=0 >>
www.82.cn

192.168.146.122 | SUCCESS | rc=0 >>
www.83.cn

192.168.146.111 | SUCCESS | rc=0 >>
www.81.cn

3.通过命令行定义

[root@CentOS7 ~]# vim s.yml
---
- hosts: all
  remote_user: root

  tasks:
    - name: install package
      yum: name={{ package_name }} state=present
    - name: start service
      service: name={{ package_name }} state=started enabled=yes
…

#安装vsftpd包,多个包中间使用空格隔开

[root@CentOS7 ~]# ansible-playbook -e 'package_name=vsftpd' s.yml

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.146.112]
ok: [192.168.146.111]
ok: [192.168.146.122]

TASK [install package] *********************************************************
ok: [192.168.146.112]
ok: [192.168.146.122]
ok: [192.168.146.111]

TASK [start service] ***********************************************************
changed: [192.168.146.122]
changed: [192.168.146.111]
changed: [192.168.146.112]

PLAY RECAP *********************************************************************
192.168.146.111            : ok=3    changed=1    unreachable=0    failed=0  
192.168.146.112            : ok=3    changed=1    unreachable=0    failed=0  
192.168.146.122            : ok=3    changed=1    unreachable=0    failed=0 

4.在playbook中定义

[root@CentOS7 ~]# vim s.yml

---
- hosts: all
  remote_user: root
  vars:
    - package_name: httpd
  tasks:
    - name: install package
      yum: name={{ package_name }} state=present
    - name: start service
      service: name={{ package_name }} state=started enabled=yes
...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值