zoukankan      html  css  js  c++  java
  • Ansible工具(2)

    4 Playbook

    4.1 playbook介绍

    playbook 剧本是由一个或多个“play”组成的列表

    play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。

    Playbook 文件是采用YAML语言编写的

    4.2 YAML 语言

    4.2.1 YAMl 语言介绍YAML是一个可读性高的用来表达资料序列的格式。

    YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingydöt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等

    YAML:YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

    YAML 官方网站:http://www.yaml.org

    4.2.2 YAML 语言特性

    YAML的可读性好
    YAML和脚本语言的交互性好
    YAML使用实现语言的数据类型
    YAML有一个一致的信息模型
    YAML易于实现
    YAML可以基于流来处理
    YAML表达能力强,扩展性好

    4.2.3 YAML语法简介

    1、在单一文件第一行,用连续三个连字号“-”开始,还有选择性的连续三个点号(...)用来表示文件的结尾
    2、次行开始正常写playbook的内容,一般建议写明该playbook的功能
    3、使用#号注释代码
    4、所进的级别也必须一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现
    5、YAML文件内容是区分大小写的,key/value的值军需大小写敏感
    6、多个k/v可同行写也可换行写,同行使用“,”分隔
    7、v可以个字符串,也可以是另一个列表
    8、一个完整的代码块功能最少元素需包括name和task
    9、一个name只能包含一个task
    10、YAML文件扩展名通常为yml或yaml

    YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔,下面介绍常见的数据结构。

    4.3 Playbook核心元素

    hosts 执行的远程主机列表

    Tasks 任务集
    Variables 内置变量或自定义变量在playbook中的调用
    Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

    4.3.1 hosts 组件

    Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。

    案例:
    - hosts: websrvs:appsrvs

    4.3.2 remote_user 组件

    remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

    案例
    - hosts: websrvs remote_user: root tasks: - name: test connection ping: remote_user: magedu sudo: yes #默认sudo为root sudo_user:wang #sudo为wang

    4.3.3 task列表和action组件

    play的主体部分是task list , task list中有一个或多个task,各个task按序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task之后,再开始第二个task。

    task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

    每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未能提供name,则action的结果将用于输出。

    task两种格式:

    (1) action: module arguments

    (2) module: arguments 建议使用

    注意:shell和command模块后面跟命令,而非key=value

    ---
    -  hosts: lou
        remote_user: root
        tasks:
          - name: install httpd
            yum: name=httpd
          - name: start httpd
            service: name=httpd state=started enabled=yes

    4.3.4 ShellScripts VS Playbook 案例

    #SHELL脚本实现
    #!/bin/bash
    # 安装Apache
    yum install --quiet -y httpd
    # 复制配置文件
    cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
    cp/tmp/vhosts.conf /etc/httpd/conf.d/
    # 启动Apache,并设置开机启动
    systemctl enable --now httpd
    
    
    #Playbook实现
    ---
    - hosts: websrvs
       remote_user: root
       tasks:
         - name: "安装Apache"
           yum: name=httpd
         - name: "复制配置文件"
           copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
         - name: "复制配置文件"
           copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
         - name: "启动Apache,并设置开机启动"
           service: name=httpd state=started enabled=yes

     4.4 playbook 命令

    格式:

    ansible-playbook <filename.yml> ... [options]

    常见选项

    --check -C #只检测可能会发生的改变,但不真正执行操作
    --list-hosts #列出运行任务的主机
    --list-tags #列出tag
    --list-tasks #列出task
    --limit 主机列表 #只针对主机列表中的主机执行
    -v -vv -vvv #显示过程

    范例

    ansible-playbook file.yml --check #只检测
    ansible-playbook file.yml
    ansible-playbook file.yml --limit websrvs

    范例:remove_httpd.yml

    #remove_httpd.yml
    ---
    - hosts: websrvs
      remote_user: root
    tasks:
      - name: remove httpd package
        yum: name=httpd state=absent
      - name: remove apache user
        user: name=apache state=absent
      - name: remove data file
        file: name=/etc/httpd state=absent

    4.5 Playbook中使用handlers和notify

    Handlers本质是task list ,其中的task与前述的task并没有本质上的不同,用于当关注的资源发生变化
    时,才会采取一定的操作.Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变
    发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的
    操作称为handler,也即notify中调用handler中定义的操作

    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: add group nginx
          user: name=nginx state=present
        - name: add user nginx
          user: name=nginx state=present group=nginx
        - name: Install Nginx
          yum: name=nginx state=present
        - name: config
          copy: src=/root/config.txt dest=/etc/nginx/nginx.conf
          notify: Restart Nginx
      handlers:
        - name: Restart Nginx
          service: name=nginx state=restarted enabled=yes

    4.6 playbook使用when

    when语句,可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过在task后添加when子句即可使用条件测试,jinja2的语法格式

    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: "shutdown Centos systems"
          command: /sbin/shutdown -h now
          when: ansible_os_family == "Centos"

    4.7 Playbook中使用变量

    变量名:仅能由字母、数字和下划线组成,且只能以字母开头

    变量定义:

    key=value

    变量调用方式:

    通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用“{{ variable_name }}”才生效

    变量来源:

    1. ansible 的 setup facts 远程主机的所有变量都可直接调用
    2. 通过命令行指定变量,优先级最高

    在playbook文件中定义变量

    vim var2.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        - username: user1
        - groupname: group1
      tasks:
        - name: create group
          group: name={{ groupname }} state=present
        - name: create user
          user: name={{ username }} state=present
    
    ansible-playbook -e "username=user2 groupname=group2” var2.yml  #命令行变量优先级更高
  • 相关阅读:
    201521123031 《Java程序设计》第14周学习总结
    201521123031 《Java程序设计》第13周学习总结
    软工个人作业5——软件工程总结
    软工网络15个人作业4——alpha阶段个人总结
    软工网络15个人作业3——案例分析
    软件工程网络15结对编程作业
    软工网络15个人阅读作业2——提问题
    软件工程网络15个人阅读作业1(201521123036 曾艺佳)
    Java课程设计
    Java课程设计-学生基本信息管理 201521123036
  • 原文地址:https://www.cnblogs.com/lummg-DAY/p/12012984.html
Copyright © 2011-2022 走看看