写点什么

Ansible 新手指南 - 如何批量管理 NGINX

用户头像
东风微鸣
关注
发布于: 2021 年 01 月 06 日
Ansible 新手指南 - 如何批量管理 NGINX

概述

Ansible 是自动化运维工具,基于 Python 开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible 是基于模块(module)和剧本(playbook)工作.



接下来通过以下几个方面来演示 Ansible 的基本使用:

  1. Linux 配置 SSH 免密

  2. 安装 Ansible

  3. 使用 Ansible 模块

  4. 使用 Ansible Playbook

a.安装并启动 NGINX

b.停止并卸载 NGINX

c.配置 NGINX 并重启

实验环境如下:

  1. 管理端: (安装 Ansible)

a.系统: Debian

b.IP: 192.168.1.1

  1. 远程主机 1 和 2:

a.系统: Ubuntu

b.IP: 192.168.1.106 和 192.168.1.107

备注:

为了方便演示, 以下命令都是基于root用户


免密配置

即: 基于公钥的登陆

# 1. 创建密钥对(创建后默认位于 ~/.ssh)ssh-keygen -t ed25519 -C "Login to nginx lab"# 2. 使用 ssh-copy-id 命令安装公钥ssh-copy-id -i /root/.ssh/id_ed25519 root@192.168.1.106ssh-copy-id -i /root/.ssh/id_ed25519 root@192.168.1.107# 3. 验证免密是否配置成功: (无需输入密码)ssh root@192.168.1.106 -i /root/.ssh/id_ed25519ssh root@192.168.1.107 -i /root/.ssh/id_ed25519
复制代码


 备注:

免密配置有多种情况会导致失败, 本文不一一列举详细失败原因. 如果失败查看远程主机的日志/var/log/secure


安装 Ansible

APT 安装方式如下: (其他类似, 不一一列举)

apt install -y ansible# 验证ansible --version# 输出如下:#ansible 2.2.1.0#  config file = /etc/ansible/ansible.cfg#  configured module search path = Default w/o overrides
复制代码


使用 Ansible 模块

引用:

Ansible 附带了许多模块(module 称为“module library”),这些模块可以直接在远程主机上或通过 playbooks 执行。

用户也可以编写自己的模块。这些模块可以控制系统资源,比如服务、包或文件(实际上是任何东西),或者处理执行系统命令。


先对/etc/ansible/hosts做最基本配置:

[web]192.168.1.106192.168.1.107
复制代码


上文的 web 就是一个 host group, 可以直接通过web进行引用.


ansible-doc

所有的模块的使用方法可以通过以下命令查询:

ansible-doc -s <module_name>ansible-doc -s ping# - name: Try to connect to host, verify a usable python and return `pong' on success.#  action: pingansible-doc -s command#- name: Executes a command on a remote node#  action: command#      chdir                  # cd into this directory before running the command#      creates                # a filename or (since 2.0) glob pattern, when it already #exists, this step will *not* be run.#      executable             # change the shell used to execute the command. Should be #an absolute path to the executable.#      free_form=             # the command module takes a free form command to run.  #There is no parameter actually named 'free form'. See the examples!#      removes                # a filename or (since 2.0) glob pattern, when it does not #exist, this step will *not* be run.#      warn                   # if command warnings are on in ansible.cfg, do not warn #about this particular line if set to no/false.
复制代码


使用 Ansible 模块示例

下面以 command ping module 为例:


ansible web -a "pwd chdir=/tmp"ansible web -m ping
复制代码

输出如下:

# ansible web -a "pwd chdir=/tmp"192.168.1.106 | SUCCESS | rc=0 >>/tmp
192.168.1.107 | SUCCESS | rc=0 >>/tmp
# ansible web -m ping192.168.1.106 | SUCCESS => { "changed": false, "ping": "pong"}192.168.1.107 | SUCCESS => { "changed": false, "ping": "pong"}
复制代码


简单说明

1.web: 在/etc/ansible/hosts中配置的 web 主机组. 包含本次实验的: 远程主机 1 和 2

2.-a "pwd chdir=/tmp"-a MODULE_ARGS 模块的参数.

  • 参数格式为: key=value. 如本例中的: chdir=/tmp

  • pwd 为 shell 命令.

3.-m ping: ansible 命令参数 - 模块, 后跟模块名. (默认为 command). "pong" 表示 ping 成功, 返回不是"pong"则连接异常

.

使用 Ansible Playbook

Playbook(剧本)是使用 ansible 的一种完全不同的形式,非常强大。

简单地说,playbook 是一个非常简单的配置管理和多机部署系统的基础,不像任何已经存在的系统,它非常适合部署复杂的应用程序。

