사용 가능한 (및 ssh-keygen
)을 통해 소수의 원격 서버에서 ssh 호스트 키를 다시 생성하려고하는데 파일이 표시되지 않는 것 같습니다. 플레이 북이 정상적으로 실행되지만 리모콘의 파일은 변경되지 않습니다.
echo -e
이 리모컨은 우분투 14.04를 실행 중이며 python-pexpect
사용 가능한 버전이 정확하지 않기 때문에 해커 에게 의지해야합니다 .
내가 무엇을 놓치고 있습니까? 내 플레이 북과 출력은 다음과 같습니다.
플레이 북
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA host key
command : echo -e 'y\n'|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
- name: Generate /etc/ssh/ DSA host key
command : echo -e 'y\n'|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
- name: Generate /etc/ssh/ ECDSA host key
command : echo -e 'y\n'|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
산출
$ ansible-playbook ./playbooks/ssh-hostkeys.yml -l myhost.mydom.com,
SUDO password:
PLAY [all] **********************************************************************************************
TASK [Generate /etc/ssh/ RSA host key] ******************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C -N "
]
}
TASK [Generate /etc/ssh/ DSA host key] ******************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C -N "
]
}
TASK [Generate /etc/ssh/ ECDSA host key] ****************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C -N "
]
}
PLAY RECAP **********************************************************************************************
myhost.mydom.com : ok=6 changed=3 unreachable=0 failed=0
답변
‘y’를 ssh-keygen에 파이프해야하는 유일한 이유는 명령이 기존 파일을 바꾸는 것입니다. 내 생각에 이것은 구성 관리 도구에서 무언가를 수행하는 좋은 방법이 아닙니다.
dem 등원이되도록 작업을 조정해야합니다. 특히 creates: filename
명령에 를 추가하면 새 키는 해당 플레이 북을 실행할 때마다 교체되지 않고 존재하지 않는 경우에만 생성됩니다.
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_host_rsa_key
- name: Generate /etc/ssh/ DSA host key
command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_host_dsa_key
- name: Generate /etc/ssh/ ECDSA host key
command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_host_ecdsa_key
어떤 이유로 키가 너무 오래된 키 등을 교체하려는 경우 다른 작업을 추가하여 제거 할 수 있습니다. 간단한 삭제입니다
- file:
state: absent:
path: "{{item}}"
loop:
- /etc/ssh/ssh_host_rsa_key
- /etc/ssh/ssh_host_dsa_key
- /etc/ssh/ssh_host_ecdsa_key
특정 시간 이전에 생성 된 파일을 삭제하려면 stat 모듈을 사용하여이 파일에 대한 세부 사항을 검색 when
하고 특정 날짜 또는 그보다 오래된 파일 을 선택적으로 제거하도록 설정 조건을 설정할 수 있습니다.
답변
ansible command
모듈 은 쉘을 통해 명령을 전달하지 않습니다 . 이것은 파이프와 같은 쉘 연산자를 사용할 수 없다는 것을 의미하므로 출력에 파이프 기호가 표시됩니다. ansible에 관한 한, echo
나머지 행을 모두 인수로 하여 명령 을 실행 했습니다 echo
.
쉘로 처리 된 명령 행이 필요한 경우 대신을 사용하십시오shell
command
.
그리고 ssh 호스트 키를 재생성하는 더 좋은 방법이 있어야하지만 지금은 찾을 수 없습니다 …
답변
이 작업에는 특수 모듈을 사용하십시오.
- name: Generate an OpenSSH keypair with the default values (4096 bits, rsa)
openssh_keypair:
path: /home/youruser/.ssh/id_rsa
owner: youruser
group: youruser
- name: Fix owner of the generated pub key
file:
path: /home/youruser/.ssh/id_rsa.pub
owner: youruser
group: youruser
답변
죄송하지만 작업에서 “creates”를 사용할 수 없습니다. 다음과 같은 오류가 발생했습니다.
ERROR! 'creates' is not a valid attribute for a Task
결과적으로 다음 작업을 사용합니다.
- name: remove existing ssh_host keys
file: path={{ item }} state=absent
with_items:
- "/etc/ssh/ssh_host_rsa_key"
- "/etc/ssh/ssh_host_dsa_key"
- "/etc/ssh/ssh_host_ecdsa_key"
- name: Generate /etc/ssh/ RSA host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
- name: Generate /etc/ssh/ DSA host key
command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
- name: Generate /etc/ssh/ ECDSA host key
command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
답변
@Zoredache는 정답을 가지고 있지만 Ansible의 최신 버전에 대해서는 @MaxiReglisse로 표시되지 않습니다. 대신 다음 코드를 사용하십시오.
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_host_rsa_key
답변
다른 옵션은 사용자 모듈 을 사용하는 것 입니다. 이것의 긍정적 인 측면은 dem 등식 작업을 얻는다는 것입니다. 다음은 localhost에서 ssh 키를 생성하는 방법의 예입니다.
- name: Generate ssh keys
local_action:
module: "user"
name: "{{ lookup('env','USER') }}"
generate_ssh_key: true
ssh_key_type: "{{ item.0 }}"
ssh_key_bits: "{{ item.1 }}"
ssh_key_file: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
with_together:
- [ 'rsa', 'dsa' ]
- [ 2048, 1024 ]
loop_control:
label: "{{ item.0 }}_{{ item.1 }}_key"
- name: Copy generated ssh keys to remote machine
copy:
src: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
dest: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"
with_nested:
- [ 'rsa', 'dsa' ]
- [ '', '.pub' ]
notify:
- Restart sshd
loop_control:
label: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"
답변
openssh_keypair 및 certified_key 모듈을 사용하여 키를 가능한 호스트에 저장하지 않고 동시에 키를 작성 및 배치하십시오.
- openssh_keypair:
group: root
owner: root
path: /some/path/in/your/server
register: ssh_key
- name: Store public key into origin
delegate_to: central_server_name
authorized_key:
key: "{{ssh_key.public_key}}"
comment: "{{ansible_hostname}}"
user: any_user_on_central