
저는 bash 스크립트와 Ansible 플레이북을 사용하여 vps(ubuntu 22.04)를 설정하고 강화하기 위한 완전한 솔루션을 구축하고 있습니다. 내가하고 싶은 일은 다음과 같습니다.
- sudo 권한이 있는 사용자 정의 그룹 "sudogroup" 생성
- 이 그룹에 새 사용자 "sudouser"를 만듭니다.
- 키 쌍을 사용하여 이 사용자에 대한 보안 SSH 연결
- "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 플레이북이 오류 없이 올바르게 실행됩니다.