美文网首页
Ansible学习——组件之Playbook day8

Ansible学习——组件之Playbook day8

作者: 全栈小运维 | 来源:发表于2020-05-13 09:14 被阅读0次
    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

    相关文章

      网友评论

          本文标题:Ansible学习——组件之Playbook day8

          本文链接:https://www.haomeiwen.com/subject/lrejwhtx.html