介绍
服务器自动化现在在系统管理中起着至关重要的作用,因为现代应用环境的可调用性质。 配置管理 工具如 Ansible 通常用于通过为新服务器建立标准程序来简化服务器设置的自动化过程,同时也减少了与手动设置相关的人为错误。
Ansible提供了一个简单的架构,不需要在节点上安装特殊软件,它还提供了一组强大的功能和内置模块,可方便编写自动化脚本。
本指南解释了如何使用 Ansible 来自动化我们 Ubuntu 18.04 服务器的初始服务器设置指南中的步骤。
前提条件
为了执行我们在本指南中讨论的播放簿提供的自动设置,您将需要:
- One Ansible 控制节点:安装并配置为使用 SSH 键连接您的 Ansible 主机的 Ubuntu 18.04 机器,请确保控制节点具有有 sudo 权限的常规用户和启用防火墙,如我们在 初始服务器设置指南中所解释的那样。
<$>[注] 在继续之前,您需要先确保您的 Ansible 控制节点能够在您的 Ansible 主机(s)上连接和执行命令。
这个 Playbook 能做什么?
此 Ansible 播放本提供了通过 Ubuntu 18.04 初始服务器设置指南和 Ubuntu 18.04 上设置 SSH 密钥的指南中描述的手动运行方法的替代方案。
运行此播放簿将在您的 Ansible 主机上执行以下操作:
安装aptitude
,这是Ansible选择的apt
包管理器的替代方案
。2创建管理组 wheels并将其配置为 passwordless sudo
。3创建一个新的 sudo 用户
。4复制本地 SSH 公共密钥并将其列入远程主机上的新管理用户的authorized_keys
文件
。5禁用对 root用户的基于密码的身份验证
6.安装系统包
7.配置 UFW firewall 仅允许 SSH 连接并拒绝任何其他请求
一旦播放簿完成运行,您将有一个新的用户,您可以使用它来登录服务器。
如何使用这个 Playbook
您需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取初始的服务器设置播放簿及其依赖。
如果这是你第一次使用Do-community/ansible-playbooks
存储库,你应该开始将存储库克隆到你的控制器节点:
1[environment local]
2cd ~
3git clone https://github.com/do-community/ansible-playbooks.git
4cd ansible-playbooks
如果您之前在遵循不同的指南时克隆了此存储库,请访问现有的ansible-playbooks
副本并运行一个git pull
命令,以确保您更新了内容:
1[environment local]
2cd ~/ansible-playbooks
3git pull
我们感兴趣的文件位于 setup_ubuntu1804
文件夹中,其结构如下:
1[environment local]
2setup_ubuntu1804
3├── playbook.yml
4└── vars
5 └── default.yml
以下是这些文件中的每一个是什么:
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
我们将编辑播放簿的变量文件以定制其值。 访问 setup_ubuntu1804
目录,并使用您所选择的命令行编辑器打开 vars/default.yml
文件:
1[environment local]
2cd setup_ubuntu1804
3nano vars/default.yml
此文件包含一些需要您的注意的变量:
1[label vars/default.yml]
2[environment local]
3---
4create_user: sammy
5copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
6sys_packages: [ 'curl', 'vim', 'git', 'ufw']
下列列表包含每个变量的简要解释,以及您可能想要如何更改它们:
create_user
: 将创建的 sudo 用户的名称. 在本示例中,我们将使用 sammy.copy_local_key
: 要复制到远程服务器的本地 SSH 公钥文件的路径,并为新 sudo 用户添加为authorized_key
。 默认值使用了lookup
插件,以获取当前系统用户在 Ansible 控制节点sys_packages
: 包含您希望在您的主机上作为初始服务器设置的一部分安装的软件包列表的路径。
一旦您完成了vars/default.yml
中的变量更新,请保存并关闭此文件. 如果您使用了nano
,请按CTRL + X
,Y
,然后按ENTER
。
您现在已经准备好在一个或多个服务器上运行此播放簿. 大多数播放簿已配置为在您的库存中的每个服务器上执行,默认情况下. 我们可以使用 -l
旗帜来确保只有一个服务器子集或单个服务器受到播放簿的影响。
若要只在「server1」上執行播放簿,以「root」方式連接,您可以使用下列命令:
1[environment local]
2ansible-playbook playbook.yml -l server1 -u root
你会得到类似于此的输出:
1[secondary_label Output]
2
3PLAY [all] *****************************************************************************************************************************
4
5TASK [Gathering Facts] *****************************************************************************************************************
6ok: [server1]
7
8TASK [Install Prerequisites] ***********************************************************************************************************
9changed: [server1]
10
11TASK [Make sure we have a 'wheel' group] ***********************************************************************************************
12changed: [server1]
13
14TASK [Allow 'wheel' group to have passwordless sudo] ***********************************************************************************
15changed: [server1]
16
17TASK [Create a new regular user with sudo privileges] **********************************************************************************
18changed: [server1]
19
20TASK [Set authorized key for remote user] **********************************************************************************************
21changed: [server1]
22
23TASK [Disable password authentication for root] ****************************************************************************************
24changed: [server1]
25
26TASK [Update apt] **********************************************************************************************************************
27changed: [server1]
28
29TASK [Install required system packages] ************************************************************************************************
30ok: [server1]
31
32TASK [UFW - Allow SSH connections] *****************************************************************************************************
33changed: [server1]
34
35TASK [UFW - Deny all other incoming traffic by default] ********************************************************************************
36changed: [server1]
37
38PLAY RECAP *****************************************************************************************************************************
39server1 : ok=11 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
<$>[注] 注:有关如何运行 Ansible 播放本的更多信息,请参阅我们的 Ansible Cheat Sheet Guide。
播放簿執行完成後,您將能夠登入伺服器:
1[environment local]
2ssh sammy@server_host_or_IP
请记住,用create_user
变量定义的用户代替sammy,用服务器的主机名称或IP地址代替server_host_or_IP。
如果您更改了「copy_local_key」变量,以指向自定义的 SSH 密钥(而不是当前系统用户的密钥),则在通过 SSH 作为新用户连接时,您需要提供一个额外的参数,指定其私钥对象的位置:
1[environment local]
2ssh sammy@server_host_or_IP -i ~/.ssh/ansible_controller_key
在登录到服务器后,您可以检查UFW防火墙的活跃规则,以确认它是否正确配置:
1[environment second]
2sudo ufw status
你应该得到类似于此的输出:
1[secondary_label Output]
2[environment second]
3Status: active
4
5To Action From
6-- ------ ----
7OpenSSH ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
这意味着UFW防火墙已成功启用,因为这是播放书中的最后一项任务,它确认播放书已在这个服务器上完全执行。
剧本内容
您可以在 ansible-playbooks repository中找到本教程中介绍的初始服务器设置播放簿,在 DigitalOcean Community Playbooks中找到。
播放书的完整内容以及相关文件也包括在这里,以便您方便。
首选 / 默认.yml
Default.yml
变量文件包含在播放簿任务中使用的值,例如将创建的用户名和作为初始服务器设置的一部分安装的包。
1[label vars/default.yml]
2[environment local]
3---
4create_user: sammy
5copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
6sys_packages: [ 'curl', 'vim', 'git', 'ufw']
图书馆.yml
该playbook.yml
文件定义了此设置中的所有任务,它从定义该设置的目标服务器组(所有
)开始,然后它使用become: true
来定义任务应该默认执行的特权升级(sudo
)然后,它包括vars/default.yml
变量文件来加载配置选项。
1[label playbook.yml]
2[environment local]
3---
4- hosts: all
5 become: true
6 vars_files:
7 - vars/default.yml
8
9 tasks:
10 - name: Install Prerequisites
11 apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
12
13 # Sudo Group Setup
14 - name: Make sure we have a 'wheel' group
15 group:
16 name: wheel
17 state: present
18
19 - name: Allow 'wheel' group to have passwordless sudo
20 lineinfile:
21 path: /etc/sudoers
22 state: present
23 regexp: '^%wheel'
24 line: '%wheel ALL=(ALL) NOPASSWD: ALL'
25 validate: '/usr/sbin/visudo -cf %s'
26
27 # User + Key Setup
28 - name: Create a new regular user with sudo privileges
29 user:
30 name: "{{ create_user }}"
31 state: present
32 groups: wheel
33 append: true
34 create_home: true
35 shell: /bin/bash
36
37 - name: Set authorized key for remote user
38 authorized_key:
39 user: "{{ create_user }}"
40 state: present
41 key: "{{ copy_local_key }}"
42
43 - name: Disable password authentication for root
44 lineinfile:
45 path: /etc/ssh/sshd_config
46 state: present
47 regexp: '^#?PermitRootLogin'
48 line: 'PermitRootLogin prohibit-password'
49
50 # Install Packages
51 - name: Update apt
52 apt: update_cache=yes
53
54 - name: Install required system packages
55 apt: name={{ sys_packages }} state=latest
56
57 # UFW Setup
58 - name: UFW - Allow SSH connections
59 ufw:
60 rule: allow
61 name: OpenSSH
62
63 - name: UFW - Deny all other incoming traffic by default
64 ufw:
65 state: enabled
66 policy: deny
67 direction: incoming
您可以自由地修改本图书或添加新的任务,以便在您自己的工作流程中最适合您的个性化需求。
结论
自动化初始服务器设置可以节省时间,同时确保您的服务器遵循标准配置,可以根据您的需求进行改进和定制。
在本指南中,我们展示了如何使用Ansible来自动化在新服务器上执行的初始任务,例如创建具有sudo访问的非根用户、启用UFW和禁用基于远程密码的根登录。
如果您想在本图书中添加新任务,以进一步定制初始服务器设置,请参阅我们介绍的 Ansible 指南 配置管理 101:编写 Ansible 图书。