O playbook Ansible não pode se conectar ao usuário remoto por meio de ssh => inacessível e permissão negada

O playbook Ansible não pode se conectar ao usuário remoto por meio de ssh => inacessível e permissão negada

Estou construindo uma solução completa para configurar e fortalecer nosso vps (ubuntu 22.04) com script bash e playbooks Ansible. O que eu quero fazer é o seguinte:

  1. Crie um grupo personalizado “sudogroup” com privilégios sudo
  2. Crie um novo usuário "sudouser" neste grupo
  3. Conexão SSH segura para este usuário com par de chaves
  4. Execute meu manual do Ansible como “sudouser” em vez de “root”

Estou fazendo isso com o seguintescript bash:

#------------------------------------------------------------------------------
# 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
#------------------------------------------------------------------------------

OInventário Ansiblearquivo:

[OURVPS]
195.179.193.224

OManual do Ansiblecomeça assim:

#------------------------------------------------------------------------------
# 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:
  #------------------------------------------------------------------------------
  ...

O script bash é executado corretamente (grupo e usuário estão configurados corretamente) sem erros, até tentar executar o playbook ansible.

OPINGcomando retorna:

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

Então, eu sempre recebo o mesmoerro:

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}

O que eu já tentei:

  • conecte manualmente com: => Funciona bem: conexão estabelecida!
    ssh [email protected]

  • conecte manualmente com: => Funciona bem: conexão estabelecida!
    ssh -o 'StrictHostKeyChecking=no' [email protected]

Por que este manual ansible se recusa a ser executado corretamente ???
Se consigo me conectar manualmente, por que o Ansible não consegue se conectar automaticamente ???

PS: Esta pergunta pode ser uma duplicata de outras perguntas disponíveis, mas não obtive nenhum insight positivo que corresponda ao meu caso.

Responder1

Ok, encontrei a solução: adicionei os dois vars a seguir ao meu manual do Ansible:

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

Agora, o playbook ansible funciona corretamente, sem erros...

informação relacionada