playbook
playbook:记录Ansibel需配置的服务器和任务列表的文件
1)playbook基于YAML语法构建
2)若首行为“#!/usr/bin/env ansible-palybook
”,则playbook文件可直接执行;
//首行为#!被称为shebang
语法,会将其后的作为解释器(文件路径作为参数)
基础playbook
play
play:构成playbook的基本组成单位
1)playbook就是包含多个play的列表;
2)play必须包含hosts和tasks选项,其他选项可视情况添加;
paly常用选项如下:
选项 | 含义 |
---|---|
hosts | 指定适用tasks的服务器/群组 |
tasks | 指定任务 |
name | 注释 (Ansibel会在运行play前打印注释) |
become | 是否以root身份运行每个任务 |
vars | 定义变量 |
handler | 条件控制机制 |
include | 引用其他playbook/task |
hosts
hosts:指定适用于tasks的服务器/群组
1)指定的服务器/群组需存在于inventory文件中;
2)all
和*
代表所有服务器/群组(默认值all);
Ansible支持以下符号实现服务器的匹配
符号 | 含义 |
---|---|
: | 并集 |
:& | 交集 |
:! | 排除 |
* | 通配符 |
正则表达式 |
1)多种符号可混合使用
变量
vars:定义playbook中变量
1)定义格式(单独占行):变量名:值
2)引用变量格式:“{{ 变量名 }}
”
vars_files:引入包含变量定义的YAML文件
1)引入文件中无需包含vars区段,只需按照格式定义变量;
2)引入文件可被多个playbook文件调用(常用于存储敏感信息);
特殊变量
特殊变量:执行task时由选项产生的变量
(1)register
:值为task运行结果
1)通过register语句指定register变量名(由系统赋值);
2)register变量默认为字典类型(根据模块产生对应的键);
//每个模块的返回结果不同(但均为register变量中的键)
如:通过register语句和debug模块输出task执行结果
1)编写playbook文件;
---
- name: show return value of command module
hosts: WebServers
tasks:
- name: capture output of id command
command: id -un
register: login
- debug: var=login
2)运行结果;
//可通过“.”或“[ ]”引用register变量中键的值(包含特殊符号时只能用后者)
(2)ignore_errors
:是否忽略task中错误,继续执行(True/False)
1)默认执行task遇到错误时,会停止后续所有的操作并返回结果;
(3)gather_facts
:是否收集fact变量(True/False)
1)fact变量:多个变量存储服务器的详细信息(如:IP、CPU和操作系统等)
2)本质:自动调用setup模块收集服务器详细信息(也可手动调用)
3)可在/etc/ansible/facts.d
目录下创建每个服务器特殊的fact变量
4)可通过set_fact模块自定fact变量(先定义后使用)
/etc/ansible/facts.d目录需遵循以下要求:
1)文件后缀一般为“.fact”,但格式必须为.ini或JSON
2)通过ansible_local变量获取各个fact变量(获取字典中键的格式)
如:设置本地fact变量,并获取其值
1)在服务器创建本地fact变量;
2)编写playbook获取本地fact变量;
//ansible_local是字典(其facts.d目录下所有文件均为其键)
内置变量
变量 | 说明 |
---|---|
hostvars | 字典形式存储所有服务器的主机名 (每个键代表一个服务器,且获取其详细信息) |
inventory_hostname | 主机被Ansible识别的名字 (包含域名) |
inventory_hostname_short | 主机被Ansible识别的名字 (不包含域名) |
group_names | 列表形式存储所有群组名 |
groups | 字典形式存储所有群组和服务器对应的关系 (两个特殊群组:all和ungrouped) |
ansible_check_mode | 是否开启check_mode |
ansible_play_batch | 列表形式存储批量执行的inventory主机名 |
ansible_play_hosts | 列表形式存储play涉及的inventory主机名 |
ansible_version | 字典形式存储Ansible版本信息 |
1)若未收集fact变量,则hostvars不可访问fact变量;
tasks
tasks:构成play的基本组成单位
1)每个task最少包含一个键值对(键是模块名,值是传给模块的参数);
2)默认按照字符串格式处理参数(而非字典);
3)建议添加name键,作为注释;
//添加name键后,ansible-playbook可通过–strat-at-task选项指定任务处开始运行
执行task后返回两种结果含义:
1)ok
:服务器状态与模块参数相匹配(不会执行task)
2)changed
:服务器状态与模块参数不匹配(执行task)
常用选项
(1)add_host/group_by
:执行playbook时,向inventory中添加服务器/群组
1)add_host/group_by选项仅在执行playbook时生效(不修改inventory文件);
(2)become
:是否以root身份运行该task
1)优先级高于play中的become选项;
(3)become_user
:是否以指定用户执行该task
1)需指定用户名(且该用户需具有执行该task的足够权限);
(4)environment
:添加/设置变量
1)需以字典形式添加/设置(且可使用已有变量定义新变量)
2)变量定义格式:变量名:值
(5)when
:条件判断语句
1)若指定的变量/值为True,则执行该task(反之跳过)
(6)delegate_to
:仅在指定服务器上运行该task
1)获取变量相关值时,仍是原服务器/群组的;
(7)run_once
:该task是否仅执行一次
1)常用于控制play层级的local_action;
(8)async
:最大可执行时间(秒)
1)超过该时间,则自动终止该task相关的所有进程;
2)必须同时使用register选项记录async的结果;
(9)poll
:指定task的重试时间间隔
1)若设置为0,则异步执行task(执行下个task);
handler
handler:执行特定task后并改变服务器状态,将触发执行的特殊task
1)特定task:含有notify键值对(值为handlers的name键的值);
2)handler仅在所有task成功执行后再执行,且只执行一次;
3)handler按照play中定义顺序执行(非通知顺序);
//handlers无法跨play被触发
如:配置Nginx的playbook(带有TLS)
---
- name: Configure WebServer with nginx and tls
hosts: WebServers
become: True
vars:
key_file: /etc/nginx/ssl/nginx.key
cert_file: /etc/nginx/ssl/nginx.crt
conf_file: /etc/nginx/sites-available/default
server_name: localhost
tasks:
- name: Install nginx
apt: name=nginx update_cache=yes cache_valid_time=3600
- name: create directories for TLS certificates
file: path=/etc/nginx/ssl state=directory
- name: copy TLS key
copy: src=files/nginx.key dest={{ key_file }} owner=root mode=0600
notify: restart nginx
- name: copy TLS certificate
copy: src=files/nginx.crt dest={{ cert_file }}
notify: restart nginx
- name: copy nginx config file
template: src=templates/nginx.conf.j2 dest={{ conf_file }}
notify: restart nginx
- name: enable configuration
file: dest=/etc/nginx/sites-enabled/default src={{ conf_file }} state=link
notify: restart nginx
- name: copy index.html
template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644
handlers:
- name: restart nginx
service: name=nginx state=restarted
handler在每部分task执行完毕后将被触发执行
1)pre_tasks、tasks和post_tasks三者作为3个不同部分的task;
2)先执行完上部分触发的handler,再继续执行下部分tasks;
高级handler
(1)meta:flush_handlers
1)使该task之前触发的handler立刻执行,再继续执行后续tasks(task层级)
(2)listen:字符串
1)定义event,多个handler可同时监听一个evnet(原理等同于notify);
2)listen可解决依赖关系闭关问题(防止出现未定义handler错误);
//常用于解决执行部分handler之前,执行其他task