• 이미 사용 허가를 받아서 믿을 수 있는 사용자

1. ansible에서 authorized_keys 저장하는 순서

  1. ansible 서버에서 ansible 클라이언트에 접속 시도
  2. ansible 클라이언트는 ~/.ssh/authorized_keys 파일의 존재 확인
  3. authorized_keys 파일 내용에 ansible 서버의 정보가 저장되어있는 지 확인하고, 있다면 접속을 허가

2. ssh-keygen 명령어 사용

  • ssh-keygen 명령어를 통해 생성된 공개키(.pub)를 ansible 클라이언트에 전달하여 암호없이 접근 가능하게 해줌
  • authorized_keys에 저장하는 데 사용하는 명령어 ssh-keygen 옵션 설명
    1. -b 옵션 : 생성할 키의 비트수를 지정
    2. 2048 : rsa 키는 2048 비트로 결정 (rsa는 최소 768 비트가 필요)
    3. -t 옵션 : 암호화 타입을 결정
    4. rsa : 공개키 암호화에서 가장 널리 사용되는 알고리즘
    5. -f ~/.ssh/id_rsa : 저장할 파일명 지정
    6. -q 옵션 : ssh-keygen의 질의 응답을 생략
    7. -N "" : 새 암호를 빈값으로 해서 제공
       $ ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ""

3. 자동으로 authorized_keys를 저장해주는 플레이북(playbook)

  1. hosts: all → /etc/ansible/hosts에 저장되어있는 모든 IP 호스트들을 대상

  2. gather_facts: no → facts를 수집하지 않는다는 것 → Facts 는 원격 대상 시스템의 호스트 네임, CPU, Memory 정보 등을 수집하는 setup 모듈 (불필요한 시간 소모를 막아줌)

  3. connection=local → Ansible 이 ssh로 명령어를 날리지 않도록 하기 위한 것

  4. ignore_errors: yes → ansible 스크립트에서 실행한 결과가 성공인지 실패인지 출력하지 않고 실행만 시킴

  5. run_once: true → 명령어 1회만 실행됨

  6. register: id_pub → 플레이북에서의 결과를 id_pub 변수로 지정

  7. lineinfile → 이미 존재하는 파일에 내가 추가할 라인이 있는지 체크하고, 없는 경우에만 추가하고 싶은 경우에 lineinfile module을 사용 (ansible의 멱등성 지원)

  8. dest → id_pub가 저장되는 위치인 /root/.ssh/authorized_keys임

  9. id_pub.stdout → /root/.ssh/authorized_keys에 id_rsa.pub을 저장

    $ vi auto_authorized_keys.yml
    ---
    - hosts: all
     gather_facts: no
    
     tasks:
     - name: ssh-keygen
       connection: local
       command: "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''"
       ignore_errors: yes
       run_once: true
    
     - name: read id_rsa.pub
       connection: local
       command: "cat ~/.ssh/id_rsa.pub"
       register: id_pub
       run_once: true
    
     - name: remote lineinfile for authorized_keys
       lineinfile:
         dest: /root/.ssh/authorized_keys
         line: "{{ id_pub.stdout }}"

4. 플래이북 실행 결과

  • ansible 서버에서 플레이북 실행

    $ ansible-playbook auto_authorized_keys.yml -k
    SSH password:
    
    PLAY [all] *******************************************************************
    
    TASK [ssh-keygen] ************************************************************
    changed: [192.168.1.13]
    
    TASK [read id_rsa.pub] *********************************************************
    changed: [192.168.1.13]
    
    TASK [remote lineinfile for authorized_keys] ****************************************
    changed: [192.168.1.13]
    
    PLAY RECAP *******************************************************************
    192.168.1.13             : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0                                                                                                ignored=0
    
    # -k 옵션 없이 ansible 서버에서 ansible 클라이언트 ansible 명령어 실행
    $ ansible all -m ping
    192.168.1.13 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
  • ansible 클라이언트인 192.168.1.13에서 /root/.ssh/authorized_keys 파일 확인
    $ cat /root/.ssh/ssh
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuIvAkdFC/ltBW3j1oMIzoVAvo0Gr0rWPuZ8e+YdMnXd3YMCZ0DTrqd+B9TW/C56rCU7oD7thMb4JgZiLoUim87xYmVStSmacCGLEpfU6vcLJN/s4iu+oH0aSf/rWCDqElGun8kU5SdyILFLG8dtR/hHy7mvZjmE5Fm9OzuXIo+6wWeXx7I7UHUwL4b1FXaQwlw72IjLMC0BEcJCqxbnw+N9GWtzxkPMog++8EQ0JrLsnhGPNGoH8viI6jzitJwDQsxFenHEmoMZPTZxr4z2Yzct45GiTa5BRIpiqx3Oq/2wFuqC67oJIMOl+v/0xxa4UXv1qmL42KaSlUbtzz2wHj

+ Recent posts