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实战班、自动化运维班、区块链正在招生中
各位小伙伴们,欢迎试听和咨询:
网友评论