使用Ansible创建用户并使用认证Pem文件

89次阅读
没有评论

问题描述

在使用Ansible创建客户端机器上的用户时遇到了问题。虽然成功创建了用户并添加了认证文件,但在使用创建的用户SSH到该机器时出现错误。以下是用户的源代码:

---    # This file is used to create a single user or multiple with password
- hosts: hostMachine
  become_method: sudo
  become_user: root
  become: true
  gather_facts: no
  vars_files:
    - ../../../group_vars/required_varlist.yml
  tasks:
    - name: Ensure group is exist
      group:
        name: "{{ item.groups }}"
      with_items:
        - "{{ users }}"
    - name: create a new user without password
      user:
        name: "{{ item.username }}"
        group: "{{ item.groups }}"
        groups: "sudo,{{ item.username }}"
        shell: /bin/bash
        createhome: yes
      with_items:
        - "{{ users }}"
    - name: Add Sudo privileges to user
      command: usermod -aG sudo "{{ item.username }}"
      with_items:
        - "{{ users }}"
    - name: Add user in  sudoders
      shell: sh -c "echo \""{{ item.username }}" ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers"
      with_items:
        - "{{ users }}"
    - name: create directory
      file:
        path: "/home/{{ item.username }}/.ssh"
        state: directory
        mode: 0700
        owner: "{{ item.username }}"
        group: "{{ item.groups }}"
      with_items:
        - "{{ users }}"
    - name: Set Authorized key token from the file
      become: true
      authorized_key:
        user: "{{ item.username }}"
        state: present
        key: "{{ lookup('file', '{{ pem_file_path }}') }}"
        # path: '/etc/ssh/authorized_keys/"{{ item.username }}"'
      with_items:
        - "{{ users }}"
    - name: restart ssh
      service: name=sshd state=restarted

required_varlist.yml文件内容如下:

---    
password: raspberry
users:
  - username: ABC
    groups: ABC
pem_file_path: /home/ubuntu/XYZ.pem

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据回答1,问题可能是您尝试将私钥插入authorized_keys文件中,而实际上只需要在目标机器上使用公钥。
您需要执行以下操作来从私钥中提取公钥:

- name: Generate an OpenSSL public key with a passphrase protected private key
  openssl_publickey:
    path: /tmp/key-{{ item.username }}.pub
    privatekey_path: {{ item.pem_file_path }}
    privatekey_passphrase: ansible
    format: OpenSSH
  with_items:
    - "{{ users }}"

然后使用公钥:

- name: Set Authorized key token from the file
  become: true
  authorized_key:
    user: "{{ item.username }}"
    state: present
    key: "{{ lookup('file', '/tmp/key-{{ item.username }}.pub') }}"
  with_items:
    - "{{ users }}"

方案2

使用脚本或工具来管理密钥可能会增加复杂性,并且需要确保密钥的正确性。
另一种方法是使用脚本或工具来管理密钥。您可以使用ssh-keygen命令生成密钥对,并使用ssh-copy-id命令将公钥复制到目标机器上的authorized_keys文件中。
以下是一个示例脚本,可以在Ansible中使用:

#!/bin/bash
# 生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f /tmp/key
# 将公钥复制到目标机器上
ssh-copy-id -i /tmp/key.pub user@host

在这个示例中,我们使用ssh-keygen命令生成一个RSA密钥对,并将公钥复制到目标机器上的authorized_keys文件中。您需要将your_email@example.com替换为您的电子邮件地址,user@host替换为目标机器的用户名和主机名。
请注意,使用脚本或工具来管理密钥可能会增加复杂性,并且需要确保密钥的正确性。

正文完