ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible 101] SSH 키 생성 및 복사하기
    IT/Ansible 2024. 2. 4. 02:58
    728x90

     

    이번에 다룰 내용의 요지는 다음과 같습니다.

     

    사전 분석:

    • 사용자 아이디는 외부 변수로 받습니다.
    • Ansible 서버에서 ansible 계정을 만들고 SSH 키를 생성합니다.
    • Ansible 서버에서 생성된 SSH 공개 키를 각 tnode 호스트로 복사합니다.
    • 계정을 생성할 때는 ansible.builtin.user 모듈을 사용하며, SSH 공개 키를 복사할 때는 ansible.posix.authorized_key 모듈을 사용합니다.

    플레이북 설계:

    • 앤서블 공식 문서의 콘텐츠 컬렉션에서 SSH 키 생성 모듈과 SSH 키 복사 모듈을 찾습니다.
    • 플레이북 명은 create_sshkey.yml로 설정하고, 두 가지 주요 태스크를 가집니다:
      - 'Create ssh key'와 'Copy SSH Pub Key'.
    • 'Create ssh key' 태스크는 로컬 호스트에서 실행되며 ansible 계정의 SSH 키를 생성합니다.
    • 'Copy SSH Pub Key' 태스크는 원격 호스트인 tnode에서 실행되며 ansible 계정의 공개 키를 해당 호스트에 복사합니다.
    • 인벤토리에는 tnode라는 호스트 그룹을 만들고, 모든 관리 노드를 tnode 그룹에 정의합니다.

    1) 프로젝트 디렉터리 생성 및 inventory 파일 작성

    #
    mkdir ~/my-ansible/chapter_09.2
    cd ~/my-ansible/chapter_09.2
    
    # ansible.cfg, inventory 파일 작성
    cp ~/my-ansible/ansible.cfg ./
    
    # inventory 파일 수정
    cat <<EOT> inventory
    [tnode]
    tnode1
    tnode2
    tnode3
    EOT
    
    # lookup 플러그인
    ansible-doc -l -t lookup

     

    2) 플레이북 작성 (SSH 키 생성하고 복사하기 위함)

     

     

     

     

     

    - localhost인 ansible-server에서 생성된 SSH 공개 키는 ansible.posix.authorized_key 모듈을 이용하여 인벤토리의 tnode 호스트 그룹의 각 서버로 복사됩니다.

    - 키를 등록하기 위해 lookup 함수 사용 : 외부 소스(파일, DB, key/value stores, APIs 등)으로 부터 데이터를 검색합니다.

     

     

    ~/my-ansible/chapter_09.2/create_sshkey.yml

    ---
    
    - hosts: localhost
      tasks:
      - name : Create ssh key
        ansible.builtin.user:
          name: "{{ userid }}"
          generate_ssh_key: true
          ssh_key_bits: 2048
          ssh_key_file: /home/{{ userid }}/.ssh/id_rsa
          shell: /bin/bash
    
    - hosts: tnode 
      tasks:
      - name: Copy SSH Pub key
        ansible.posix.authorized_key:
          user: "{{ userid }}"
          state: present
          key: "{{ lookup('file', '/home/{{ userid }}/.ssh/id_rsa.pub') }}"

     

    3) 플레이북 실행

    # 문법 체크
    ansible-playbook --syntax-check create_sshkey.yml
    
    # 실행 : 외부 변수(-e)로 userid 정의하고 전달 실행 >> 실패!
    ansible-playbook -e userid=ansible create_sshkey.yml
    ansible-playbook -e userid=ansible create_sshkey.yml -vvvvv
    
    # 
    ls -l /home/ansible/.ssh/id_rsa.pub
    sudo ls -l /home/ansible/.ssh/id_rsa.pub

     

    플레이북 실행시 다음과 같이 실패하는 것을 볼 수 있습니다.

     

     

    따라서, root 계정으로 실행하여 해당 내용을 해소할 수 있습니다.

     

     

    4) ansible.cfg 파일 수정

     

    기존의 ansible.cfg를 다음과 같이 변경합니다.

    기존 ansible.cfg

     

    변경 ansible.cfg

     

     

    ubuntu 사용자를 사용하여 연결하고 있었지만 변경된 설정에서는 root 사용자로 변경되었습니다.

    이 변경은 Ansible이 원격 호스트에 연결할 때 사용되는 기본 사용자를 변경합니다.

     

     

    • become 설정: 이 설정은 Ansible이 sudo 또는 다른 방법을 사용하여 작업을 루트 권한으로 수행할 것인지 여부를 제어합니다.
      초기 설정에서는 become을 사용하여 sudo를 통해 루트 권한을 상승시킵니다.

    • inject_facts_as_vars 설정: 이 설정은 Ansible이 호스트의 사전 수집된 사전 변수를 주 변수로 주입할지 여부를 제어합니다.
      변경된 설정에서는 이 설정이 추가되고 false로 설정되어 있으므로 사전 수집된 사전 변수가 주 변수로 주입되지 않습니다.

    이후, 실행하면 다음과 같습니다.

    다음의 명령어를 실행시킵니다.

    sudo ansible-playbook -e userid=ansible create_sshkey.yml --ask-pass

     

     

     

     

    5) 공개키 복사를 확인

    # ansible 계정 전환
    sudo su - ansible
    
    # bash
    echo $SHELL
    whoami
    pwd
    
    # 
    ls -al
    ls -l .ssh
    total 8
    -rw------- 1 ansible ansible 1856 Jan  5 05:57 id_rsa
    -rw-r--r-- 1 ansible ansible  417 Jan  5 05:57 id_rsa.pub
    
    # tnode SSH 접속 테스트
    for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i hostname; echo; done
    
    # 대상 노드에 정보 확인
    for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i tree /home/ansible/.ssh; echo; done
    for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i cat /home/ansible/.ssh/authorized_keys; echo; done
    
    # ubuntu로 복귀
    exit
    whoami
    pwd

     

    6) tnode 관리 노드에 ansible 계정에 패스워드 입력 없이 sudo 권한 줄 수 있게 설정 : root 계정 권한으로 진행

    ~/my-ansible/chapter_09.2/sudo-ansible.yml

    ---
    - hosts: all
    
      tasks:
      - name: Create file
        ansible.builtin.file:
          path: /etc/sudoers.d/ansible
          mode: '0600'
          state: touch
    
      - name: Edit file
        ansible.builtin.lineinfile:
          path: /etc/sudoers.d/ansible
          line: ansible ALL=(root) NOPASSWD:ALL

     

    이 플레이북의 주요 작업은 다음과 같습니다.

    1. Create file 작업:
      • ansible.builtin.file 모듈을 사용하여 /etc/sudoers.d/ansible 경로에 파일을 생성합니다.
      • mode를 '0600'으로 설정하여 파일의 퍼미션을 0600으로 변경합니다. 이는 파일이 읽기 및 쓰기 권한이 있는 소유자만 열 수 있도록 설정합니다.
      • state를 touch로 설정하여 파일을 만들도록 지시합니다.
    2. Edit file 작업:
      • ansible.builtin.lineinfile 모듈을 사용하여 /etc/sudoers.d/ansible 파일에 특정 라인을 추가하거나 수정합니다.
      • line 매개 변수를 사용하여 /etc/sudoers.d/ansible 파일에 추가할 라인을 정의합니다. 여기에서는 ansible 사용자가 모든 명령에 대해 비밀번호 없이 sudo를 사용할 수 있도록 설정합니다.
      • 이러한 변경 사항은 /etc/sudoers.d/ansible 파일에 기록됩니다.

    7) 플레이북 실행

    sudo ansible-playbook sudo-ansible.yml --ask-pass
    SSH password: qwe123

     

     

     

    8) 확인

    # ansible 계정 전환 후 tnode1 접속 후 확인
    sudo su - ansible
    ssh tnode1
    ----------
    whoami
    sudo cat /etc/sudoers.d/ansible
    exit
    ----------

     

    728x90
    반응형
Designed by Tistory.