ansible 复制程序

您是否曾经想过如何修补系统,重新启动并继续工作?

Ansible ,一个简单的配置管理工具,可以简化一些最艰巨的工作。

例如,系统管理任务可能很复杂,需要数小时才能完成或对安全性有复杂的要求。

以我的经验,成为系统管理员最困难的部分之一就是打补丁系统。 每次收到安全部门强制要求的常见漏洞和披露(CVE)通知或信息保证漏洞警报(IAVA)时,您都必须加倍努力以消除安全漏洞。 (并且,相信我,除非漏洞得到修补,否则您的安全人员会追捕您。)

Ansible可以通过运行打包模块来减少修补系统所需的时间。 为了演示,让我们使用yum模块来更新系统。 Ansible可以从其他位置安装,更新,删除或安装(例如,通过持续集成/持续开发获得的rpmbuild )。 这是更新系统的任务:

- name: update the system
     
     

    yum:
     
     

      name: "*"
     
     

      state: latest

在第一行中,我们给任务取一个有意义的name以便我们知道Ansible在做什么。 在下一行中, yum module更新CentOS虚拟机(VM),然后name: "*"告诉yum更新所有内容,最后state: latest更新到最新RPM。

更新系统后,我们需要重新启动并重新连接:

- name: restart system to reboot to newest kernel
     
     

    shell: "sleep 5 && reboot"
     
     

    async: 1
     
     

    poll: 0
     
     


  - name: wait for 10 seconds
     
     

    pause:
     
     

      seconds: 10
     
     


  - name: wait for the system to reboot
     
     

    wait_for_connection:
     
     

      connect_timeout: 20
     
     

      sleep: 5
     
     

      delay: 5
     
     

      timeout: 60
     
     


  - name: install epel-release
     
     

    yum:
     
     

      name: epel-release
     
     

      state: latest

shell module使系统进入Hibernate状态5秒钟,然后重新启动。 我们使用sleep来防止连接断开,使用async来避免超时,并使用poll来激发并忘记。 我们暂停10秒钟,以等待VM回来,并使用wait_for_connection尽快建立连接,以重新连接到VM。 然后,我们install epel-release以测试RPM安装。 您可以多次运行此剧本以显示idempotent ,由于我们正在使用shell模块,因此唯一显示为已更改的任务是重新启动。 如果不希望实际更改,可以在使用shell模块时使用changed_when: False忽略更改。

到目前为止,我们已经学习了如何更新系统,重新启动VM,重新连接和安装RPM。 接下来,我们将使用Ansible Lightbulb中的角色安装NGINX。

- name: Ensure nginx packages are present
     
     

    yum:
     
     

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

      state: present
     
     

    notify: restart-nginx-service
     
     


  - name: Ensure uwsgi package is present
     
     

    pip:
     
     

      name: uwsgi
     
     

      state: present
     
     

    notify: restart-nginx-service
     
     


  - name: Ensure latest default.conf is present
     
     

    template:
     
     

      src: templates/nginx.conf.j2
     
     

      dest: /etc/nginx/nginx.conf
     
     

      backup: yes
     
     

    notify: restart-nginx-service
     
     


  - name: Ensure latest index.html is present
     
     

    template:
     
     

      src: templates/index.html.j2
     
     

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


  - name: Ensure nginx service is started and enabled
     
     

    service:
     
     

      name: nginx
     
     

      state: started
     
     

      enabled: yes
     
     


  - name: Ensure proper response from localhost can be received
     
     

    uri:
     
     

      url: "http://localhost:80/"
     
     

      return_content: yes
     
     

    register: response
     
     

    until: 'nginx_test_message in response.content'
     
     

    retries: 10
     
     

    delay: 1

以及重新启动nginx服务的处理程序:

# handlers file for nginx-example
     
     

  - name: restart-nginx-service
     
     

    service:
     
     

      name: nginx
     
     

      state: restarted

在这个角色中,我们将安装RPM nginx , python-pip , python-devel和devel并使用PIP安装uwsgi 。 接下来,我们使用template模块复制nginx.conf和index.html以显示页面。 之后,我们确保在启动和启动时启用该服务。 然后,我们使用uri模块检查与页面的连接。

这是一本剧本,显示了更新,重新启动和安装RPM的示例。 然后继续安装nginx。 可以使用所需的任何其他角色/应用程序完成此操作。

- hosts: all
     
     

    roles:
     
     

      - centos-update
     
     

      - nginx-simple

观看此演示视频,以进一步了解该过程。

这只是有关如何更新,重新引导和继续的简单示例。 为了简单起见,我添加了没有变量的软件包。 一旦开始使用大量主机,就需要更改一些设置:

异步和轮询

连载

叉子

这是因为在生产环境中,您可能希望一次更新一个系统(而不是一劳永逸),实际上需要等待更长的时间才能重新引导系统并继续。

有关使用此工具自动执行工作的更多方法,请参阅Opensource.com上的其他Ansible文章 。

ansible 复制程序