介绍
服务器自动化现在在系统管理中起着至关重要的作用,因为现代应用环境的可调用性质。 配置管理 工具如 Ansible 通常用于通过为新服务器建立标准程序来简化服务器设置的自动化过程,同时也减少了与手动设置相关的人为错误。
Ansible提供了一个简单的架构,不需要在节点上安装特殊软件,它还提供了一组强大的功能和内置模块,可方便编写自动化脚本。
本指南解释了如何使用 Ansible 来自动化我们 Rocky Linux 9 服务器的初始服务器设置指南中的步骤。
前提条件
要遵循这个教程,你需要:
- ** One Ansible Control node**:一款装有Ansible的Rocky Linux 9机并安装和配置,使用SSH密钥连接到您的Ansible主机. 如我们初始服务器设置指南所解释的,确保控制节点有一个具有sudo权限的正则用户并启用了防火墙. 要设置Ansible,请参见我们关于如何安装和配置Locky Linux 9的指南步骤一. 您通常不需要从完全相同的Linux版本安装到同一个目标版本(例如,从Locky Linux 9到此情况下的Locky Linux 9),但为了演示目的,它保持了一切一致. () ( )* ** 一个安装有Locky Linux 9的远程服务器**:此服务器不需要事先设置,但您必须从上面提到的Ansible控制节点获得SSH访问此服务器的权限. 如果您还没有从 Ansible 控制节点访问远程服务器的 SSH 权限, 请参考我们在 [如何设置 SSH 密钥] (https://andsky.com/tech/tutorials/how-to-set-up-ssh-keys-on-rocky-linux-9 ) 上的教程 。 此服务器将成为一个 Ansible 主机远程服务器, 由 Ansible 控制节点自动提供 。 () (英语)
这个 Playbook 能做什么?
这个 Ansible 演示本提供了通过 Rocky Linux 9 初始服务器设置指南和 Rocky Linux 9 上设置 SSH 密钥的指南中描述的程序手动运行的替代方案,每次你启动服务器。
运行此播放簿将在您的 Ansible 主机上执行以下操作:
- 创建一个新的 sudo用户并设置无密码的
sudo
. - 复制一个本地 SSH 公共密钥,并将其包含在远程主机上的新的管理用户的
autorized_keys
文件中(如果您以前使用过 SSH 的密码)。 - 禁用 root 用户的基于密码的身份验证
- 安装系统包
一旦播放簿完成运行,您将有一个新的用户,您可以使用它来登录服务器。
首先,在您的 Ansible 控制节点服务器上登录一个具有sudo
功能的用户。
步骤 1 – 准备您的 Ansible 控制节点
在您的 Ansible 控制节点服务器上,将您的 Ansible 远程主机服务器的 IP 添加到您的 Ansible 库存文件中。
1sudo vi /etc/ansible/hosts
将您的 Ansible 库存文件打开. 将您的 Ansible 远程主机服务器的 IP 添加到[服务器]
块中:
1[label /etc/ansible/hosts]
2[servers]
3server1 ansible_host=your_remote_server_ip
4
5. . .
保存并关闭文件。
现在,您将测试并验证此 Ansible 控制节点与您的 Ansible 远程主机服务器之间的 SSH 连接:
1ssh root@your_remote_server_ip
接受身份验证请求,并在提示时输入您的密码.一旦您验证了 SSH 连接,请按CTRL+D
关闭连接并返回控制节点。
步骤2 - 准备你的剧本
「playbook.yml」文件是您所有 tasks 都定义的文件。 任务是您可以使用 Ansible 播放簿自动化操作的最小单位。 使用「vi」或您喜爱的文本编辑器创建播放簿文件:
1vi playbook.yml
这样会打开一个空的 YAML 文件. 在进入将任务添加到播放簿之前,请先添加以下内容:
1[label playbook.yml]
2---
3- hosts: all
4 become: true
5 vars:
6 created_username: sammy
您可以自由地用您选择的用户名更换。
几乎每本你遇到的读本都会以类似的声明开始。‘主机’声明了 Ansible 控制节点将针对该读本的哪些服务器。
vars
允许您将数据存储为变量. 如果您决定在未来更改这个用户名,您只需要在文件中编辑这个单行。
<$>[注] 注: 如果你想看到播放本文件的最终完成状态,跳到 步骤 6。
步骤 3 — 将 Sudo 用户设置任务添加到您的 Playbook
默认情况下,Ansible 会将任务同步执行,顺序从播放簿的顶部到底部,这意味着任务排序很重要,您可以安全地假设一个任务在下一个任务开始之前完成执行。
本剧本中的所有任务都可以单独站立,并在你的其他剧本中重复使用。
避免广泛使用 root用户是很好的做法,您可以通过添加:自动创建获得sudo
特权的用户:
1[label playbook.yml]
2 tasks:
3 - name: Setup passwordless sudo
4 lineinfile:
5 path: /etc/sudoers
6 state: present
7 regexp: '^%sudo'
8 line: '%sudo ALL=(ALL) NOPASSWD: ALL'
9 validate: '/usr/sbin/visudo -cf %s'
10
11 - name: Create a new regular user with sudo privileges
12 user:
13 name: "{{ created_username }}"
14 state: present
15 groups: wheel
16 append: true
17 create_home: true
您正在使用lineinfile
Ansible 模块来瞄准并替换文件中的特定行. 在这种情况下,您正在使用 regex 瞄准sudoers
文件中的特定行,然后修改它以允许sudo
的无密码使用。
为了利用这一点,您正在使用用户
模块添加一个新用户。Ansible将确保这个用户被创建,如果不是已经存在的,则该用户属于轮
(admin)组,而不是从其他组中删除,并创建一个主目录。
<$>[注] 注: 请确保您包含指示变量的曲线周围的引文。
步骤 4 – 将 SSH 密钥设置添加到 Playbook 并禁用根密码任务
Ansible 在假设您正在使用 SSH 密钥的情况下运行。强烈建议并通常是良好的做法,将 SSH 密钥的使用与禁用 root 密码身份验证结合起来。
1[label playbook.yml]
2 - name: Set authorized key for remote user
3 ansible.posix.authorized_key:
4 user: "{{ created_username }}"
5 state: present
6 key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
7
8 - name: Disable password authentication for root
9 lineinfile:
10 path: /etc/ssh/sshd_config
11 state: present
12 regexp: '^#?PermitRootLogin'
13 line: 'PermitRootLogin prohibit-password'
如果您提供用户名和密钥的位置,则可以使用autorized_key
模块,在这里,使用Ansible的lookup
函数构建了通往密钥的路径。
lineinfile
模块用于搜索和替换sshd_config
中的行,以禁用 root的密码身份验证,限制其权限以增强安全性。
步骤 5 — 将包装安装任务添加到您的 Playbook
Ansible可以确保某些软件包始终安装在您的服务器上,而不是在每个单个软件包上调用dnf install
或将其分成多个任务,您可以列出您想要的所有软件包:
1[label playbook.yml]
2 - name: Update and install required system packages
3 dnf:
4 pkg:
5 - curl
6 - vim
7 - git
8 - firewalld
9 state: latest
10 update_cache: true
您可以添加或删除您喜欢的包. 这将确保所有包不仅存在,而且在最新版本上,并且在呼叫dnf
的更新后完成。
步骤6 - 审查您的完整游戏簿
您的播放簿应该大致如下,根据您的自定义而有所不同:
1[label playbook.yml]
2---
3- hosts: all
4 become: true
5 vars:
6 created_username: sammy
7
8 tasks:
9 - name: Setup passwordless sudo
10 lineinfile:
11 path: /etc/sudoers
12 state: present
13 regexp: '^%sudo'
14 line: '%sudo ALL=(ALL) NOPASSWD: ALL'
15 validate: '/usr/sbin/visudo -cf %s'
16
17 - name: Create a new regular user with sudo privileges
18 user:
19 name: "{{ created_username }}"
20 state: present
21 groups: wheel
22 append: true
23 create_home: true
24
25 - name: Set authorized key for remote user
26 ansible.posix.authorized_key:
27 user: "{{ created_username }}"
28 state: present
29 key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
30
31 - name: Disable password authentication for root
32 lineinfile:
33 path: /etc/ssh/sshd_config
34 state: present
35 regexp: '^#?PermitRootLogin'
36 line: 'PermitRootLogin prohibit-password'
37
38 - name: Update and install required system packages
39 dnf:
40 pkg:
41 - curl
42 - vim
43 - git
44 - firewalld
45 state: latest
46 update_cache: true
<$>[注] 注: 这是一个温和的提醒,要记住你的入口。如果你遇到错误,这很可能是罪魁祸首。YAML建议使用2个空间作为入口,正如本例所做的。
一旦您对播放书满意,您可以退出文本编辑器并保存。
步骤7 – 首次运行 Playbook
您现在已经准备好在一个或多个服务器上运行此播放簿. 大多数播放簿默认配置为在您的库存中的每个服务器上执行,但您将此时指定您的服务器。
若要只在「server1」上執行播放簿,以「root」方式連接,您可以使用下列命令:
1[environment local]
2ansible-playbook playbook.yml -l server1 -u root -k
-l
旗指明您的服务器,而-u
旗指明哪些用户要登录远程服务器. 由于您尚未设置远程服务器, root是您唯一的选择。
你会得到类似于此的输出:
1[secondary_label Output]
2
3. . .
4
5PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
6server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这表明您的服务器设置已经完成!您的输出不一定完全相同,但重要的是您有零故障。
现在你已经完成了播放本的第一个设置,所有后续的面向呼叫都可以用用户sammy
进行(如果你首先使用了密码,那么没有-k
旗):
1[environment local]
2ansible-playbook playbook.yml -l server1 -u sammy
您还将能够登录到服务器:
1[environment local]
2ssh sammy@your_remote_server_ip
请记住,用created_username
变量定义的用户代替 sammy,并用服务器的主机名或 IP 地址代替 server_host_or_IP。
结论
自动化初始服务器设置可以节省时间,同时确保您的服务器遵循标准配置,可以根据您的需求进行改进和定制。
在本指南中,您展示了如何使用Ansible来自动化在新服务器上执行的初始任务,例如创建具有sudo
访问的非root用户,安装包,并禁用基于密码的远程 root登录。
有关如何运行 Ansible 播放簿的更多信息,请参阅我们的 Ansible Cheat Sheet Guide。
如果您想在本图书中添加新任务,以进一步定制初始服务器设置,请参阅我们介绍的 Ansible 指南 配置管理 101:编写 Ansible 图书。