懒人管理员的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 身份验证的密钥,在五分钟内,我就有一个系统在线,完全防火墙保护,启用日志记录,配置规范,完全打补丁,启动并为数字超空间提供服务。