zoukankan      html  css  js  c++  java
  • ansible playbook详解

    ansible playbook是由yml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法

    语法 描述
    缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tabs键
    冒号 以冒号结尾的除外,其他所有冒号后面必须有空格
    短横线 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表

    1)编写一个简单的playbook 实例, 命名事例为play01.yml

    ---
    #play
    - hosts: lab
      tasks:
        - name: Installed Httpd Service
          yum:
            name: httpd
            state: present
        - name: Start Httpd Service
          systemd:
            name: httpd
            state: started
            enabled: yes

    2)检查语法

    ansible-playbook --syntax-check play01.yml

    3)模拟执行(不是真的执行)

    ansible-playbook -C play01.yml

    4)真正执行

    ansible-playbook play01.yml

     playbook变量 

    有如下优先级

    命令行定义变量 ---> play中的vars_files ---> play中的vars变量 ---> host_vars中定义的变量

    ---> group_vars/组 ---> group_vars/all ---> inventory定义的变量

     a)playbook中定义变量vars,变量用 "{{变量}}" 表示

    ---
    #play
    - hosts: webservers
      vars:
        - web_package: httpd
        - db_package: mariadb-server
        - ftp_package: vsftpd
      tasks:
        - name: Installed Httpd Service
          yum:
            name:
              - "{{ web_package }}"
              - "{{ db_package }}"
              - "{{ ftp_package }}"
            state: present
     

    b) playbook的变量可以定义在一个专门存放变量的文件中,

    vi vars01.yml

    web_package: httpd
    db_package: mariadb-server
    ftp_package: vsftpd

    引用了变量文件vars01.yml 的写法

    ---
    #play
    - hosts: webservers
      vars_files: ./vars01.yml
      tasks:
        - name: Installed Httpd Service
          yum:
            name:
              - "{{ web_package }}"
              - "{{ db_package }}"
              - "{{ ftp_package }}"
            state: present

     c) 

    更好的方式是在ansible的项目目录中创建额外的两个变量目录,分别是host_vars group_vars
    group_vars 目录下必须存放的是和inventory清单文件中定义的组名一致,如下
    cat /etc/ansible/hosts
    [webservers]
    web01 ansible_ssh_host=172.16.1.7
    web02 ansible_ssh_host=172.16.1.8

    cat group_vars/webservers
    web_package: httpd
    ftp_package: vsftpd

    注意:系统提供了特殊的组,"all",也就是说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效

    host_vars 目录下存放的是某个host所需要定义的变量,这个变量优先级会高于group_vars 中定义的变量

     d)

    通过命令行覆盖变量,inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被

    命令行直接指定的变量覆盖,使用参数--extra-vars或-e 设定变量
    ansible-playbook test.yml -e "web_package=nginx" -e "ftp_package=vsftpd"

    e)  absible 变量层级定义

    例如如下文件var01.yml中定义了变量

     如下配置playbook, 中变量引用用类似rainbow.web.web_package的方式定义变量

     f) Ansible Register 变量注册,

    把shell的执行结果保存在register 的变量net_port

     

    g) Ansible facts 变量基本用法,ansible会帮忙采集被控端的信息

    ansible node -m setup

    ansible node -m setup -a filter="ansible_memtotal_mb"

    通过gather_facts=false来关闭,关闭采集

    h) 通过Ansible facts 采集的被控端变量,来定制不同的配置文件,

    要使用template模块,该模块会先查找source文件中是否有playbook中定义的变量,如果有,会把变量替换为值

    playbook中没有,但是被facts采集的变量也会被替换,

    例如下图,

    如下变量,"zabbix_server"是在playbook中定义的,ansible_hostname是通过facts采集的

    i)变量可以加减乘除运算,以下示例,通过facts采集的变量可以除以2,生成新的值

    j) ansible playbook 条件判断语句,when

    用法如下图

    下图when语句,查看是否包含关键字,支持or 和 and

    when: (ansible_hostname is match ("web*")) or (ansible_hostname is match ("nfs*"))

     k) ansible playbook 循环用法

    l) ansible playbook  使用字典循环,批量创建用户和拷贝文件

    拷贝文件

    m) ansible playbook 使用notify 和 handlers处理配置文件修改后触发任务,

    如下示例,当发现配置文件修改后,通过 handlers重启httpd

    n) ansible playbook任务标签(tag)

    可以列出所有的tags, 可以根据tags的内容,指定运行哪些定义的tags任务,可以跳过某个tags

    关于tag 的配置文件

     o) ansible playbook include 文件复用

    把单个文件放到文件中,之后通过include_task单独调用

    具体文件内容

    p) 调用多个playbook文件,import_playbook

    q) ansible playbook ignore 忽略错误

     直接在某个task 中添加ignore_error = yes

    r) ansible playbook

    在task出现错误后,继续调用handlers

    通常情况下,当task失败后,play将会终止,任何在前面已经被tasks notify的handlers都不会被执行,
    如果你在play中设置了force_handlers: yes参数,被通知的handlers就会被强制执行。(有些特殊场景可能会使用到)

     

    s) 

    shell任务不应该每次都报告changed状态,因为它没有在被管理主机执行后发生变化,添加一行changed_when: false
    来抑制这个改变,

    t) ansible playbook检查shell是否执行成功,并且在执行成功的时候是绿色,执行失败的时候报错出错误

     

    - hosts: all
      gather_facts: no
      tasks:
        - name: check nginx syntax
          shell: /usr/local/nginx/sbin/nginx -t 2>&1
          register: check_nginx
          changed_when: false
          changed_when: check_nginx.stdout.find('success') != -1
          notify: Reload nginx
    
        - name: show_result
          debug: msg={{ check_nginx.stdout_lines }}
    
      handlers:
        - name: Reload nginx
          systemd:
            name: nginx
            state: reloaded

    u)  playbook tasks 总结

     

  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/faberbeta/p/ansible002.html
Copyright © 2011-2022 走看看