ansible 플레이 북 파일에 ssh 키 지정


81

Ansible 플레이 북은 --key-file명령 줄에서 ssh 연결에 사용되는 키를 지정할 수 있습니다 .

ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"

--key-file명령 줄 에서 사용 하는 대신 플레이 북 파일에서이 키의 위치를 ​​지정할 수 있습니까?

이 키의 위치를 var.yaml파일 에 쓰고 싶기 때문에 vars_files:.

다음은 내 구성의 일부입니다.

vars.yml 파일

key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem

playbook.yml 파일

---

- hosts: myHost
  remote_user: ubuntu
  key_file: {{ key1 }}  # This is not a valid syntax in ansible. Does there exist this kind of directive which allows me to specify the ssh key used for this connection?
  vars_files:
    - vars.yml
  tasks:
    - name: Echo a hello message
      command: echo hello

ansible_ssh_private_key_file아래에 추가해 보았습니다 vars. 하지만 내 컴퓨터에서는 작동하지 않습니다.

vars_files:
  - vars.yml
vars:
  ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
  - name: Echo a hello message
    command: echo hello

나는 실행하는 경우 ansible-playbookplaybook.yml위. 다음과 같은 오류가 발생했습니다.

TASK [Gathering Facts] ******************************************************************************************************************************
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/system/setup.py
<192.168.5.100> ESTABLISH SSH CONNECTION FOR USER: ubuntu
<192.168.5.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/Users/myName/.ansible/cp/2d18691789 192.168.5.100 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<192.168.5.100> (255, '', 'Permission denied (publickey).\r\n')
fatal: [192.168.5.100]: UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n",
    "unreachable": true
}
    to retry, use: --limit @/Users/myName/playbook.retry

ssh 명령에서 내 키 파일의 이름을 찾을 수 없습니다. 이상 해요.


1
나는 --private-key=~/.ssh/keys/id_rsa작동 할 것이라고 생각 한다.
zx1986

@ zx1986 --private-key key_file_path도 나를 위해 일했습니다.
Kaustubh Desai

답변:


92

찾고있는 변수 이름은 ansible_ssh_private_key_file입니다.

'vars'수준에서 설정해야합니다.

  • 인벤토리 파일에서 :

    myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
    myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
    
  • 에서 host_vars:

    # hosts_vars/myHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
    
    # hosts_vars/myOtherHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
    
  • 안에 group_vars호스트 그룹에 동일한 키를 사용하는 경우 파일

  • 에서 vars당신의 플레이 섹션 :

    - hosts: myHost
      remote_user: ubuntu
      vars_files:
        - vars.yml
      vars:
        ansible_ssh_private_key_file: "{{ key1 }}"
      tasks:
        - name: Echo a hello message
          command: echo hello
    

재고 문서


2
ansible_ssh_private_key_file아래에 쓰기 vars가 내 컴퓨터에서 작동하지 않습니다. 이상 해요.
Brian

인벤토리에 키를 지정하고 싶지 않습니다. vars.yml인벤토리 파일에서 로드 할 수 없기 때문 입니다.
Brian

정확하다 : vars나는 생각하기에 너무 늦었다 고 생각한다. 당신은 사용해야 host_vars하거나 group_vars인벤토리에 넣고하지 않으려면 다음 파일.
zigarn 2017.06.24

금고에 개인 키를 두는 모범 사례를 보는 것은 다소 흥미로울 것이므로 개인 키는 그다지 좋지 않은 느낌없이 git repo로 푸시 될 수 있습니다.
ferdy

@fabiog 맞습니다, 방금 Ansible 2.9에서 1.8까지 테스트했으며 모든 (주요) 버전은 vars:섹션에 정의 된 개인 키로 작동 합니다.
zigarn

30

ansible.cfg 파일을 사용할 수 있으며 다음과 같이 표시되어야합니다 (포함 할 수있는 다른 매개 변수가 있습니다).

[defaults]
inventory = <PATH TO INVENTORY FILE>
remote_user = <YOUR USER>
private_key_file =  <PATH TO KEY_FILE>

이것이 타이핑을 절약하기를 바랍니다.


0

플레이 북을 실행 ansible-playbook -vvv하면 실제 명령이 실행되는 것을 볼 수 있으므로 키가 실제로 ssh 명령에 포함되어 있는지 확인할 수 있습니다 (문제가 누락 된 키가 아니라 잘못된 사용자 이름이라는 것을 알 수 있습니다).

나는 vars 섹션이 너무 늦었다는 위의 Brian의 의견 (및 zigam의 편집)에 동의합니다. 나는 또한 이와 같이 호스트의 즉석 정의에 키를 포함하여 테스트했습니다.

# fails
- name: Add all instance public IPs to host group
  add_host: hostname={{ item.public_ip }} groups=ec2hosts ansible_ssh_private_key_file=~/.aws/dev_staging.pem
  loop: "{{ ec2.instances }}"

하지만 그것도 실패합니다.

그래서 이것은 답이 아닙니다. 디버깅 도움말과 시도하지 말아야 할 것들.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.