• 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 总结

     

  • 相关阅读:
    【leetcode】236. 二叉树的最近公共祖先
    【leetcode】230. 二叉搜索树中第K小的元素
    【leetcode】309. 最佳买卖股票时机含冷冻期
    【leetcode】306. 累加数
    【leetcode】304. 二维区域和检索
    spring-framework源码编译及导入
    Java8-函数式接口理解及测试
    Mac编译RocketMQ 4.1.0
    首记
    JS表单验证
  • 原文地址:https://www.cnblogs.com/faberbeta/p/ansible002.html
Copyright © 2020-2023  润新知