• 티스토리 홈
  • 프로필사진
    각수짱
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
  • 250x250
    반응형
각수짱
  • 프로필사진
    각수짱
    • 분류 전체보기 (118)
      • 쓰레기통 (1)
      • 네트워크 기초 (14)
      • 서버 관리 (7)
        • DB 서버 (2)
        • DNS 서버 (2)
        • WEB 서버 (3)
        • 오픈스택 (0)
      • 파이썬 (10)
      • 웹 서비스 (12)
        • django (3)
        • ELK (7)
      • AWS (12)
      • Kafka (0)
      • IaC (9)
      • docker (7)
      • k8s (3)
      • CICD (1)
      • Azure (4)
      • 블록체인 (1)
      • 네트워크엔지니어 (9)
      • 리눅스 (26)
        • 리눅스 기초 (11)
        • 리눅스 고급 (8)
        • 리눅스 마스터 1급 (7)
      • 마케팅 (1)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 3. Ansible(앤서블)
        2023년 03월 29일
        • 각수짱
        • 작성자
        • 2023.03.29.:33
        728x90
        반응형
        SMALL

        Ansible은 스토리지, 서버 및 네트워킹을 자동화하는 구성 관리 플랫폼
        Ansible을 사용하여 이러한 구성 요소를 구성하면 어려운 수동 반복 작업을 자동화 가능

        연산을 여러 번 적용하더라도 결과가 달라지지 않는 것이 특징 (멱등성)


        앤서블 구성요소

        Ansible Control Node

        앤서블을 실행하는 노드. /usr/bin/ansible이나 /usr/bin/ansible-playbook 명령을 이용하여 제어 노드에서 관리 노드들을 관리
        앤서블이 설치되어 있으면 노트북이나, 서버급 컴퓨터를 제어 노드로 이용

        Managed Node

        앤서블로 관리되는 서버를 매니지드 노드라고 한다. 
        매니지드 노드에는 앤서블이 설치되지 않는다.

        Inventory (host file)

        매니지드 노드 목록을 인벤토리라고 한다. 
        인벤토리는 각 매니지드 노드에 대한 IP 주소, 호스트 정보, 변수와 같은 정보를 지정할 수 있다.

        Module

        https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html
        앤서블이 실행하는 코드 단위
        각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용
        단일 모듈을 호출하거나 플레이북에서 여러 모듈을 호출할 수도 있다.

        Playbook

        순서가 지정된 작업 목록이 저장되어 지정된 작업을 해당 순서로 반복적으로 작업을 실행할 수 있다. 


        앤서블 설치

        Managed Node(192.168.52.165)

        Control Node에서 키 생성

        ssh-keygen

        엔터 3번

        ssh-copy-id   root@매니지노드IP
        패스워드


        ssh root@매니지드노드IP 했을 때 패스워드 없이 접속

        ssh root@매니지노드IP

        exit

        Control Node(192.168.52.164)

        yum install -y epel-release

        wget http://192.168.0.100:8888/ansible%2d2.8.8%2d1.el8.noarch.rpm

        ansible galaxy활용하기 전에 최신 버전(2.9)은 지원을 안 해주기에 2.8로 설치

        yum install -y ansible-2.8.8-1.el8.noarch.rpm

        ansible --version


        인벤토리

        기본 인벤토리

        /etc/ansible/hosts

        커스텀 인벤토리

        원하는 위치에 파일 생성(/root/test/hosts)
        앤서블 명령어를 실행할 때 -i 옵션으로 파일 지정 가능

        인벤토리 테스트

        children 1개

        host 파일

        vi /root/test/hosts
        all:
          children:
            server:
              hosts:
                192.168.52.165
                192.168.52.166

        /root/test 에서
        server 밑에 hosts에 해당하는 IP들에게 ping

        ansible server -i hosts -m ping

        children 2개

        hosts 파일

        vi /root/test/hosts
        all:
          children:
            server:
              hosts:
                192.168.52.165:
            db:
              hosts:
                192.168.52.166:

        server 밑에 hosts에 해당하는 IP들에게 ping

        ansible server -i hosts -m ping

        db 밑에 hosts에 해당하는 IP들에게 ping

        ansible db -i hosts -m ping

        전체 hosts에 해당하는 IP들에게 ping

        ansible all -i hosts -m ping

        yml 파일 형식

        vi /root/test/hosts
        all:
          hosts:
            192.168.52.165:
            192.168.52.166:
            192.168.52.167:
          children:
            webservers:
              hosts:
                192.168.52.165:
                192.168.52.166:
              dbservers:
                hosts:
                  192.168.52.167:

        플레이북

        실행 명령어

        ansible-playbook -i 인벤토리파일경로 플레이북파일경로

        모듈 구성

        - name: 이름	# 앤서블 명령어를 실행할 때 출력되는 내용
          unarchive: 	# 모듈 이름
          become: yes	# 옵션

        리눅스 명령어 실행

        playbook 파일

        - name: 이름
          shell: |  
            명령어
          become: yes
        
        - name: 이름
          command: 명령어
          become: yes

        실행
        PLAY : 어떤 노드한테 실행할 건지 확인
        Gathering facts : 해당 노드에 정상적으로 실행할 수 있는지 확인(노드 상태 확인)

        ansible-playbook -i hosts playbook

        확인

        파일 관련 모듈

        권한 설정

        - name: 이름
          file:
            path: "경로"
            mode: 0755
          become: yes

        실행

        확인

        중복 실행 시 changed에서 ok로 하고 명령어를 넘어감 (멱등성) 

        파일 다운 및 압축 해제

        - name: 이름
          get_url:
            url: http://example.com/path/file.conf
            dest: /etc/foo.conf
        - name: 이름
          unarchive:
            src: "압축 파일 경로"
            dest: "해제할 경로"
            remote_src: yes		타겟 서버에 압축 파일이 존재하는지 여부를 세팅. 디폴트 값은 no.
          become: yes		no인 경우 타겟 서버에 컨트롤 노드에 존재하는 압축 파일을 복사

        실행

        확인
        /tmp에 apache-tomcat.9.0.73.tar.gz 다운로드 확인

        /usr/local에서 해제 후 이름 변경(tomcat9)

        파일 복사

        - name: "copy file"
          copy:
            src: 원본
            dest: 사본
            remote_src: no
        
        - name: "copy file"
          copy:
            src: {{ item }}
            dest: 사본
          with_items:  
            - file1
            - file2
            - file3
            remote_src: yes

        실행

        확인

        yum으로 설치

        - name: Install the latest version of Apache
          yum:
            name: httpd
            state: latest

        템플릿

        진자2 문법
        https://jinja.palletsprojects.com/en/3.0.x/templates/#escaping

         

        Template Designer Documentation — Jinja Documentation (3.0.x)

        Template Designer Documentation This document describes the syntax and semantics of the template engine and will be most useful as reference to those creating Jinja templates. As the template engine is very flexible, the configuration from the application

        jinja.palletsprojects.com

        - name: "template file"
          template:
            src: 원본
            dest: 사본
          with_items:  
            - file1
            - file2
            - file3
            remote_src: yes
        scp 192.168.52.165:/usr/local/tomcat9/conf/server.xml ./

        mv server.xml server.xml.j2

        vi server.xml.j2
        <Connector protocol="AJP/1.3"
            address="{{ ansible_all_ipv4_addresses[0] }}"
            secretRequired="false"
            port="8009"
            redirectPort="8443" />

        playbook 파일

        vi playbook
        - hosts: ["server", "db"]
          tasks:
        
          - name: Copy File
            template:
              src: /root/test/server.xml.j2
              dest: /usr/local/tomcat9/conf/server.xml
              remote_src: no
            become: yes

        실행

        확인

        각각 노드 1 2에{{ ansible_all_ipv4_addresses[0] }} 부분에 현재 IP가 들어가서 저장됨

        DB 관련 모듈

        사용자 생성

        - name: Create mysql user
              mysql_user:
                login_user: root
                login_password: ''
                name: sjb
                password: qwer1234
                host: '%'
                priv: '*.*:ALL'

        DB 생성

          - name: Create a new database with name 'sjb_db'
            mysql_db:
              login_user: root
              login_password: ''
              name: sjb_db
              state: present

         

        쿼리 실행

        ansible galaxy 2.8 버전

        - name: 이름
          shell: |  
            echo "CREATE TABLE sjb_db.student (sname VARCHAR(10), sage int)" | mysql -u sjb -pqwer1234
          become: yes

        ansible galaxy 2.9 버전 (모듈 설치 후)

          - name: Create new Table
            community.mysql.mysql_query:
              login_user: root
              login_password: ''
              login_db: sjb_db
              query: CREATE TABLE student (sname VARCHAR(10), sage INT)

        롤(역할)

        롤 생성

        ansible-galaxy init [롤 이름]

        롤 구성

        • defaults : 역할에 대한 기본 변수를 정의하는 디렉토리. 이 변수들은 우선순위가 가장 낮아 사용자가 지정한 변수에 의해 쉽게 재정의됨
        • files : 역할과 관련된 정적 파일들이 위치하는 디렉토리. 여기에 있는 파일들은 'copy'모듈 등을 사용하여 원격 시스템에 전송할 수 있음.
        • handlers : 핸들러를 정의하는 디렉토리. 핸들러는 특정 작업이 변경될 때 실행되는 작업(예: 서비스 재시작).
        • meta : 역할에 대한 메타데이터를 정의하는 디렉토리. 여기에는 역할의 의존성, 작성자 정보, 라이선스 정보 등이 포함.
        • tasks : 역할의 주요 작업들이 정의되는 디렉토리. 이곳의 'main.yml'파일은 역할이 실행될 때 호출.
        • templates : Jinja2 템플릿 파일이 위치하는 디렉토리. 'template'모듈을 사용하여 원격 시스템에 전송하기 전에 템플릿을 렌더링 할 수 있음.
        • tests: 역할에 대한 테스트 설정과 테스트 플레이북을 포함하는 디렉토리.
        • vars : 역할에 대한 변수를 정의하는 디렉토리. 이 디렉토리의 변수들은 'defaults'보다 높은 우선순위를 가짐

        예시:

        - name: Apply my_role to servers
          hosts: servers
          roles:
            - my_role

        변수

        vars

        인벤토리 또는 플레이북에 작성

        vars:
          var01: 10
          var02: 10

        변수 파일에 작성

        vi vars.yml
        var03: 10
        var04: 10

        플레이북에서 불러와서 사용

         - name: load vars
            include_vars: "/root/test/vars.yml"
        
          - name: print
            debug:
              msg: "{{ var03 }}"
            become: yes

        특수 변수

        앤서블을 실행하면서 생성되는 변수

        {{ ansible_facts }}
        
        {{ hostvars }}

        register

        모듈 실행 결과 저장

        - name: create file
          shell: |
            df -h | grep /dev/mapper/cs-root | awk -F" " '{print $5}' | cut -d'%' -f 1
          register: df_result
          become: yes
          - name: test
            stat:
              path: /root
            register: root_stat
            become: yes
        
          - name: print
            debug:
              msg: "{{ root_stat }}"
        
          - name: print
            debug:
              msg: "{{ root_stat.stat.exists }}"

        set_fact

        동적으로 변수 저장

          - set_fact: var05={{ df_result.stdout }}

        when 조건문

        모듈에 when 옵션 추가


        동적 인벤토리

        설정

        vi /etc/ansible/ansible.cfg 파일 수정 
        [inventory] 항목에서 aws_ec2 추가

        yum install python3
        pip3 install boto3
        vi /etc/ansible/ansible.cfg
        ...
        [inventory]
        # enable inventory plugins, default: 'host_list', 'script', 'auto', 'yaml', 'ini', 'toml'
        enable_plugins = host_list, virtualbox, yaml, constructed, aws_ec2
        ...

        인벤토리 파일 생성

        ---
        plugin: aws_ec2
        aws_access_key: 액세스키
        aws_secret_key: 시크릿키
        keyed_groups:
          - key: tags
            prefix: tag

        확인

        플레이북 생성

        - hosts: ["tag_group_test"]
          vars:
            ansible_ssh_private_key_file: "/ec2/test.pem"
          tasks:
          - name: print
            debug:
              msg: "{{ ansible_facts.default_ipv4.address }}"
            become: yes

        실행

        ansible-playbook -i aws_ec2.yml playbook --user ubuntu
        728x90
        반응형
        LIST
        저작자표시 (새창열림)

        'IaC' 카테고리의 다른 글

        4. Terraform(테라폼)  (0) 2023.03.30
        Ansible(앤서블) - 활용(3계층구현)  (0) 2023.03.29
        쉘 프로그래밍 - 활용  (0) 2023.03.29
        2. 쉘 프로그래밍  (0) 2023.03.29
        1. IaC  (0) 2023.03.28
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바