在 Ansible 中创建非 root 用户并禁用 root SSH

Jon*_*anR 13 ansible

我正在尝试编写 Ansible 剧本来引导我的服务器。默认情况下,在 Linode 上,我只能使用密码以 root 身份登录,因此我的剧本以 root 身份登录,使用 SSH 密钥创建非 root 用户,并禁用 root 和密码 SSH。

这是一个问题,因为我现在无法再次运行该剧本,因为 root 登录被禁用!我希望剧本是幂等的,并且在引导它们之后不必添加和删除主机。

小智 10

我喜欢这样做:

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: Check ansible user
      command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
      delegate_to: 127.0.0.1
      changed_when: false
      failed_when: false
      register: check_ansible_user
    - block:
      - name: Create Ansible user
        user:
          name: ansible
          comment: "Ansible user"
          password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
          shell: /bin/bash
      - name: Add authorized key
        authorized_key:
          user: ansible
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          exclusive: yes
      - name: Allow sudo for ansible
        copy:
          content: ansible ALL=(ALL) ALL
          dest: /etc/sudoers.d/ansible
          mode: 0600
      when: check_ansible_user | failed
Run Code Online (Sandbox Code Playgroud)

我尝试使用我的 ansible 用户连接到远程主机。如果这是不可能的(在第一次运行时),我以 root 身份连接并创建 ansible 用户及其authorized_keys文件和sudo权限。

在后续运行中,以 ansible 用户身份连接工作,因此可以跳过任务块。

一旦远程主机被引导,我就可以继续使用 ansible 用户并且become

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...
Run Code Online (Sandbox Code Playgroud)


iwa*_*rue 2

我会做以下事情:

  • 创建一个角色(类似于“base”),您可以在其中(除其他外)创建一个合适的用户(和 sudo 规则)供 ansible 使用
  • 创建或调整您的 SSH 角色、进行管理sshd_config(我倾向于建议您使用 来管理整个文件,template但这取决于您),以及禁用 root 登录
  • 让你的SSH角色依赖于基本角色,例如使用meta。

对于第一个角色(基础角色),我倾向于使用类似的东西:

 name: base | local ansible user | create user
  user:
    name: "{{ local_ansible_user }}"
    group: "{{ local_ansible_group }}"
    home: "/home/{{ local_ansible_user }}"
    state: present
    generate_ssh_key: "{{ local_ansible_generate_key }}"
    ssh_key_bits: 4096
    ssh_key_type: rsa
  tags:
    - ansible
    - local_user

- name: base | local ansible user | provision authorised keys
  authorized_key:
    user: "{{ local_ansible_user }}"
    state: present
    key: "{{ item }}"
  with_items: "{{ local_ansible_authorised_keys }}"
  tags:
    - ansible
    - authorised_keys
Run Code Online (Sandbox Code Playgroud)

对于 SSH 配置,我将使用:

- name: openssh | server | create configuration
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0640"
    validate: "/usr/sbin/sshd -tf %s"
  notify:
    - openssh | server | restart
  tags:
    - ssh
    - openssh
Run Code Online (Sandbox Code Playgroud)

Ansible 的角色依赖关系记录在此处

您也可以仅使用剧本中的排序来执行此操作。

在 github 上有一些 ansible 的东西(上面的内容取自其中),如果你想在上下文中查看它