关于 Ansible
Ansible(https://www.ansible.com/)是一个对运维非常友好的自动化工具,经过数年的开发,它已经具有上千个模块,覆盖了非常多的使用场景。今天,我们的运维工程师,就给大家分享一个维护更新 nginx 配置的用例。
主流 Linux 的新版本里,都可以直接按照 ansible,例如在 Ubuntu 里,可以通过 apt 命令安装:
apt-get install -y ansible
业务场景
我们目前有 8 个大区共 24 台 nginx 服务器,每个区除了 upstream 地址不同,其它配置参数都一样。自从使用了 ansible 来维护更新后,工作变得非常轻松,几分钟内就可以更新所有 24 台服务器的 nginx 配置。并且实现了检查配置有误后,自动恢复上一次配置的机制。
以下就以此为例,展示如何利用 ansible 在自动化部署 nginx 时,如何规避错误的配置。
首先看看我的 nginx role 目录结构
deploy.Nginx/
├── files
│ └── nginx.conf
├── tasks
│ ├── Debian.yml
│ ├── main.yml
│ └── sites_conf_test.yml
└── templates
├── mydomain1_com.j2
└── mydomain1_com.j2
其中,roles/deploy.Nginx/tasks/main.yml 里 include sites_conf_test.yml 的代码片段:
? include: sites_conf_test.yml
vars:
– file: '{{ item }}'
with_items:
– 'mydomain1_com'
– 'mydomain2_com'
这里传递了变量 file 的值给 sites_conf_test.yml,这样我们可以扩展配置多个站点配置文件。每更新一个站点配置,都自动检查配置是否正确。如果正确,则让 nginx 加载新配置。
roles/deploy.Nginx/tasks/sites_conf_test.yml 的代码:
? name: 创建 ~/'{{ file }}.conf'
template:
src: '../templates/{{ file }}.j2'
dest: '~/{{ file }}.conf'
register: createResult
? block:
– name: "拷贝 ~/{{ file }}.conf 到 /etc/nginx/sites-enabled/ 目录"
copy:
src: '~/{{ file }}.conf'
dest: '/etc/nginx/sites-enabled/{{ file }}.conf'
backup: yes
remote_src: yes
register: copyResult
when: createResult.changed
– name: '检查 {{ file }}.conf 是否正确。'
command: nginx -t
when: copyResult.changed
– name: 重新加载 nginx
service:
name: nginx
state: reloaded
rescue:
? name: '{{ file }}.conf 检查失败,回滚到上一个配置.'
copy:
src: '{{ copyResult.backup_file }}'
dest: '/etc/nginx/sites-enabled/{{ file }}.conf'
remote_src: yes
代码解析
首先使用 template 模块,在服务器上生成 nginx 站点的配置文件。然后拷贝进 nginx 站点目录里,并且会把原文件做备份,记录下备份文件的绝对路径。
然后,重点就在这个 block 编排里。第一个 task 是把生成的 mydomain1_com1.conf 文件拷贝到 /etc/nginx/sites-enabled/ 目录下,因为启用了 backup 参数,所以 copyResult 会包含 backup_file 的绝对路径地址名称。这个就用在配置回滚操作中。
第二个 task 就是执行 nginx -t 来确认新配置文件是否正确了。如果失败了,就会触发 rescue 里的任务。我们只需要把备份文件恢复,保证服务器上的配置是好的。
本文暂时没有评论,来添加一个吧(●'◡'●)