Ansible 플레이북은 SSH를 통해 원격 사용자에 연결할 수 없습니다. => 연결할 수 없고 권한이 거부되었습니다.

Ansible 플레이북은 SSH를 통해 원격 사용자에 연결할 수 없습니다. => 연결할 수 없고 권한이 거부되었습니다.

저는 bash 스크립트와 Ansible 플레이북을 사용하여 vps(ubuntu 22.04)를 설정하고 강화하기 위한 완전한 솔루션을 구축하고 있습니다. 내가하고 싶은 일은 다음과 같습니다.

  1. sudo 권한이 있는 사용자 정의 그룹 "sudogroup" 생성
  2. 이 그룹에 새 사용자 "sudouser"를 만듭니다.
  3. 키 쌍을 사용하여 이 사용자에 대한 보안 SSH 연결
  4. "root" 대신 "sudouser"로 Ansible 플레이북을 실행합니다.

나는 다음과 같이 이것을하고 있습니다배시 스크립트:

#------------------------------------------------------------------------------
# Prepare Vars
#------------------------------------------------------------------------------
# Remote Server Machine
IPSERVER="XXX.XXX.XXX.XXX"
ROOTUSER_NAME="root"
ROOTUSER_PASSWORD="password1"
#------------------------------------------------------------------------------
# Sudo Group & User
SUDOGROUP="sudogroup"
SUDOUSER_NAME="sudouser"
SUDOUSER_PASSWORD="password2"
#------------------------------------------------------------------------------
# SSH Connections
SSHROOTPASS=$ROOTUSER_PASSWORD
SSHCRYPTALGO="ecdsa"    # rsa (regular) - dsa (not recommanded) - ecdsa (best)
SSHCRYPTBYTES="521"     # Strongest: [rsa : 4096] - [dsa: 1024] - [ecdsa: 521]
SSHFILENAME="id_$SSHCRYPTALGO"
#------------------------------------------------------------------------------
# SSH Connections
SSHCRYPTALGO="ecdsa"    # rsa (regular) - dsa (not recommanded) - ecdsa (best)
SSHCRYPTBYTES="521"     # rsa : 4096 - dsa: 1024 - ecdsa: 521
SSHPORT="22"
SSHROOTCONN="$ROOTUSER_NAME@$IPSERVER"
SSHROOTPASS=$ROOTUSER_PASSWORD
SSHROOTOPTIONS="-p $SSHPORT -tt -o StrictHostKeyChecking=no -o BatchMode=no"
SSHROOTFILENAME="id_$SSHCRYPTALGO"
SSHADMCONN="$SUDOUSER_NAME@$IPSERVER"
SSHADMPASS=$SUDOUSER_PASSWORD
SSHADMFILENAME="id_"$SSHCRYPTALGO"_"$SUDOUSER_NAME
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
# Create a hidden [/home/$SUDOUSER_NAME/.ssh] directory to store SSL keys
sudo mkdir -p ~/.ssh
sudo chmod 700 ~/.ssh
#------------------------------------------------------------------------------
# Register Remote Server IP in known hosts
sudo ssh-keyscan -H $IPSERVER >> ~/.ssh/known_hosts

#------------------------------------------------------------------------------
# Create a new SUDO privileged users group & new User on remote server
#------------------------------------------------------------------------------
sshpass -p "$SSHROOTPASS" ssh $SSHROOTOPTIONS $SSHROOTCONN "bash -s" << ENDSSH01
  stty -echo
  # Backup [sudoers] configuration file to recover, just in case
  cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
  #------------------------------------------------------------------------------
  # Create a new group of users
  groupadd $SUDOGROUP
  #------------------------------------------------------------------------------
  # Add [$SUDOGROUP] to [sudoers] configuration file
  echo "%$SUDOGROUP ALL=(ALL:ALL) ALL" >> /etc/sudoers
  #------------------------------------------------------------------------------
  # Create a new sudo User named [$SUDOUSER_NAME]
  useradd -m -s /bin/bash -g $SUDOGROUP $SUDOUSER_NAME
  #------------------------------------------------------------------------------
  # Set password of the new sudo User named [$SUDOUSER_NAME]
  echo "$SUDOUSER_NAME:$SUDOUSER_PASSWORD" | chpasswd
  #------------------------------------------------------------------------------
  stty echo
  exit
ENDSSH01
#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
# Setup SSH Connection between local Client and remote Server
#------------------------------------------------------------------------------
# Create SSH Keys pair for [sudouser]
sudo ssh-keygen -t $SSHCRYPTALGO -b $SSHCRYPTBYTES -N "" -f ~/.ssh/$SSHADMFILENAME <<< y
sudo ssh-copy-id -i ~/.ssh/$SSHADMFILENAME.pub $SUDOUSER_NAME@$IPSERVER -o StrictHostKeyChecking=no
#------------------------------------------------------------------------------
# Send a PING to the remote server to check SSH Connection to [sudouser]
sudo ansible all -i inventory -m ping --private-key=~/.ssh/$SSHADMFILENAME
#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
# Execute Ansible Playbook to setup remote Ubuntu 18/20/22 Remote Server
#------------------------------------------------------------------------------
sudo ansible-playbook -i inventory setup_server.yml --private-key=~/.ssh/$SSHADMFILENAME
#------------------------------------------------------------------------------

그만큼앤서블 인벤토리파일:

[OURVPS]
195.179.193.224

그만큼앤서블 플레이북다음과 같이 시작합니다:

#------------------------------------------------------------------------------
# ANSIBLE PLAYBOOK
#------------------------------------------------------------------------------
- name: SETUP UBUNTU 22.04 SERVER / VPS
  hosts: OURVPS
  remote_user: sudouser
  become: yes
  become_method: sudo

  #------------------------------------------------------------------------------
  vars:
  #------------------------------------------------------------------------------
    # Disable strict host key checking when connecting to remote hosts via SSH
    ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
    ...
  #------------------------------------------------------------------------------
  tasks:
  #------------------------------------------------------------------------------
  ...

bash 스크립트는 ansible 플레이북 실행을 시도할 때까지 오류 없이 올바르게 실행됩니다(그룹 및 사용자가 올바르게 설정됨).

그만큼명령은 다음을 반환합니다.

XXX.XXX.XXX.XXX | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

그럼 난 항상 똑같은 말을 받아오류:

fatal: [XXX.XXX.XXX.XXX]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: [email protected]: Permission denied (publickey,password).", "unreachable": true}

내가 이미 시도한 것:

  • 수동으로 연결: => 잘 작동: 연결이 설정되었습니다!
    ssh [email protected]

  • 수동으로 연결: => 잘 작동: 연결이 설정되었습니다!
    ssh -o 'StrictHostKeyChecking=no' [email protected]

이 Ansible 플레이북이 올바른 실행을 거부하는 이유는 무엇입니까 ???
수동으로 연결할 수 있는데 왜 Ansible이 자동으로 연결할 수 없습니까 ???

PS: 이 질문은 사용 가능한 다른 질문과 중복될 수 있지만 내 사례와 일치하는 긍정적인 통찰력을 얻지 못했습니다.

답변1

좋아, 해결책을 찾았습니다. Ansible 플레이북에 다음 두 변수를 추가했습니다.

vars:
    ansible_ssh_private_key_file: "/root/.ssh/id_ecdsa_sudouser"
    ansible_sudo_pass: "password2"

이제 Ansible 플레이북이 오류 없이 올바르게 실행됩니다.

관련 정보