현재 디렉터리의 다음 레이아웃을 고려하세요.
.
├── foobar.yml
└── roles
└── foobar
└── tasks
└── main.yml
foobar
우리 캐릭터( )가 다음과 같은 작업을 수행한다고 가정해 보겠습니다 roles/foobar/tasks/main.yml
.
---
- add_host:
name: "baz"
ansible_user: "root"
ansible_become: yes
ansible_ssh_host: "{{container.ip}}"
ansible_ssh_host_key_checking: no
ansible_ssh_private_key_file: "{{container.privkey}}"
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
- wait_for:
port: 22
host: "{{container.ip}}"
timeout: 30
search_regex: OpenSSH
- apt:
pkg:
- vim-nox
- lsof
delegate_to: "baz"
become: true
become_user: root
...그리고 다음 스크립트는 다음과 같습니다.
---
- name: Configuring container and host
hosts: localhost
vars:
container:
ip: "172.17.0.2"
privkey: "/root/root_ssh/id_rsa"
roles:
- foobar
OpenSSH는 플레이북에 제공된 대로 IPv4에서 사용할 수 있으며 개인 키는 지정된 경로( u=rw,go=
예: 0600, 상위 디렉터리는 0700)에 존재합니다. 테스트하는 동안 이러한 사항을 모두 확인했습니다(예: stat
및 사용 debug
).
마지막 작업은 다음과 같이 실패했습니다.
TASK [foobar : apt] ***********************************************************************************************************************************************************************************************
task path: /home/username/ansible/test/roles/foobar/tasks/main.yml:18
<172.17.0.2> ESTABLISH SSH CONNECTION FOR USER: root
<172.17.0.2> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/root/root_ssh/id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="root"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ControlPath=/home/username/.ansible/cp/0689044634 172.17.0.2 '/bin/sh -c '"'"'echo ~root && sleep 0'"'"''
<172.17.0.2> (255, '', "Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.\r\nno such identity: /root/root_ssh/id_rsa: Permission denied\r\[email protected]: Permission denied (publickey).\r\n")
fatal: [localhost]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.\r\nno such identity: /root/root_ssh/id_rsa: Permission denied\r\[email protected]: Permission denied (publickey).",
"unreachable": true
}
출력은 ssh
다음과 같습니다
Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
no such identity: /root/root_ssh/id_rsa: Permission denied
[email protected]: Permission denied (publickey).
ssh
... 나 자신과 마찬가지로 명령줄에서 동일한 명령을 실행할 때도 sudo
이 메시지가 표시됩니다 (예: ). 여기서 오류가 발생하는 이유는 /root/root_ssh/id_rsa
실제 사용자가 액세스할 수 없기 때문입니다 ssh
. 동등한 명령을 사용하여 sudo
호출 하면 ssh
매력처럼 작동합니다.
그러나 개인 키에 접근하려면 ssh
먼저 개인 키를 호출해야 합니다 root
.
묻다:그렇다면 Ansible을 어떻게 사용할 수 있나요?become
동시에 생성연결 ssh
(예: 다음 ssh
으로 실행 root
)하시겠습니까?
앤서블 버전
$ ansible-playbook --version
ansible-playbook 2.9.4
config file = /home/username/ansible/precitec/ansible.cfg
configured module search path = [u'/home/username/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.17 (default, Nov 7 2019, 10:07:09) [GCC 7.4.0]
내가 시도한 것
- 작업을
become
완료하세요add_host
- Ansible이 호출에 sudo를 사용하도록 강제하는 설정
ansible_ssh_executable: "/usr/bin/sudo -- /usr/bin/ssh"
(및 이들의 조합) 아쉽게도 Ansible은 결국 Paramiko를 사용하게 됩니다.sudo -- ssh
ssh
- ...창의력을 발휘하고 설정하세요
ansible_ssh_executable
(ansible_ssh_args
아래 참조). apt
태스크를 사용하고 있는 위치로 태스크를 이동block
하되 외부 블록은apt
delegate_to
반품,를 사용become
하면 소용이 없습니다(아래 참조).
이 중 어느 것도 도움이 되지 않습니다.
설정 ansible_ssh_executable
및ansible_ssh_args
ansible_ssh_executable: "/usr/bin/sudo"
ansible_ssh_args: "-- /usr/bin/ssh -C -o ControlMaster=auto -o ControlPersist=60s"
ansible_ssh_executable
Ansible은 값을 확인하는 것으로 보이므로 (예를 들어) 전체 명령줄을 제공하는 것은 불가능합니다.sudo -- ssh
블록으로 포장되어 있습니다..
- name: Install packages
block:
- apt:
pkg:
- vim-nox
- lsof
delegate_to: "baz"
become: true
become: true