Ansible

  • ansible 서버에서 다른 서버로 접속시 비밀번호 없이 접속

    ssh-keygen
    ssh-copy-id root@{비밀번호 없이 접속하고자 하는 ip}
  • Ansible 명령어

    • 실행옵션

      -i (--inventory-file) : 적용 될 호스트들에 대한 파일 정보
      -m (--module-name) : 모듈 선택
      -k (--ask-pass) : 관리자 암호 요청
      -K (--ask-become-pass) : 관리자 권한 상승
      --list-hosts : 적용되는 호스트 목록
    • 멱등성 : 같은 설정을 여러번 적용하더라도 결과가 달라지지 않는 성질

  • Ansible 모듈 + Playbook

    Ansible 서버에서 한번만 실행하면, 동일한 target 서버에 실행/제어할 수 있다는 특징

    단순한 설치, 환경설정, 상태값 부여 모두 가능해짐

    https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html

    Ansible Test

    • ansible 서버와의 연결상태 확인하기

      
      cat /etc/ansible/hosts
      #ex)
      #[devops]
      #172.17.0.2
      #172.17.0.3
      
      #devops 그룹만 실행
      # $ ansible devops 
      
      $ ansible all -m ping
    • ansible로 연결된 서버 메모리 확인하기

      ansible all -m shell -a "free -h"
    • ansible 을 이용한 파일 복사

      ansible all -m copy -a "src=./test.txt dest=/tmp"
    • centOS , 설치된 패키지 있는지 확인

      yum list installed | grep httpd
    • ansible 을 이용한 devops 그룹명에 yum으로 httpd를 지금 바로 다운로드

      ansible devops -m yum -a "name=httpd state=present"
    • Ansible Playbook

      • Ansible Playbook은 Ansible을 사용하여 원격 시스템에 대한 자동화 작업을 정의하는 YAML 파일

        • 시스템설정, 패키지 설치, 파일 전송, 서비스 재시작/관리 등 여러가지 정의

        • 다수의 서버에 반복 작업을 처리하는 경우

      • Playbook

        • $ vi first-playbook.yml 작성

        • $ ansible-playbook first-playbook.yml

        • $ cat /etc/ansible/hosts

      ansible yml 파일 실행 : ansible-playbook first-playbook.yml

      • 특정 경로의 특정 파일에 데이터 추가

        ---
        - name: Add an ansible hosts
          hosts: localhost
          tasks:
            - name: Add an ansible hosts
              blockinfile:
                path: /etc/ansible/hosts
                block: |
                  [mygroup]
                  172.17.0.5

      https://downloads.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz.sha512

      • 특정 경로에 현재 ansible서버 디렉토리의 특정 파일을 copy해서 등록

        - name: Ansible Copy Example Local to Remote
          hosts: devops
          tasks:
            - name: copying file with playboook
              copy:
                src: ~/sample.txt
                dest: /tmp
                owner: root
                mode: 0644
      • 특정 경로에 특정 인터넷 경로 다운로드

      • 전 : ssh copy를 통해서 복사한 후 도커에서 컨테이너를 실행하는 방법

        → 단점 : docker 에 직접적으로 이런 작업을 하면 기존 container 재실행시 문제발생(이미지, 컨테이너 삭제 후 다시 실행)

      • 후 : ansible을 통해서 배포하기. (멱등성)

        • jenkins war파일 → ansible로 복사

        • target을 host파일에 등록

        • 복사 war파일을 제어, jenkins로

        • 하지만 테스트시 delete image, container 후 ansible 실행 해봐야함.

          (두번째 컨테이너는 동작x, 첫번째 컨테이너만 동작하는 경우 발생 가능.)

          container - stop & rm , image - rmi

        #  : 복사
        [root@cf3bc7d6a2c6 ~]# cat Dockerfile
        FROM tomcat:9.0
        
        LABEL org.opencontainers.image.authors="edowon0623@gmail.com"
        
        COPY ./hello-world.war /usr/local/tomcat/webapps
        
        # : command에 해당하는 script를 실행하겠다는 의미
        [root@cf3bc7d6a2c6 ~]# cat first-devops-playbook.yml
        - hosts: all
        # become: true
        
          tasks:
          - name: build a docker image with deployed war file
            command: docker build -t cicd-project-ansible .
            args:
              chdir: /root
  • Ansible을 이용한 로그인 관리(24.02.14)

    # cicd-project-ansible를 뒤의 name으로 변경(docker login-id)
    docker tag cicd-project-ansible ny2485/cicd-project-ansible
    
    # docker login
    docker login
    
    #docker push
    docker push ny2485/cicd-project-ansible
    
    **<https://hub.docker.com/>
    들어가서 login 후 repository를 보면 해당 image가 올라와 있는 걸 볼 수 있음**
    [root@cf3bc7d6a2c6 ~]# cat create-cicd-devops-image.yml
    - hosts: all
    # become: true
    
      tasks:
      - name: build a docker image with deployed war file
        command: docker build -t ny2485/cicd-project-ansible .
        args:
          chdir: /root
    
      - name: push the image on Docker Hub
        command: docker push ny2485/cicd-project-ansible
    
      - name: remove the docker image from the ansible server
        command: docker rmi ny2485/cicd-project-ansible
        ignore_errors: yes
    
    #ansible 실행 -> docker hub보면 새롭게 업데이트 되어있음
    ansible-playbook -i hosts create-cicd-devops-image.yml
    • ansible-playbook로 hosts파일을 실행하면서 create-cicd-devops-image.yml 파일을 실행함. 다만 172.17.0.4 실행시 중복 실행(리소스낭비)하니까 limit으로 172.17.0.2 이것만 실행

      [root@cf3bc7d6a2c6 ~]# cat hosts
      172.17.0.2
      172.17.0.4
      
      $ ansible-playbook -i hosts create-cicd-devops-image.yml --limit 172.17.0.2
      
      #실행 중 : 172.17.0.2 이것만 실행
      #이미지 ok, build, push, remove까지 완료
      
      PLAY [all] ***************************************************************************************************************************************************************
      
      TASK [Gathering Facts] ***************************************************************************************************************************************************
      ok: [172.17.0.2]
      
      TASK [build a docker image with deployed war file] ***********************************************************************************************************************
      changed: [172.17.0.2]
      
      TASK [push the image on Docker Hub] **************************************************************************************************************************************
      changed: [172.17.0.2]
      
      TASK [remove the docker image from the ansible server] *******************************************************************************************************************
      changed: [172.17.0.2]
      
      PLAY RECAP ***************************************************************************************************************************************************************
      172.17.0.2                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
      
      # docker-hub을 보면 새로 이미지가 올라옴을 알 수 있음
      
    • 새로운 item 생성

      ansible-playbook -i hosts create-cicd-devops-image.yml --limit 172.17.0.2
      ansible-playbook -i hosts create-cicd-devops-container.yml --limit 172.17.0.4
    • 정리

      • 생성, 업로드, 삭제

      • create-cicd-devops-container.yml 은 docker-server에서만 실행했었음.

        • 컨테이너 중지,삭제, image 삭제, docker-hub image download, container image 생성

Last updated