A. Ansible ??

-. IT 자동화 도구.

-. CD(지속 배포)나 down time 제로 업데이트와 같이 고급 IT 작업을 조정

-. Ansible은 에이전트 없이 시스템을 관리함.

 

B. [ 사용하기 전 개념 공부 ]

  1. Control node
    Ansible이 설치된 모든 시스템을 control node라고 함.
    어떤 제어 노드에서든 /usr/bin/ansible 또는 /usr/bin/ansible-playbook 을 호출하여 command와 playbook을 실행할 수 있음.
    * Python이 설치 돼 있다면 어떤 컴퓨터든control node로 사용 가능.

  2. Managed nodes
    Ansible로 관리하는 네트워크 장치
    관리되는 노드는 때로 host 라고도 한다. Managed nodes에 ansible이 설치 돼 있지는 않다.
  3. Inventory
    관리되는 노드의 목록.
    때로 host file이라고 함. 인벤토리에는 관리 될 노드에 대한 IP주소와 같은 정보를 지정할 수 있음.
  4. Modules
    Ansible 코드 실행 단위.
    Task로 단일 모듈을 호출하거나, playbook에서 여러 다른 모듈을 호출 할 수 있음.
  5. Tasks
    Ansible의 작업 단위.
  6. Playbooks
    반복해서 실행하고자 해당 작업을 실행 순서대로 저장해 놓은 정렬된 task list
    Playbook에는 task뿐 아니라 변수도 포함할 수 있다.
    YAML형식으로 작성 돼있음.

C. [설치]

  • Ansible은 보통 일년에 2번정도 새로운 releases를 내놓는다.
    버전업을 진행할 시 고려해야할 부분도 있으니 꼭 읽어보고 수행할 것.

Control node 요구사항

  • Python 2(version 2.7) or Python 3(version 3.5 and higher)
    * ansible-core 2.11 / Ansible 4.0.0 은 Python 3.8과 약간의 종속성이 있지만 위 요구사항으로 동작할 수 있다.
    * ansible-core 2.12 / Ansible 5.0.0은 Python 3.8 or 최신버전을 요구한다.
    * Starting with ansible-core 2.11, the project will only be packaged for Python 3.8 and newer
    * Windows is not supported for the control node

Managed node 요구사항

  • Managed node에 daemon을 필요로 하지는 않는다. 그러면 통신은..?
    managed node에 ansible은 SSH,SFTP 를 사용하여 연결과 전송을 한다.
    SFTP는 SCP로 대체 가능.
  • Python을 실행할 수 있는 모든 컴퓨터/장치는 Python 2(2.6 이상) or Python 3(3.5 이상) 필요

Ansible 2.10 부터는 두가지 아티팩트가 배포된다.
요구사항에 맞추어 설치할 것.

  1. Community 패키지(ansible)
  2. Ansible-core(minimalist language and runtime)

=======================================================그럼 시작해봅시다..========================================================

설치 후 아래와 같이 확인되면 정상.
ubuntu@ip-172-31-7-112:~$ ansible localhost -m ping

localhost | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

  • 기본 인벤토리 정보 작성 및 계정 생성으로 테스트해보자!
    • 관리 대상이 될 인스턴스는 ec2로 구성해 보자.
      type – amazon linux 2 프리티어
      private ip 주소 : 172.31.5.193
    • /etc/ansible/hosts 파일에 작성하면 된다.

      IP 혹은 FQDN(www.example.com)등 원하는 방식으로 작성할 수 있다.
      • Alias도 만들 수 있고, 변수 또한 전달할 수 있으며, 이는 문서의 링크 참고.
    • Ansible이 설치된 서버에서
      $ssh-keygen -t rsa
      위 명령어를 실행하고
      생기는 id_rsa.pub(default) 의 내용을 EC2의 ec2-user home/.ssh/authorized_keys에 붙여 넣어준다.
      • 그리고 ping test 재실시. 이때 옵션 추가.
        ansible all -m ping -u ec2-user
    • 계정 생성.
      ansible의 user 모듈을 사용하여 계정을 생성해 보자.
      명령 : ansible all -m user -a "name=ubuntu" -u ec2-user
      //연결된 host(all 이지만 현재 1개 서버만 연결했다)
      //이때 fail이 뜨는데 이건 ec2-user에 sudo 권한이 없기 때문이다.
      (실제해보면 sudo는 있지만 명령어를 sudo로 수행하지 않는 것)
      • /etc/ansible/ansible.cfg 은 ansible의 설정 파일이다.
        이 파일에 아래 내용을 찾아서 become=True를 설정하자.
        -> 이러면 명령어를 수행할 때 마다 sudo 로 수행한다
        [privilege_escalation]
        become=True
        //OR! 명령어 뒤에 --become을 넣어준다.
  • 다시 계정을 생성하고, 이제 확인.
    확인 명령 : ansible all -m shell -a "tail -n 1 /etc/passwd" -u ec2-user
    결과 : 
  • 이제 생성한 계정을 삭제해 보자.
    명령 : ansible all -m user -a "name=ubuntu state=absent remove=yes" -u ec2-user
  • 주의 !
    명령어에 -u ec2-user를 주지 않으면 현재 실행 계정과 동일한 계정명으로 시도한다. (예제에서는 ubuntu로 실행을 시도한다)
  • Playbook을 작성 해보자!
    
            
      ---
    - name: My first task
      hosts: all
      tasks:
         - name: Leaving a mark on ec2
           command: "touch /tmp/ansible_was_here"
  • 실행방법 : ansible-playbook My_first_playbook.yml -u ec2-user
    • EC2에 가서 확인해보자!  
  • Ansible은 playbook을 따로 관리해 주지 않는다.(디폴트 폴더나 설정이 없다는 이야기 같다.) 실제 환경에서 사용시에 별도로 경로를 설정하고 관리하면 좋겠다.