Ansible_02_playbook

@

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

posted @ 2022-04-20 08:16  爱和可乐的w  阅读(46)  评论(0编辑  收藏  举报