您的位置:首页 > 运维架构 > Linux

如何使用 Ansible 打补丁以及安装应用 | Linux 中国

2018-05-20 11:46 639 查看
使用 Ansible IT 自动化引擎节省更新的时间。
-- Jonathan Lozada De La Matta



致谢
编译自 | https://opensource.com/article/18/3/ansible-patch-systems 
 作者 | Jonathan Lozada De La Matta
 译者 | Hank Chow (HankChow) 🌟 🌟 共计翻译:4 篇 贡献时间:118 天

使用 Ansible IT 自动化引擎节省更新的时间。

你有没有想过,如何打补丁、重启系统,然后继续工作?

如果你的回答是肯定的,那就需要了解一下 Ansible[1] 了。它是一个配置管理工具,对于一些复杂的有时候需要几个小时才能完成的系统管理任务,又或者对安全性有比较高要求的时候,使用 Ansible 能够大大简化工作流程。

以我作为系统管理员的经验,打补丁是一项最有难度的工作。每次遇到公共漏洞批露Common Vulnearbilities and Exposure(CVE)通知或者信息保障漏洞预警Information Assurance Vulnerability Alert(IAVA)时都必须要高度关注安全漏洞,否则安全部门将会严肃追究自己的责任。

使用 Ansible 可以通过运行封装模块[2]以缩短打补丁的时间,下面以 yum 模块[3]更新系统为例,使用 Ansible 可以执行安装、更新、删除、从其它地方安装(例如持续集成/持续开发中的 rpmbuild)。以下是系统更新的任务:

  1.  - name: update the system

  2.    yum:

  3.      name: "*"

  4.      state: latest

在第一行,我们给这个任务命名,这样可以清楚 Ansible 的工作内容。第二行表示使用 yum 模块在CentOS虚拟机中执行更新操作。第三行 name: "*" 表示更新所有程序。最后一行 state: latest 表示更新到最新的 RPM。

系统更新结束之后,需要重新启动并重新连接:

  1.  - name: restart system to reboot to newest kernel

  2.    shell: "sleep 5 && reboot"

  3.    async: 1

  4.    poll: 0

  5.  - name: wait for 10 seconds

  6.    pause:

  7.      seconds: 10

  8.  - name: wait for the system to reboot

  9.    wait_for_connection:

  10.      connect_timeout: 20

  11.      sleep: 5

  12.      delay: 5

  13.      timeout: 60

  14.  - name: install epel-release

  15.    yum:

  16.      name: epel-release

  17.      state: latest

shell 模块中的命令让系统在 5 秒休眠之后重新启动,我们使用 sleep 来保持连接不断开,使用 async 设定最大等待时长以避免发生超时,poll 设置为 0 表示直接执行不需要等待执行结果。暂停 10 秒钟以等待虚拟机恢复,使用 wait_for_connection 在虚拟机恢复连接后尽快连接。随后由 install epel-release 任务检查 RPM 的安装情况。你可以对这个剧本执行多次来验证它的幂等性,唯一会显示造成影响的是重启操作,因为我们使用了 shell 模块。如果不想造成实际的影响,可以在使用 shell 模块的时候 changed_when: False

现在我们已经知道如何对系统进行更新、重启虚拟机、重新连接、安装 RPM 包。下面我们通过 Ansible Lightbulb[4] 来安装 NGINX:

  1.  - name: Ensure nginx packages are present

  2.    yum:

  3.      name: nginx, python-pip, python-devel, devel

  4.      state: present

  5.    notify: restart-nginx-service

  6.  - name: Ensure uwsgi package is present

  7.    pip:

  8.      name: uwsgi

  9.      state: present

  10.    notify: restart-nginx-service

  11.  - name: Ensure latest default.conf is present

  12.    template:

  13.      src: templates/nginx.conf.j2

  14.      dest: /etc/nginx/nginx.conf

  15.      backup: yes

  16.    notify: restart-nginx-service

  17.  - name: Ensure latest index.html is present

  18.    template:

  19.      src: templates/index.html.j2

  20.      dest: /usr/share/nginx/html/index.html

  21.  - name: Ensure nginx service is started and enabled

  22.    service:

  23.      name: nginx

  24.      state: started

  25.      enabled: yes

  26.  - name: Ensure proper response from localhost can be received

  27.    uri:

  28.      url: "http://localhost:80/"

  29.      return_content: yes

  30.    register: response

  31.    until: 'nginx_test_message in response.content'

  32.    retries: 10

  33.    delay: 1

以及用来重启 nginx 服务的操作文件:

  1. # 安装 nginx 的操作文件

  2.  - name: restart-nginx-service

  3.    service:

  4.      name: nginx

  5.      state: restarted

在这个角色里,我们使用 RPM 安装了 nginxpython-pippython-develdevel,用 PIP 安装了 uwsgi,接下来使用 template 模块复制 nginx.conf 和 index.html以显示页面,并确保服务在系统启动时启动。然后就可以使用 uri 模块检查到页面的连接了。

这个是一个系统更新、系统重启、安装 RPM 包的剧本示例,后续可以继续安装 nginx,当然这里可以替换成任何你想要的角色和应用程序。

  1.  - hosts: all

  2.    roles:

  3.      - centos-update

  4.      - nginx-simple

 

这只是关于如何更新系统、重启以及后续工作的示例。简单起见,我只添加了不带变量[5]的包,当你在操作大量主机的时候,你就需要修改其中的一些设置了:

◈ async & poll[6]
◈ serial[7]
◈ forks[8]

这是由于在生产环境中如果你想逐一更新每一台主机的系统,你需要花相当一段时间去等待主机重启才能够继续下去。


via: https://opensource.com/article/18/3/ansible-patch-systems

作者:Jonathan Lozada De La Matta[10] 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: