懒人管理员的Ansible自动化配置指南

本文介绍了Ansible在系统管理中的实用功能,包括通过ad-hoc命令检查软件版本、使用YAML playbook自动化软件更新、SSH配置部署以及集成iptables、fail2ban和filebeat等安全工具的实现方法。

懒人管理员的Ansible

注意: 本博文中引用的技术和工具可能已过时,不适用于当前环境。但本文仍可作为学习机会,并可能更新或集成到现代工具和技术中。

对于懒惰的服务器和系统管理员来说,自动化那些无聊的功能,如更新软件包、查找过时的软件包、检查扫描等,Ansible 有一些非常不错的功能。以下是我发现的一些非常有用的功能的快速分解(全文中有用的内容以粗体显示)。

首先,帮自己一个忙,运行一下最佳实践——此处。这款软件有用且令人惊叹的原因有很多,最好总结为基于无代理 SSH 密钥认证的系统管理。对于注重安全的管理员,请查看“CSC 2:授权和未授权软件清单”——此处。假设我们只批准特定的内核版本,并且需要知道是否有服务器不符合批准:

1
2
3
4
5
system:~$ ansible droplets -m shell -a "dpkg -l |grep linux-image*" -u ansible -K
ii  linux-image-3.13.0-85-generic        3.13.0-85.129                amd64                         
Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-85-generic 3.13.0-85.129                amd64                         
Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP

或者,如果我们有一个版本的每个人第二喜欢的文本编辑器在最近的 CVE 中被识别:

1
2
3
4
5
system:~$ ansible droplets -m shell -a "dpkg -l |grep nano" -u ansible -K
11.22.33.44 | SUCCESS | rc=0 >>
ii  nano    2.2.6-1ubuntu1    amd64    small, friendly text editor inspired by Pico
33.44.55.66 | SUCCESS | rc=0 >>
ii  nano     2.2.6-1ubuntu1    amd64    small, friendly text editor inspired by Pico

上述分块命令被认为是ad-hoc。让我们看一下 YAML 文件,看看 playbook 是什么样子。Playbook 可以针对所有主机或子集运行,具体取决于您的 hosts.conf 文件。这是一个用于更新所有软件包的特定 apt .yml 文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
---
- hosts: all
  become: yes
  tasks:
   - name: Check if there are packages available to be installed/upgraded
     command: apt-get upgrade --simulate
     register: apt_upgrade_check
     changed_when: apt_upgrade_check.stdout != ""
   - name: Upgrade all packages to the latest version
     apt: upgrade=dist update_cache=yes
     when: apt_upgrade_check.stdout != ""
   - name: Check if a reboot is required
     shell: "[ -f /var/run/reboot-required ]"
     register: reboot_required
     ignore_errors: yes
   - name: Reboot the server
     command: shutdown -r now "Ansible reboot"
     when: reboot_required.rc == 0

不可能这么简单吧?我可以一次在所有服务器上运行这个吗?是的,让我们来做吧!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
system:/etc/ansible$ ansible-playbook -l droplets roles/common/tasks/apt.yml -u ansible -K
PLAY [all] *********************************************************************
TASK [setup] ******************************************************************
ok: [11.22.33.44]
ok: [33.44.55.66]
TASK [Check if there are packages available to be installed/upgraded] **********
changed: [11.22.33.44]    ###changed here means apt-get upgrade
changed: [33.44.55.66]
TASK [Upgrade all packages to the latest version] ******************************
changed: [11.22.33.44]    ###changed here means apt-get upgrade
changed: [33.44.55.66]
TASK [Check if a reboot is required] *******************************************
ok: [11.22.33.44]
ok: [33.44.55.66]
TASK [Reboot the server] *******************************************************
skipping: [11.22.33.44]
skipping: [33.44.55.66]
PLAY RECAP *********************************************************************
11.22.33.44         : ok=4        changed=2        unreachable=0        failed=0  
33.44.55.66         : ok=4        changed=2        unreachable=0        failed=0  

好吧,那很好,但重启和快速检查运行时间呢?这些 .yml 文件超级简单,非常有用且极其方便。再次强调,如果您懒惰且不想碰太多东西,您可能想开始深入研究 Ansible 的功能。

这些命令:

