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:

  • name: test handlers
    shell: echo "www.qianfeng.com" >> /tmp/handlers.txt

说明:只有 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

你可能感兴趣的:(Ansible学习——组件之Playbook day8)