Nginx配置修改工具Ansible

Ansible 是一款自动化的运维工具,是基于 Python 开发的。Ansible 提供了一种自动化执行框架,其可以按照用户设计的剧本自动化执行相关操作。Ansible 是基于模块工作的,其可以实现使用各种模块,并按照设计的剧本,批量对多个目标执行相同的操作。Ansible 集合了众多运维工具的优点,配置更加简单方便。

1、Ansible剧本(playbook)

Ansible 剧本是 Ansible 可以自动化执行一系列动作的执行方式。其通过 YAML 格式文件描述任务步骤,Ansible 按照指定的步骤有序执行,并支持同步和异步,非常适合完成各种复杂的部署工作。Ansible 剧本的相关术语如下。
  • 任务(Tasks),由 YAML 描述的一系列操作步骤。
  • 变量(Variables),被剧本引用,可以使剧本的设计更加灵活,并根据变量的值执行不同的步骤。
  • 模板(Templates),可根据变量的值,动态生成目标文件的预置文件,Ansible 使用 Jinja2 模板语法。
  • 处理器(Handlers),当剧本任务条件满足时,触发执行的任务步骤。
  • 角色(Roles),描述某一特定任务的集合,其由以上术语的 YAML 描述文件组成。
  • 主机(Hosts),被剧本操作的目标主机 IP 或组名称,主机组名称由外部的 hosts 文件定义。

Ansible 中每个剧本只有一个主入口文件,并且只有一个主线任务,主线任务可根据不同条件选用不同的角色,每个角色由任务、变量、模板、处理器的 YAML 描述文件组成。

Ansible 及剧本目录结构如下:
.
├── ansible.cfg                 # ansible配置文件
├── hosts                       # 目标主机资源文件
└── roles                       # 剧本目录,可自定义
    ├── nginx                         # 剧本角色名称及角色任务文件目录
    │   ├── defaults                 # 角色默认变量目录
    │   │   └── main.yaml           # 默认变量自动加载的文件
    │   ├── files                    # 文件存放目录
    │   ├── handlers                 # 处理器任务文件目录
    │   │   └── main.yaml           # 默认处理器任务自动加载的文件
    │   ├── tasks                    # 角色任务文件存放目录
    │   │   └── main.yaml           # 当前角色默认的任务入口文件
    │   └── templates                # 任务模板存放目录
    └── nginx.yaml                    # 剧本入口文件

2、基础语法

1) 步骤描述

任务由多个步骤组成,每个步骤由步骤命名、任务模块、动作组成,配置样例如下:
- name: reload Nginx Service                        # 步骤名
  systemd: "name=nginx state=reloaded enabled=yes"  # 任务模块为systemd,动作是对系统服务
                                                    # Nginx执行reload操作

2) 执行顺序

Ansible 剧本中的步骤是自上而下执行的,在默认情况下,每个步骤的执行结果返回值如果不为 0,就会报错,剧本任务也终止,也可以通过忽略错误指令继续运行,配置样例如下:
- name: Create conf.d
  shell: mkdir -p /etc/nginx/conf.d # 任务模块是shell,动作是执行mkdir命令
  ignore_errors: True               # 如果当前动作执行出错,忽略错误继续执行

3) 变量赋值

Ansible 剧本中变量赋值有静态和动态两种方式,一种是在 defaults 目录的 main.yaml 文件中静态地直接赋值,这通常被用作默认变量的赋值,配置样例如下:
confdir: "/etc/nginx"                           # 定义变量confdir的值为/etc/nginx
另一种是在当前执行的过程中动态地进行变量赋值,被赋值的变量可以在当前剧本执行过程中被引用,配置样例如下所示:
# 方法一:将执行结果动态赋值给变量
  - name: Test Nginx Config
    shell: nginx -c {{ confdir }}/nginx.conf -t     # 任务模块是shell,动作是Nginx
                                                    # 执行-t参数命令
    register: test_result                           # 将执行结果赋值给变量test_result
# 方法二:根据其他变量的值进行动态的变量赋值
  - name: check set_fact output
    set_fact: output="{{ work }}/output"            # 为变量output赋值
    when: test_result                               # 当变量test_result为真时

4) 条件判断

在 Ansible 剧本中可以根据变量的值判断是否执行当前步骤,配置样例如下:
- debug: msg="{{ test_result.stderr_lines }}"   # 任务模块debug,输出变量test_result.
                                                # stderr_lines的内容
  when: not test_result.stderr_lines == ""      # 当test_result变量的输出结果不为空,
                                                # 执行当前步骤

5) 外部引入

多个步骤可以编写在一个 YAML 文件中,并通过指令 include_tasks 被其他任务引入,结合条件判断,它可以使主线任务因变量不同而存在多个不同分支,配置样例如下:
- name: "check system type"
  include_tasks: linux.yaml                         # 引入外部任务步骤
  when: ansible_os_family != "Windows"              # 当目标操作系统非windows时,执行当前
                                                    # 任务

3、剧本执行

Ansible 剧本编写结束后,使用 ansible-playbook 命令调用剧本入口文件执行相应的剧本,即可自动完成预设的任务。

ansible-playbook -i /etc/ansible/hosts /etc/ansible/roles/nginx.yaml --extra-vars 'hosts=192.168.2.145'