1
2
system:/etc/ansible$ ansible-playbook -l droplets roles/common/tasks/reboot.yml -u ansible -K
system:/etc/ansible$ ansible-playbook -l droplets roles/common/tasks/uptime.yml -u ansible -K

接下来,假设我有一个非常标准的方式在服务器上部署 ssh,并且我希望它超级简单。我的 ssh.yml 文件将如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
---
- hosts: all
  become: yes
  tasks:
   - name: configure ssh options to system spec
     template: src=/etc/ansible/roles/common/templates/ssh.conf.j2 dest=/etc/ssh/sshd_config
     notify:
        - restart ssh
        - force ssh update
     tags: ssh
   - name: be sure ssh is running and restarted
     service: name=ssh state=restarted enabled=yes
     tags: ssh

注意 ssh.conf.j2 – 这是使用 Ansible 部署模板的标准。我还投入了相当多的时间创建类似的 YAML 文件来部署 ntp、fail2ban、filebeat、sendmail、nginx 和许多其他软件包。到目前为止,我最喜欢的一个,并且让我赢得了最懒之最的称号,它结合了 iptables 通过白名单过滤服务器访问服务,然后部署 fail2ban 与通用的 jail.local 文件来阻止对各种服务的恶意身份验证尝试。最后,它通过防火墙端口将完全 TLS 启用的 filebeat 记录器转储到 elk 堆栈中!

Iptables:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
---
- hosts: all  
  become: yes
  tasks:
   - name: CAREFUL ## deploy canned iptables ruleset ## CAREFUL
     copy: src=/etc/ansible/roles/common/templates/iptables.rules.j2 dest=/etc/iptables.rules
     tags: iptables
   - name: CAREFUL ## deploy firewall u+x file to enable iptables rules ## CAREFUL
     copy: src=/etc/ansible/roles/common/templates/firewall.j2 dest=/etc/network/if-up.d/firewall mode="a+x"
     tags: firewall

Fail2ban:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
---
- hosts: all
  become: yes
  tasks:
      - name: Install fail2ban
        apt: pkg=fail2ban state=installed update-cache=yes
        register: fail2ban_install
        tags: fail2ban
        - name: Install config
        template: src=jail.local.j2 dest=/etc/fail2ban/jail.local
        notify:
          - reload fail2ban

Filebeat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
- hosts: all
  become: yes
  tasks:
   - name: add apt_key for filebeat
     apt_key: url=https://packages.elasticsearch.org/GPG-KEY-elasticsearch state=present
     tags: apt_key filebeat
   - name: add apt_repo for elastic software
     apt_repository:
        repo: "deb https://packages.elastic.co/beats/apt stable main"
     tags: filebeat repo         

   - name: install filebeat
     apt: pkg=filebeat state=installed update_cache=true
     tags: filebeat
   - name: create remote directory structure /etc/pki/tls/certs
     file: path=/etc/pki/tls/certs state=directory mode=0755
     tags: filebeat tls directories 

   - name: copy over the tls verification cert for secure logging
     copy: src=/etc/ansible/roles/common/files/logstash-forwarder.crt dest=/etc/pki/tls/certs mode=0755
     notify:
        - restart filebeat
     tags: filebeat
   - name: deploy standardized internal network config via template
     template: src=/etc/ansible/roles/common/templates/filebeat.conf.j2 dest=/etc/filebeat/filebeat.yml
     tags: filebeat config template
   - name: be sure filebeat is running
     service: name=filebeat state=restarted enabled=yes
     tags: filebeat

基本上,从 Linux 管理的角度来看,Ansible 是一个绝佳的选择。我们刚刚在这里经历的内容基本上仍然是完全 ad-hoc 的 – 我启动一个服务器,创建一个名为 Ansible 的新用户,添加一些密钥进行身份验证,并开始运行 playbook 和命令脚本。更好的是,我们可以使用角色来为我们完成几乎所有这些事情,如果我们使用 AWS 或 Digital Ocean。甚至更好的是,我们可以预烘焙密钥和用户。如果您达到这一点,请查看最后一个超链接 – 它描述了如何将所有 .yml 脚本烘焙到单个 playbook 中,用作“引导程序”。构建一个 Linux 盒子,添加一个用于 Ansible 身份验证的密钥,在五分钟内,我就有一个系统在线,完全防火墙保护,启用日志记录,配置规范,完全打补丁,启动并为数字超空间提供服务。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计