Ansible学习——组件之Playbook day8

playbook介绍

playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。将多个play组织在一个playbook中,即可以让他们联通起来按事先编排的机制同唱一台大戏。

playbook-->play-->task-->module

role

Playbook是Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
当执行一些简单的改动时ansible命令是非常有用的,然而它真的作用在于它的脚本能力。当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
Playbook还开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
在如右的连接中: https://github.com/ansible/ansible-examples,有一些整套的playbooks,它们阐明了上述的这些技巧。

YAML介绍
Ansible使用标准的YAML解析器,使用YAML文件语法即可书写playbook。
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001首次发表了这种语言。
YAML Ain’t Makup Language,即YAML不是XML。不过,在开发这种语言时,YAML的意思是:Yet Another Makrup Language(仍是一种标记语言),其特性:YAML的可读性好、YAML和脚本的交互性好、YAML有一个一致的信息模型、YAML易于实现、 YAML可以基于流来处理、YAML表达能力强,扩展性好。更多的内容及规范参见www.yaml.org

GNU GNU IS NOT UNIX
LINUX linus's mix

核心元素:
Playbooks
Variables #变量元素,可传递给Tasks/Templates使用;
Tasks #任务元素,由模块定义的操作的列表,即调用模块完成任务;
Templates #模板元素,使用了模板语法的文本文件,可根据变量动态生成配置文件;
Handlers #处理器元素,通常指在某事件满足时触发的操作;
Roles #角色元素

playbook的基础组件:
name
定义playbook或者task的名称

hosts
playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式下的ansible匹配规则一样

user
remote_user则用于指定远程主机上的执行任务的用户,也可以使用user

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

vars
定义变量

vars_files
定义变量文件

notify
任务执行结果如果是发生更改了的则触发定义在handler的任务执行

handlers
用于当前关注的资源发生变化时采取一定指定的操作

include
能包含的包括task,handler和playbook
可以在include的时候传递变量

示例1:简单playbook
文档以---开头,没有也可以
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml //固定后缀为yml


  • hosts: all //特别注意-后面的空格 指定执行本play的主机组
    user: root //指定运行本play的远程主机用户
    tasks:
  • name: playbook_test //任务描述
    shell: touch /tmp/playbook.txt //shell是ansible模块
    tags: suibian //这是一个任务标记,可用来单独执行此任务

参数解释:
hosts参数指定了对哪些主机进行操作;
user参数指定了使用什么用户登录远程主机操作;
tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。
tags:给指定的任务定义一个调用标识,形式如下

  • name: NAME
    module: arguments
    tags: TAG_ID

语法检测
[root@ansible ansible]# ansible-playbook --syntax-check test.yml
playbook: test.yml

测试运行
[root@master ansible]#ansible-playbook -C /path/to/playbook.yaml
可以使用如下参数:
--list-hosts
--list-tasks
--list-tags

运行Playbook:
[root@master ansible]# ansible-playbook test.yml

只运行指定标记的任务:-t tags
[root@ansible ansible]# ansible-playbook -t 标记名称 test.yml

跳过某一个被标记的任务:--skip-tags=SKIP_TAGS
[root@ansible ansible]# ansible-playbook --skip-tags=标记名称 test.yml

从某一个任务开始往下运行:--start-at-task 任务名称
[root@ansible ansible]# ansible-playbook --start-at-task "start httpd service" test.yml

示例2.每个playbook可以有多个play
[root@ansible ansible]# cat test.yml

  • hosts: all //play1
    remote_user: root
    tasks:

  • name: install a group
    group: name=mygrp system=true

  • name: install a user
    user: name=user1 group=mygrp system=true

  • hosts: webservers //play2
    remote_user: root
    tasks:

  • name: install httpd package
    yum: name=httpd

  • name: start httpd service
    service: name=httpd state=started

示例3:使用变量
[root@ansible ansible]# cat create_user.yml

  • name: create_user //剧本描述信息
    hosts: web1
    user: root
    gather_facts: false
    vars:
  • user: "msiyuetian"
    tasks:
  • name: create user
    user: name="{{ user }}"

参数解释:
name参数
对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;

gather_facts参数
指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用
到setup获取的信息时用到;
默认值为true,改成false之后在执行过程中就看不到以下信息:
TASK [Gathering Facts]


ok: [web1]
ok: [web3]
ok: [web2]
ok: [192.168.245.135]

vars参数
指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;

user
指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

运行playbook:
[root@master ansible]# ansible-playbook create_user.yml

示例4:条件执行
[root@master ansible]# vim when.yml

  • hosts: web1
    user: root
    gather_facts: True
    tasks:
    • name: use when
      shell: touch /tmp/when.txt
      when: ansible_hostname == "web1"

[root@ansible ansible]# cat when.yml

  • hosts: web1
    user: root
    gather_facts: True
    tasks:
  • name: use when
    shell: touch /tmp/when.txt
    when: ansible_all_ipv4_addresses[0] == "192.168.245.133"

只有当参数ansible_all_ipv4_addresses[0]为 192.168.245.133 时才在该机器上新建指定文件;意思就是只对 testhost 组中特定的主机进行操作,忽略组内其他的主机。可以通过setup模块查看各个参数的值

setup模块变量获取:
上面的变量:ansible_hostname和ansible_all_ipv4_addresses[0] 是从setup模块中获取

注意看
是:
"ansible_hostname": "web1"
还是:
"ansible_all_ipv4_addresses": [
"192.168.245.133"
]
如果变量值是用[]括起来的需要用[0]方式切片获取

[root@master ansible]# ansible-playbook when.yml

示例5:handlers:由特定条件触发的Tasks
调用及定义方式:
tasks:

  • name: TASK_NAME
    module: arguments
    notify: HANDLER_NAME
    handlers:
  • name: HANDLER_NAME
    module: arguments

handlers示例1
[root@ansible ansible]# cat handlers.yml

  • name: handlers test
    hosts: web1
    user: root
    tasks:
  • name: test copy
    copy: src=/etc/passwd dest=/tmp/handlers.txt
    notify: test handlers

handlers:

说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。所以这种比较适合配置文件发生更改后,需要重启服务的操作。
[root@master ansible]# ansible-playbook handlers.yml

handlers示例2:

  • hosts: websrvs
    remote_user: root
    tasks:

  • name: install httpd package
    yum: name=httpd state=latest

  • name: install conf file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: restart httpd service

  • name: start httpd service
    service: name=httpd state=started

handlers:

  • name: restart httpd service
    service: name=httpd state=restarted

示例6:include参数

  • name: create_user
    hosts: web1
    user: root
    gather_facts: false
    vars:
  • user: "msiyuetian"
    tasks:
  • name: create user
    user: name="{{ user }}"
  • include: handlers.yml //已经用下面的import_playbook代替
  • import_playbook: handlers.yml

示例7:pause暂停
在playbook执行的过程中暂停一定时间或者提示用户进行某些操作
常用参数:
minutes:暂停多少分钟
seconds:暂停多少秒
prompt:打印一串信息提示用户操作

[root@ansible ansible]# cat wait.yml

  • name: wait
    hosts: web1
    tasks:
  • name: wait on user input
    pause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit"
  • name: timed wait
    pause: seconds=30
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350