Ansible之playbook 剧本详解与循环遍历

原创 浪子丶刘少  2019-08-21 09:00  阅读 623 次 评论 0 条 百度未收录

一、playbook含义

  • playbook是由一个或多个“play”组成的列表
  • play主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义号的角色。从根本上讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们连同起来按照事先编排的机制同唱一台大戏。
  • playbook采用YAML语言编写

二、YAML 的语法简介

  • 在单一档案中,可用连续三个连字号(---)区分多个档案。另有选择行的联系(...)用来表示文档结尾。
  • 次行开始写piaybook,一般建议写明该playbook
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判断配置的级别是通过缩进结合换行来实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一直,是区分大小写的,K/V的值均需大小写敏感
  • K/V的值可同行写也可换行写。同行使用:分隔
  • v可是个字符串,也可使另一个列表
  • 一个完整的代码块功能需最少元素包括name:task
  • 一个name只能包括一个task
  • YAML文件拓展名通常为yml或yaml

三、常用语法

1、list 列表

其所有元素均使用“-”开头

2、Dicrionary 字典

通常由多个key或value组成
也可以将key:value放置于{}中进行表示,用“,”分割多个key:value

四、Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Varniables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方执行,否则不执行
  • targs 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会减少跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片段,例:
ansible-playbook -t tagsname useradd.yml

五、触发任务与标签执行

---
- hosts: 172.16.10.12
  remote_user: root

  tasks:
    - name: install apache
      yum: name=httpd
      tags: install_httpd
    - name: copy conf file      copy: src=/root/files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify:
        - restart apache
        - ckeck apache
        - copy log
    - name: start apache
      service: name=httpd state=started enabled=yes

  handlers:
    - name: restart apache
      service: name=httpd state=restarted
    - name: ckeck apache
      shell: echo "----------------`date`----------------" >> /opt/httpd.log ; netstat -lantu >> /opt/httpd.log
    - name: copy log
      fetch: src=/opt/httpd.log dest=/root/

注解一:
notify为触发,可在当前name发生改变时触发,执行handlers中对应的模块

注解二:
tags标签,可以在外部只执行标签模块
如果执行多个标签,用“,”号隔开即可
也可多个动作公用一个标签
例:
ansible-playbook -t install_httpd liushao.yml

六、变量实现

注意配合使用setup模块
ansible 172.16.10.12 -m setup -a "filter=ansible_all_ipv4_addresses"

1、定义变量方案一,命令中赋值

---
- hosts: 172.16.10.12
  remote_user: root

  tasks:
    - name: install server
      yum: name={{ pkname }}
    - name: start server
      service: name={{ pkname }} state=started enabled=yes

使用:
ansible-playbook -e 'pknaem=httpd' liushao.yml
多个变量直接空格隔开写入即可

2、定义变量方案二,文件 playbook 中定义

---
- hosts: 172.16.10.12
  remote_user: root
  vars:
    -pkname1: httpd
    -pkname2:vsftp

    tasks:
    - name: install server
      yum: name={{ pkname1 }}
    - name: start server
      service: name={{ pkname1 }} state=started enabled=yes

3、定义变量方案二,/atc/ansible/hosts中定义

#对单一主机定义变量,例
[webs]
172.16.10.12 http_port=8080
172.16.10.13 http_port=8081

[dbs]
172.16.10.12
172.16.10.14
#对单一组定义变量,例
[webs]
172.16.10.12
172.16.10.13
[webs:vars]
httpd_port=8080

[dbs]
172.16.10.12
172.16.10.14

4、定义变量方案四,编写专门变量文件进行引用

vim vars.yml
var1=httpd
var2=vsftpd

yml文件中引入
---
- hosts: 172.16.10.12
  remote_user: root
  vars_files:
   - vars.yml

  tasks:

七、变量优先级统计

由上向下,依次变小
  • 命令行 -e 定义变量
  • 当前playbook中定义变量
  • 主机清单中变量

本文地址:https://www.ezliushao.com/319.html
加入我们:请加入刘少技术博客交流群:扫描二维码刘少技术博客的QQ交流群 | 浪子丶刘少 QQ:1150110267(注:微信暂停添加好友)
版权声明:本文为原创文章,版权归 浪子丶刘少 所有,欢迎分享本文,转载请保留出处!

发表评论


表情