美文网首页程序员自动化互联网科技
Ansible 详解(三):Playbooks

Ansible 详解(三):Playbooks

作者: 51reboot | 来源:发表于2018-07-04 09:37 被阅读3次

    ansible 是一款轻量级自动化运维工具,由的 Python 语言开发,结合了多种自动化运维工具的特性,实现了批量系统配置,批量程序部署,批量命令执行等功能; ansible 是基于模块化实现批量操作的。

    一、基础应用

    二、重用

    1、include&import

    区别:

    • ansible 在 playbook 解析时间预处理所有静态导入

    • 动态包含是在运行时处理

    • 动态包优势&限制

    优势:与循环一起使用,为循环的每个项目添加任务或角色

    限制:

    --list-tags 命令不能显示动态包含的 tag

    --list-tasks 命令不能显示动态包含的 task

    不能使用 notify 触发动态包的 handler(可触发动态包含文件自身 handler)

    不能使用 --start-at-task 开始执行动态包含的任务。

    静态导入优势&限制

    限制:不能与循环结合使用

    在导入文件或角色中名称中不能使用 inventory host_vars/group_vars 中的变量

    2、playbook

    import_playbook:导入 play

    ——- import_playbook:webservers.yaml- import_playbook:database.yaml
    

    task/handler

    • include_tasks

    • import_tasks

    tasks01.yaml

    ---- name:task_01  ping:
    

    tasks02.yaml

    ---- name:task_02 shell:echo "task_02 {{name}} 'date'" >> /tmp/playbook_v3.log
    

    playbook_v3.yaml

    ---- hosts:mytesttask: -import_tasks:task_01.yaml -include_tasks:task_01.yaml vars  name:include -import_task:task02.yaml vars  name:import
    

    测试

    ansible-playbook playbook_v3.yaml -i hosts --list-tasks

    ansible-playbook playbook_v3.yaml -i hosts

    3、roles

    根据已知的文件结构自动加载 vars,tasks,handlers,并实现功能的共享。

    三、变量

    1、命名规范

    • 数字,大小写英文字母,下划线

    • 英文字母开头

    2、自定义变量

    定义位置

    • inventory

      var

      host_vars

      group_vars

    • roles

    使用语法

    • {{ var }}

    • {{ var.key }}

    • {{ var['key'] }}

    • {{ var[0]}}

    使用的位置

    • inventory

    • jinja2 模板

    3、facts 变量

    通过远程方法获取受控机器的变量数据

    命令

    ansible all -m setup -i hosts
    

    读取

    {{ ansible_nodemame }} 主机名

    {{ ansible_default_ipv4.address }} 主机 ip

    关闭 facts

    在 playbook 中使用 gather_facts:False 关闭

    ---- hosts: mytest gather_facts: False roles:   - { role: webservers}
    

    受控主机本地 facts

    存储目录

    /ect/ansible/facts.d/test.fact

    文件格式

    ini/yaml/json

    测试

    /ect/ansible/facts.d/test.fact

    [name]from=kk
    

    ansible mytest -m setup -i hosts -a "filter = ansible_local"

    使用 {{ ansible_local.test.name.from }} 读取数据

    使用 play 更新受控机器本地 facts 后,需要主动调用 setup 模块更新当前执行主机 facts 信息。

    4、ansible 版本变量

    ansible_version

    playbook_v12.yaml

    ---- hosts: mytest tasks:   - debug:       msg: "{{ ansible_version }}"
    

    测试

    ansible-playbook playbook_v12.yaml -i hosts

    facts 缓存

    hostvars

    playbook_v13.yaml

    ---- hosts: all gather_facts: False tasks:   - debug:       msg: "{{ hostvars['mytest']['ansible_nodename'] }}"
    

    测试

    ansible-playbook playbook_v13.yaml -i hosts

    启用缓存

    配置 ansible.cfg

    [defaults]gather=smartfact_caching=jsonfilefact_caching_connection=/tmp/ansible/facts/fact_caching_timeout=86400
    

    测试

    ansible all -m setup -i hosts

    ansible-playbook playbook_v13.yaml -i hosts

    使用场景

    定时更新 facts 缓存数据

    关闭 playbook 中 gather_facts, 减少 playbook 执行时间

    5、注册变量

    保存执行命令变量

    用法:在 task 中定义 registers 指定结果接受变量名

    playbook_v14.yaml

    ---- hosts: mytest gather_facts: False tasks:   - name: ip addr1     shell: ip addr1     register: result     ignore_errors: True   - debug:       msg: "{{ result.stderr }}"     when: result.rc != 0
    

    测试

    ansible-playbook playbook_v14.yaml -i hosts

    6、魔术变量

    综合信息

    hostvars:主机缓存

    groups:分组信息

    受控机器信息

    group_names:当前匹配主机所在组

    inventory_hostname:当前匹配主机在 inventory 中定义的名称

    ansible_hostname_short

    ansible_play_batch

    ansible_play_hosts

    ansible_playbook_python:当前匹配主机在 Python 执行器

    控制机器信息

    • inventory_dir:inventory 所在目录

    • inventory_file:inventory 文件

    • inventory_dir:playbook 所在目录

    • role_path:当前 role 路径、只能在 role 中使用

    • ansible_check_mode:运行命令是否启用 check

    playbook_v15.yaml

    ---- hosts: mytest gather_facts: False tasks:   - debug:       msg: "{{ group_names }}"   - debug:       msg: "{{ groups }}"   - debug:       msg: "{{ inventory_hostname }}"   - debug:       msg: "{{ ansible_hostname }}"   - debug:       msg: "{{ inventory_hostname_short }}"   - debug:       msg: "{{ ansible_play_batch }}"   - debug:       msg: "{{ ansible_play_hosts }}"   - debug:       msg: "{{ ansible_playbook_python }}"   - debug:       msg: "{{ inventory_dir }}"   - debug:       msg: "{{ inventory_file }}"   - debug:       msg: "{{ playbook_dir }}"   - debug:       msg: "{{ ansible_check_mode }}"
    

    ansible-playbook playbook_v15.yaml -i hosts --check

    四、模板(jinja2)

    过滤器

    格式化

    • to_json

    • to_yaml

    • to_nice_json

    • to_nice_yaml

    • from_json

    • from_yaml

    关闭变量是否定义检查:mandatory

    为未定义变量设置默认值: default(value)

    省略:default(omit)

    列表过滤器

    • min

    • max

    • flattern

    集合过滤器

    • unique

    • union(set)

    • interset(set)

    • defference(set)

    • symmentic_difference(set)

    随机数:random

    随机排序:shuffle

    数学

    • log

    • pow

    • root

    json 查询:json_query

    ip 地址

    • ipaddr

    • ipv4

    • ipv5

    测试

    • is match

    • is search

    • is version

    • is subset

    • is superset

    • is all

    • is any

    • is directory

    • is file

    • is line

    • is exists

    • is abs

    • is mount

    • is same_file

    • is failed

    • is success

    • is skipped

    • is succeeded

    • is changed

    五、条件语句

    when:可用于 role,import,include 的控制

    loop when:使用 item 接收循环的元素

    vars_file + var + list:在 list 中查找第一个存在的文件进行加载

    loop-query:找第一个可用的文件

    query('first_found', {'file' : [], 'pths' : [] } )
    

    六、循环

    playbook_v18.yaml

    ---- hosts: mytest vars:   user_list:     - kk     - silence tasks:   - name: loop     debug:       msg: "{{ item }}"     loop:       - first       - second   - name: loop vars     debug:       msg: "{{ item }}"     loop: "{{ user_list }}"   - name: loop query     debug:       msg: "{{ item }}"     loop: "{{ query('nested', ['a', 'b'], ['x', 'y', 'z']) }}"   - name: loop lookup     debug:       msg: "{{ item }}"     loop: "{{ lookup('nested', ['a', 'b'], ['x', 'y', 'z'], withlist=True) }}"   - name: do-until     command: python -c "import sys,random; sys.exit(random.randint(0, 3));"     ignore_errors: True     register: result     until: result is success     retries: 3     delay: 3   - name: loop register     command: "echo {{ item }}"     loop: "{{ user_list }}"     register: echo     changed_when: echo.stdout != 'kk'   - name: loop register result     debug:       msg: "{{ item.cmd }} is success"     loop: "{{ echo.results }}"     when: item.rc == 0   - name: all host     debug:       msg: "{{ item }}"     loop: "{{ groups['all'] }}"   - name: batch host     debug:       msg: "{{ item }}"     loop: "{{ ansible_play_batch   }}"   - name: loop query     debug:       msg: "{{ item }}"     loop: "{{ query('inventory_hostnames', 'all') }}"   - include_tasks: tasks.yaml     loop: [1, 2, 3]     loop_control:       loop_var: outer_item   - name: loop control label     debug:       msg: "{{ item }}"     loop:       - name : kk         age: 30       - name : silence         age: 31   - name: loop control label     debug:       msg: "{{ item }}"     loop:       - name : kk         age: 30       - name : silence         age: 31     loop_control:       label: "{{ item.name }}"   - name: loop control label     debug:       msg: "{{ item.name }}"     loop:       - name : kk         age: 30       - name : silence         age: 31     loop_control:       label: "{{ item.name }}"   - name: loop control pause     debug:       msg: "{{ item }}"     loop: [1, 2, 3]     loop_control:       pause: 3   - name: loop control index     debug:       msg: "{{ index }} : {{ item }}"     loop: [1, 2, 3]     loop_control:       index_var: index
    

    测试

    ansible _playbook playbook_v18.yaml -i hosts
    

    七、block

    使用场景

    • 对任务进行逻辑分组,组内任务共享数据和指令

    • 异常处理

    playbook_v19.yaml

    ---- hosts: all tasks:   - name: block task     block:       - debug:           msg: 'start'       - ping:       - debug:           msg: 'end'     when: inventory_hostname == 'localhost'
    

    playbook_v20.yaml

    ---- hosts: mytest tasks:   - name: exception     block:       - command: python -c "import sys; sys.exit(1);"     rescue:       - debug:           msg: 'rescue 1'     always:       - debug:           msg: "always 1"   - name: exception     block:       - command: python -c "import sys; sys.exit(0);"     rescue:       - debug:           msg: 'rescue 2'     always:       - debug:           msg: "always 2"
    

    测试

    ansible _playbook playbook_v19.yaml -i hosts -v
    
    ansible _playbook playbook_v20.yaml -i hosts -v
    

    未完待续......

    公告通知

    Python实战班、自动化运维班、区块链正在招生中

    各位小伙伴们,欢迎试听和咨询:

    相关文章

      网友评论

        本文标题:Ansible 详解(三):Playbooks

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