在 Ansible 中从头开始配置服务器

Provision server from the ground up in Ansible

我需要使用 Ansible 配置一个非常新的 Ubuntu 服务器。一开始它只有 root 用户和生成的密码。我需要做的第一个动作是创建一个 service 用户,为其设置密码,可选地,上传我本地用户的密钥(这样我就可以不用密码登录)并禁用 root 登录.然后我需要 运行 作为 service 用户的角色。我怎样才能在一本剧本中做到这一点(例如 signle ansible-playbook provision.yml 而不是 ansible-playbook init.yml && ansible-playbook apply_roles.yml)?问题是我需要在创建 service 之后在某处切换用户,然后(以及所有以后的登录)我需要以他的身份登录。

将此主机的 ansible_user 配置为 service 并且只覆盖一次(到 root)用于初始设置是否是个好主意?有什么最佳做法吗?

您可以在一个剧本中包含多个剧本。为您希望 运行 作为 root 的任务创建一个游戏,为应该 运行 作为服务的角色创建另一个游戏:

- hosts: all
  remote_user: root
  tasks:
  # your tasks here

- hosts: all
  remote_user: service
  roles:
  - your_role

如果没记错的话,Ubuntu 实例从生成的根用户和本地用户开始 with access to sudo

我认为最干净的方法是首先通过 bash 脚本安装本地用户的密钥,通过:

ssh-copy-id <server>

(如果该命令可从您 运行 ansible 所在的命令行获得)

然后在 bash 脚本中的那一行之后继续 运行 你的 Ansible 脚本。

(虽然我认为也可以将本地用户的信用存储在ansible vault中..我还没有使用过保险库,所以我不太熟悉它。)

我会在启动文件中指定服务用户(如 become_user ) or via ansible_user in the inventory, as you said. ( But you may run into issues with doing that according to this older issue。)

如果我使用启动文件来指定用户,该文件将有一个角色(比方说 web-server ),并且该角色将有一个 dependency(比方说 common )。

在普通角色中,我将执行一项任务,使用服务用户(设置为 ignore errors)尝试执行具有已知结果的命令。如果该任务没有 return 预期结果,我将创建服务用户并将该服务用户的密钥复制到服务器。涉及的每个任务都需要将 become_user 覆盖到本地用户。

执行该角色依赖后,主要角色将随之执行,所有剩余任务应作为服务用户执行。