다른 데이터베이스에서 이 ssh 명령을 실행했습니다.
ssh -i $8 -l $9 $1 "set -o pipefail set -o StrictHostKeyChecking=no; mysqldump --single-transaction --skip-lock-tables -u $2 -p$3 -P $4 -h $5 $6" | gzip -c > $7;
이러한 변수는 명령에 대한 인수입니다.
백엔드의 IP 주소가 변경되지 않는 한 작동하지만 set -o StrictHostkeyChecking=no
다음 메시지가 표시됩니다.
Offending ECDSA key in /home/admin/.ssh/known_hosts:130
remove with:
ssh-keygen -f "/home/admin/.ssh/known_hosts" -R "172.30.0.63"
ECDSA host key for 172.30.0.63 has changed and you have requested strict checking.
Host key verification failed.
명령에 문제가 있는 것 같은데 어디에 있는지 잘 모르겠습니다. 나는 성공하지 못한 채 몇 가지 다른 변형을 시도했습니다.
답변1
이 StrictHostKeyChecking=no
매개변수는 원격 쉘 명령이 아닌 ssh 명령에 옵션으로 전달되어야 합니다. 예를 들어:
ssh -i "$8" -o StrictHostKeyChecking=no -l "$9" "$1" "
set -o pipefail; mysqldump --single-transaction --skip-lock-tables -u $2 -p$3 -P $4 -h $5 $6
" | gzip -c > "$7"
(어떤 로컬 쉘을 사용하고 있는지 언급하지 않았지만 많은 쉘이 단어 분리 및 파일 이름 생성을 위해 인용되지 않은 확장을 수행하기 때문에 여기서 인수 확장 주위에 큰따옴표를 붙였습니다.)
이 옵션은 가능한 MiM 공격에 대한 경고를 억제하지 않습니다.
답변2
명령줄 옵션을 사용하여 런타임에 비활성화해도 작동하지 않으면 파일에서 비활성화하십시오 ~/.ssh/config
. 파일이 존재하지 않으면 생성할 수 있습니다. rw-r-r
또는 를 사용하여 파일에 권한을 부여한 후 다음을 추가하세요.chmod 644 ~/.ssh/config
rw-
chmod 600 ~/.ssh/config
Host *
StrictHostKeyChecking no
또한 이 게시물을 확인하세요: SSH에서 엄격한 호스트 키 확인을 비활성화하는 방법은 무엇입니까?
답변3
저는 보통 다른 사람들에게 서버 관리 방법을 알려주지 않지만...
한 줄짜리 쉘 스크립트에 8개의 변수를 전달한다면 정말 나쁜 일을 하고 있는 것입니다.무섭게잘못된.
간단하게 시작해 보겠습니다.
첫째, SSH 비트:
나는 여러분에게 의심의 이점을 제공하고 각 변수가 다음과 같이 가정할 것입니다.예실제로는 가변적이며 여러 호스트가 있습니다.각다른 ID 파일을 가진 다른 사용자로 액세스가 필요한 경우,전혀올바른 호스트 키가 있다고 믿을 수 있으며 위 항목을 변경할 권한이 없습니다.
(일관성과 적절한 보안에 대해 5페이지 분량의 비난으로 가득 찬 호언장담을 쓰지 않을 것입니다. 꼭 읽어주세요)
~/.ssh/config
이 목적으로 사용하려는 관리자 계정 에 다음을 추가하십시오 .
Host foo
StrictHostKeyChecking No
HostName 172.30.0.63
User foouser
IdentityFile ~/.ssh/id_foo.ed25519
Host bar
StrictHostKeyChecking No
HostName bar.internal.elsewhere
User baruser
IdentityFile ~/.ssh/id_bar.ecdsa
Host qux
StrictHostKeyChecking No
HostName qux.eternal.universe
User quxuser
IdentityFile ~/.ssh/id_qux.rsa
등. 이 시점에서 Steeldriver가 지적 했듯이 명령줄에서 및 를 생략할 수 있습니다. 이는 $8
시작 하기에 정확히 잘못된 위치에 있습니다.$9
-o StrictHostKeyChecking No
둘째, mysqldump 부분입니다.
이것이 바로 자동화 소프트웨어의 목적입니다안시푸르빛으로 반짝이는.
먼저 다음과 같이 Ansible 인벤토리를 생성합니다.
all:
dbservers:
hosts:
foo:
bar:
qux:
여기서는 파일과 동일한 명명 규칙을 사용합니다 ~/.ssh/config
. ansible -m ping dbservers
올바른지 확인하고 필요한 경우 오류를 수정하는 데 사용합니다 .
그런 다음 다음을 추가하십시오 host_vars/baz/vars.yaml
.
mysql_db_user: 'bazdbuser'
mysql_db_password: 'bazdbpassword'
mysql_db_port: 12345
mysql_db_host: 'baz-db.remote
mysql_db_dbs:
- 'bazdb1'
- 'bazdb2'
- 'bazdb3'
mysql_dump_local_destination: '/backups/baz/'
그런 다음 어디에서나 다음 플레이북을 만들고 이름을 지정해 보겠습니다 make_backup_dumps.yaml
.
---
- hosts: dbservers
become: false
tasks:
- name: Dump requested databases.
community.mysql.mysql_db:
login_host: '{{ mysql_db_host }}'
login_user: '{{ mysql_db_user }}'
login_port: '{{ mysql_db_port }}'
skip_lock_tables: true
state: dump
target: '/tmp/db_{{ ansible_host }}_{{ item }}.sql.gz'
loop: {{ mysql_db_dbs }}
- name: Retrieve remote dumps.
ansible.builtin.fetch:
src: '/tmp/db_{{ ansible_host }}_{{ item }}.sql.gz'
dest: '{{ mysql_dump_local_destination }}'
loop: {{ mysql_db_dbs }}
ansible-playbook --limit foo make_backup_dumps.yaml
를 사용하여 한 호스트에서 스크립트를 테스트합니다. 출력이 원하는 경우 를 사용하여 모든 호스트에서 스크립트를 테스트합니다 ansible-playbook make_backup_dumps.yaml
.
이는 한 줄의 코드보다 조금 더 투박할 수 있지만 더 읽기 쉽고 유지 관리가 더 쉽고 호스트당 여러 데이터베이스 테이블 덤프를 지원하며 각 호스트에서 병렬로 실행됩니다.문제를 해결할 수 있도록 선택적인 세부 정보 수준과 함께 각 호스트의 각 단계의 성공/실패에 대한 개요를 제공합니다..
사용하고 안하고는 각자의 몫이지만 어쨌든GNU를 사랑한다면 최소한 호스트 키를 정리하세요. 실제로 발생하는 오류는 로컬에서 발생하기 때문입니다..