程序员自动化互联网科技

Ansible 详解(三):Playbooks

2018-07-04  本文已影响3人  51reboot

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

一、基础应用

二、重用

1、include&import

区别:

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

限制:

--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

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、自定义变量

定义位置

使用语法

使用的位置

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 执行器

控制机器信息

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)

过滤器

格式化

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

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

省略:default(omit)

列表过滤器

集合过滤器

随机数:random

随机排序:shuffle

数学

json 查询:json_query

ip 地址

测试

五、条件语句

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实战班、自动化运维班、区块链正在招生中

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

上一篇下一篇

猜你喜欢

热点阅读