在 ansible-examples git 仓库中, 有一些完整的 playbook 具体展示了这些技术。建议可以看看。


安装并启动 NGINX

创建安装并启动 NGINX 的 Ansible Playbook YAML 文件: vi nginx_install.yml

---- hosts: web  become: true  tasks:    - name: install nginx      apt: name=nginx state=latest    - name: start nginx      service:          name: nginx          state: started
复制代码


简单说明:

  • - hosts: web: 该 playbook 首先说明应将其应用于 inventory 资源中的web主机。

  • become: true: 告诉 Ansible 提升权限(如 sudo)来执行此 playbook 中的所有任务。

  • tasks: 定义实际 tasks(任务)的部分。第一个任务安装 nginx,第二个任务是启动 nginx.


执行:

ansible-playbook nginx_install.yml
复制代码


输出:

PLAY [all] *******************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************ok: [192.168.1.106]ok: [192.168.1.107]
TASK [ensure nginx is at the latest version] *********************************************************************changed: [192.168.1.106]changed: [192.168.1.107]
PLAY RECAP *******************************************************************************************************192.168.1.106 : ok=2 changed=1 unreachable=0 failed=0192.168.1.107 : ok=2 changed=1 unreachable=0 failed=0
复制代码


这时 NGINX 已经安装并启动完毕.

 备注:

下面几个小章节的ansible-playbook 执行结果类似, 就不一一贴出来了.


停止并卸载 NGINX

创建停止并卸载 NGINX 的 Ansible Playbook YAML 文件:

 vi nginx_uninstall.yml

---- hosts: web  tasks:    - name: stop nginx      service:          name: nginx          state: stopped    - name: uninstall nginx      apt: name=nginx state=absent
复制代码

再次执行并查看结果.


配置 NGINX 并重启

步骤如下:

1. 创建一个 nginx conf 的模板文件:

 vi static_site.conf.tpl

server {        listen 80 default_server;        listen [::]:80 default_server;        root /usr/share/nginx/html;        server_name _;        location / {                    index.html index.htm;        }}
复制代码

2. 把以上文件放到/etc/nginx/sites-available/

3. 在/etc/nginx/sites-enabled/里创建个软链接指向该文件.

4. 创建一个index.html页面:

<html>  <head>    <title>Hello ansible</title>  </head>  <body>  <h1>Hello World Ansible</h1>
<p>Running on {{ inventory_hostname }}</p> </body></html>
复制代码

5. 重启 NGINX.


完整 Ansible Playbook

整合之前的安装, 完整的 Ansible Playbook 如下:

vi nginx.yml

---- hosts: web  vars:    src_root: /tmp  tasks:    - name: install nginx      apt: name=nginx state=latest    - name: start nginx      service:          name: nginx          state: started      become: yes    - name: copy nginx conf      copy:        src: {{ src_root }}/static_site.conf.tpl        dest: /etc/nginx/sites-available/static_site.conf      become: yes    - name: create symlink      file:        src: /etc/nginx/sites-available/static_site.conf        dest: /etc/nginx/sites-enabled/000-default.conf        state: link      become: yes    - name: copy the html      copy:        src: {{ src_root }}/index.html        dest: /usr/share/nginx/html/index.html      notify: restart nginx  handlers:    - name: restart nginx      service:        name: nginx        state: restarted      become: yes
复制代码


再次执行并查看结果. 

分别访问:

http://192.168.1.106/ 

http://192.168.1.107/ 

查看 NGINX 运行状态.


简单说明:

index.html页面, 可以通过{{ vars }} 来使用一些变量. 可以使用 ansible 已有的, 也可以使用后续自定义的. 本例中使用的inventory_hostname 为 ansible 自带的变量.

Ansible Playbook - nginx.yml:

  • vars: 定义变量,src_root以后在任务中使用。

  • tasks: 分别为:

安装

启动

复制 NGINX 配置文件

创建软链接

复制 html 文件

  • nofityhandlers: 用notify触发一个在 Ansible 中称为处理程序 - handler的事件,该事件将在下面用于重启 nginx。notify引发事件后,将触发相应的处理程序(restart nginx).


总结

本文通过批量管理 NGINX 这样一个实际案例, 介绍了 Ansible 的基本用法. 你可以在工作中使用类似的语法来创建属于你自己的剧本(playbook)


发布于: 2021 年 01 月 06 日阅读数: 60
用户头像

东风微鸣

关注

资源共享, 天下为公! 2018.11.08 加入

APM行业认证专家, 容器技术认证专家. 现任中国大地保险PAAS平台架构师. 公众号:东风微鸣技术博客

评论

发布
暂无评论
Ansible 新手指南 - 如何批量管理 NGINX