zoukankan      html  css  js  c++  java
  • Playbooks简介

     

    Playbooks简介

     

    • 关于Playbooks

    • Playbook简单示例

    • 基本组成

    1. 主机和用户

    2. 任务列表

    • Handlers: 配置更改时运行操作

    • 执行Playbook

    • Ansible-Pull

    • Linting playbooks

    • 其它的playbook确认选项

     

    关于Playbooks

    与ad-hoc模式相比,playbook是使用ansible的完全不同的方式,并且功能特别强大。

    playbook是真正简单的配置管理和多机部署系统的基础,非常适合部署复杂的应用程序。

    剧本可以声明配置,但是它们也可以编排任何有序步骤,即使不同的步骤必须在特定顺序的机器之间来回跳动也是如此。他们可以同步或异步启动任务。

    ansible-examples资料库中,还有一些完整的剧本,说明了许多这些技术 。

     

    Playbook简单示例

     

    playbook用YAML编写。

    每个playbooks可以有一个或多个playbook组成

     

    verify-apache.yml仅包含一部剧本:

     

     

     

    ---
    - hosts: webservers
      vars:
        http_port: 80
        max_clients: 200
      remote_user: root
      tasks:
      - name: ensure apache is at the latest version
        yum:
          name: httpd
          state: latest
      - name: write the apache config file
        template:
          src: /srv/httpd.j2
          dest: /etc/httpd.conf
        notify:
        - restart apache
      - name: ensure apache is running
        service:
          name: httpd
          state: started
      handlers:
        - name: restart apache
          service:
            name: httpd
            state: restarted
    
    

     

    Playbooks也可以包含多个plays,可能首先针对Web服务器,然后针对数据库服务器的剧本。例如:

     

     

    ---
    - hosts: webservers
      remote_user: root
    
      tasks:
      - name: ensure apache is at the latest version
        yum:
          name: httpd
          state: latest
      - name: write the apache config file
        template:
          src: /srv/httpd.j2
          dest: /etc/httpd.conf
    
    - hosts: databases
      remote_user: root
    
      tasks:
      - name: ensure postgresql is at the latest version
        yum:
          name: postgresql
          state: latest
      - name: ensure that postgresql is started
        service:
          name: postgresql
          state: started
    

     

     

    基本组成

     

    1. 主机和用户

    对于每个playbook都可以选择在哪些机器上使用哪个用户完成任务。

     

     

    ---
    - hosts: webservers
         remote_user: root
    

    也可以为每个任务定义远程用户:

     

     

    ---
    - hosts: webservers
         remote_user: root
         tasks:
             - name: test connection
               ping:
               remote_user: yourname
    

    还可以使用其他特权升级方法,例如su:

     

     

    ---
    - hosts: webservers
        remote_user: yourname
        become: yes
        become_method: su
    

    如果您需要为sudo指定密码,请ansible-playbook使用--ask-become-pass或运行-K

    还可以控制主机的运行顺序。默认值是遵循hosts存提供的顺序.

    1. 任务列表

    每个任务的目标是执行带有特定参数的模块。变量可以在模块的参数中使用。

    模块应该是幂等的,也就是说,按顺序运行一个模块多次应具有与仅运行一次相同的效果。实现幂等的一种方法是让模块检查是否已达到其所需的最终状态,如果已经达到该状态,则不执行任何操作即可退出。如果剧本使用的所有模块都是幂等的,则剧本本身很可能是幂等的,因此重新运行剧本应该是安全的.

    基本的任务语法:

     

    tasks:
        - name: make sure apache is running
          service:
              name: httpd
              state: started
    

     

    command和shell模块关心返回码,因此,如果您有一个成功退出码不为零的命令,则可能需要这样做:

     

    tasks:
        - name: run this command and ignore the result
          shell: /usr/bin/somecommand
          ignore_errors: True
    

     

    定义变量

     

    tasks:
        - name: create a virtual host file for {{ vhost }}
        template:
            src: somefile.j2
            dest: /etc/httpd/conf.d/{{ vhost }}
    

     

    Notify和Handlers

    Notify写在tasks的最后面,它只会触发一次,即使被多个不同tasks通知。

     

    - name: template configuration file
      template:
          src: template.j2
          dest: /etc/foo.conf
      notify:
          - restart memcached
          - restart apache
    

     

    notify任务部分中列出的内容称为处理程序。

    处理程序是任务的列表,与常规任务没有什么实质的不同,它们由全局唯一名称引用,并由通知程序通知。如果没有任何通知处理程序,它将不会运行。无论有多少个任务通知处理程序,在特定播放中完成所有任务后,它将仅运行一次。

    这是处理程序部分的示例:

     

    handlers:
        - name: restart memcached
          service:
              name: memcache
              dstate: restarted
        - name: restart apache
          service:
              name: apache
              state: restarted
    

     

    将变量放在处理程序的任务参数中。您可以使用以下方式加载值include_vars:

     

     

     

    tasks:
        - name: Set host variables based on distribution
          include_vars: "{{ ansible_facts.distribution }}.yml"
          
    handlers:
        - name: restart web service
          service:
              name: "{{ web_service_name | default('httpd') }}"
              state: restarted
    

     

    从Ansible 2.2开始,处理程序还可以“侦听”通用主题

     

     

    handlers:
        - name: restart memcached
          service:
            name: memcached
            state: restarted
          listen: "restart web services"
          
        - name: restart apache
          service:
              name: apache
              state: restarted
          listen: "restart web services"
          
    tasks:
        - name: restart everything
          command: echo "this task will restart the web services"
          notify: "restart web services"
    

     

    执行playbook

    运行并行度为10的剧本:

     

     

    ansible-playbook playbook.yml -f 10
    

     

    Ansible Pull的使用

    ansible用于从git中拉取playbooks

    通过ansible-pull命令与git、crontab共同使用,可以通过crontab定期拉去指定的git版本到本地,并以指定模式自动运行预先制定好的指令

     

     

     */20 * * * *  root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /src/www/king-gw/  -i /etc/ansible/hosts - U git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
    

     

    这里有一个写好的 clever playbook配置pull模式。

     

     

    Linting playbooks

    在执行之前,您可以使用ansible-lint对您的剧本进行详细检查。

     

     

    $ ansible-lint verify-apache.yml
    [403] Package installs should not use latest
    verify-apache.yml:8
    Task/Handler: ensure apache is at the latest version
    

     

    其他剧本验证选项

    ansible-playbook 与--syntax-check标志一起使用。这将通过解析器运行剧本文件,以确保其包含的文件,角色等没有语法问题。

     

     

    ansible-playbook --syntax-check  playbook.yml 
    

     

     

    要在运行剧本之前查看哪些主机会受到该剧本的影响,可以执行以下操作:

     

     

    ansible-playbook playbook.yml --list-hosts
    

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    [Swift]LeetCode32. 最长有效括号 | Longest Valid Parentheses
    [Swift]LeetCode31. 下一个排列 | Next Permutation
    [Swift]LeetCode30. 与所有单词相关联的字串 | Substring with Concatenation of All Words
    [Swift]LeetCode29. 两数相除 | Divide Two Integers
    时光轴的设计理念
    ITFriend开发日志20140611
    ITFriend开发日志20140611
    高中生活--第7篇–我为什么不交作业
    高中生活--第7篇–我为什么不交作业
    ITFriend网站内测公测感悟
  • 原文地址:https://www.cnblogs.com/zydev/p/11913001.html
Copyright © 2011-2022 走看看