ansible 기본 자습서

9811 단어
ansible는 경량급 IT 자동화 도구로 많은 운영 도구(puppet, cfengine,chef,func,fabric)의 장점을 집합하여 대량 시스템 설정, 대량 프로그램 배치, 대량 운행 명령 등 기능을 실현했다.
특징
  • SSH by default
  • No agents: controlled hosts/devices need no agent sofware
  • No server: any linux machine can do Ansible activities via terminal commands
  • Modules in any languages: the modules can be developed in any languages
  • YAML, not code: using YAML language(태그 언어, 클래스 XML) to write playbook
  • Strong multi-tier solution: 다단계 관리 가능
  • ansible 프로필
  • ansible.cfg
  • 다양한 통용 변수 정의
  • ansible를 찾습니다.cfg 파일 순서
  • ANSIBLE_CONFIG 환경 변수에 지정된 파일
  • ./ansible.cfg
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

  • 구성 예:
  • inventory = /etc/ansible/hosts  #  inventory    
    

    Inventory
    Ansible는 지정한 서버만 관리할 수 있으며 inventory 파일에서 대응하는 호스트/그룹의 데이터를 설정할 수 있습니다. 그 형식은 다음과 같습니다.
    --  (       )
    [webservers]
    --   
    foo.example.com
                                 
    --        + ssh   
    jumper ansible_ssh_host=192.168.1.50 ansible_ssh_user=appadmin
            
    --01 50,     hostname
    www[01:50].example.com
    
    -- host    ,  playbook     
    host1 http_port=80 maxRequestsPerChild=808
    
    -- group    ,        host
    [atlanta]
    host1
    host2
    
    [atlanta:vars]
    ntp_server=ntp.atlanta.example.com
    proxy=proxy.atlanta.example.com    
    
    --   
    [southeast:children]
    atlanta
    raleigh    
    

    Ansible Ad-Hoc 명령
  • 임시 명령
  • ansible  -m  -a 
    
  • module를 지정하지 않으면 기본적으로command 모듈
  • 을 실행합니다
  • ansible-doc: 모듈 목록 획득 및 모듈 사용 형식
  • ansible-doc [-l] [-s MODULE]
  • -l: 지원되는 핵심 모듈 나열
  • -s MODULE: 모듈 보기 사용법


  • 사용 예: ping 호스트
    ansible -i hosts webservers -m ping --ask-pass -u user
    ansible -i hosts all -m ping --ask-pass -u user
    

    출력:
    [root@Centos7 ~]# ansible all -m ping
    host1 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    host2 | UNREACHABLE! => {
        "changed": false,
        "msg": "Authentication failed.",
        "unreachable": true
    }
    

    매개 변수 해석
  • -m, --module-name: module name to execute(default=command)
  • -m ping: ping module
  • 실행
  • -a, --args: module arguments
  • -i, --inventory-file: specify inventory host path(default=/etc/ansible/hosts) or comma separated host list.
  • -k, --ask-pass: ask for connection password
  • -u REMOTE_USER, --user=REMOTE_USER: connect as this user (default=None)
  • 웹서버스는 이 명령을 실행하는 그룹을 표시하고, all는 inventory에 설정된 모든 호스트
  • 를 표시한다.
  • -l,--limit=SUBSET:further limit selected hosts to an additional pattern, 한정 그룹 또는 host로 playbook
  • -c, --connect: connect type to use (default=smart)
  • --ask-vault-pass: ask for vault password(sudo 모드 필요)
  • -b, --become: run operations with become(does not imply password prompting)(playbook에서 작성한 become user로 조작)
  • -t TAGS, --tags=TAGS: only run plays and tasks tagged with these values
  • -C, --check: don't make any changes; instead, try to predict some of the changes that may occur

  • Ansible Playbook
  • Ad-Hoc 명령은 임시적이고 간단한 명령만 수행할 수 있음
  • 실제 기업 응용은 여러 단계를 거쳐야 하고 각 단계 간에 의존 관계가 존재하기 때문에 Ad-Hoc 명령이 사용 수요를 충족시키지 못한다
  • playbook을 사용하여 절차 및 의존을 정의한다
  • playbook는yaml에서 작성하여 원격 호스트가 사전에 편성된 메커니즘에 따라task
  • 를 실행하도록 한다.
    ---
    - hosts: all    #  tasks   ,all    
      become: yes   #        tasks,           task 。
      become_user: root
      remote_user: username #the user log into machine.
      
      tasks:
        #   task              
        #   task         ,       ,               task   
        #   task
        - name: copy local file to remote machine
          #         
          copy: 
            src: ~/test
            dest: ~/test
            owner: root 
            mode: 0600
          #             ,      
          register: rsa
          #       
          environment:
            JAVA_HOME: /usr/java/jre1.8.0_51
          # task     ,  host   task    ,            。
          ignore_errors: yes
          #     task  tags,        tags task  (     :-t deploy)
          tags: deploy
          # (call the tasks defined in handlers if module does some changes to the remote host)
          notify:
            - do something
                
        # defines a list of tasks
        handlers:
          - name: do something
            service: test
    
        - name: task 2
          debug: var={{ host_vars }} #     host host_vars  
    
    
  • 예: 몇 대의 기기에서hostname 명령을 실행하고 되돌아오는 값을 가져옵니다
  • 파일 디렉토리:
  • test        # inventory  ,    
    test.yml    # playbook
    
  • inventory 구성 내용
  • [server]
    host1 ansible_ssh_host=1.1.1.1 ansible_ssh_user=appadmin
    host2 ansible_ssh_host=1.1.1.2 ansible_ssh_user=appadmin
    
  • test.yml 내용
  • ---
    - hosts: all
      tasks:
        - name: get hostname
          shell: hostname
          register: out
    
        - debug: var=out
    
  • playbook: $ ansible-playbook -i test test.yml, 반환 내용:
  • PLAY [all] *********************************************************************
    
    TASK [setup] *******************************************************************
    ok: [host1]
    ok: [host2]
    
    TASK [get hostname] ************************************************************
    changed: [host1]
    changed: [host2]
    
    TASK [debug] *******************************************************************
    ok: [host1] => {
        "out": {
            "changed": true,
            "cmd": "hostname",
            "delta": "0:00:00.003584",
            "end": "2017-02-09 16:05:04.043118",
            "rc": 0,
            "start": "2017-02-09 16:05:04.039534",
            "stderr": "",
            "stdout": "host1.com",
            "stdout_lines": [
                "host1.com"
            ],
            "warnings": []
        }
    }
    ok: [host2] => {
        "out": {
            "changed": true,
            "cmd": "hostname",
            "delta": "0:00:00.003584",
            "end": "2017-02-09 16:05:04.043118",
            "rc": 0,
            "start": "2017-02-09 16:05:04.039534",
            "stderr": "",
            "stdout": "host2.com",
            "stdout_lines": [
                "host1.com"
            ],
            "warnings": []
        }
    }
    
    PLAY RECAP *********************************************************************
    #      host task    ,ok       task  ,charged   host     task  。
    host1                         : ok=3    changed=1    unreachable=0    failed=0
    host2                         : ok=3    changed=1    unreachable=0    failed=0
    

    role 사용
  • playbook에서task문제를 직접 호출
  • 플레이북은 처리해야 할 일이고task는 세부 사항을 수행하며플레이북은 세부 사항에 관심이 없다
  • playbook에서task를 직접 호출하여task를 다시 사용할 수 없음
  • 플레이북은 점점 길어지고 유지하기 어려워진다
  • 하나 이상의task를 하나의 롤러로 추상화하여 세부 사항을 숨기고playbook 호출
  • role는 복원하기 쉬워서 이미 알고 있는 파일 구조에서 vars,tasks,handler를 자동으로 불러올 수 있습니다.
  • 부분 파일 구조:
  • test
    test.yml
    roles/
        install/
            files/
            templates/
            tasks/
                main.yml  #   install  ,    main.yml
            handlers/
            vars/
        deploy/
            files/
            templates/
            tasks/
                main.yml
            handlers/
            vars/
    
  • 플레이북 내용
  • ---
    - hosts: webservers
      roles:
         - install
         - deploy
    

    부분 공통 모듈
  • file: 파일, 폴더, 하이퍼링크 클래스의 창립, 복사, 이동, 삭제 작업을 포함한다.
  • copy: copy a file on the local box to remote locations. (remote src를 사용하여 src를 원격 기기에서 2.0 이후 버전에 적용할 수 있음)
  • fetch: copy files from remote locations to the local box.
  • template: Templates a file out to a remote server.
  • command: Executes a command on a remote node(It will not be processed through the shell, so variables like $HOME and operations like "", "|", ";"and "&"will not work)If you want to execute a command securely and predictably, it may be better to use the command module instead.
  • lineinfile: Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression.
  • pause : Pause playbook execution
  • ping : Try to connect to host, verify a usable python and return pong on success. no sense in playbook.
  • shell : Execute commands in nodes.(runs the command through a shell (/bin/sh) on the remote node.)If you want to execute a command securely and predictably, it may be better to use the command module instead.
  • debug : Print statements during execution
  • setup: Filter를 지원하는 Gathers facts about remote hosts(기본값).
  • apt : Manages apt-packages
  • service: Controls services on remote hosts
  • fail: Fail with custom message
  • subversion: Deploys a subversion repository.
  • group: Add or remove groups
  • user: Manage user accounts
  • get_url: Downloads files from HTTP, HTTPS, or FTP to node
  • wait_for: Waits for a condition before continuing.(port is open , file is present, and so on.)
  • script: Runs a local script on a remote node after transferring it

  • 실제 장면 응용
  • Ansible Best Practices Summary
  • 참조: Ansible Best Practices Summary
  • ansible가 자체로 만든 ansible tower를 제외하고는 개원된 ui,semaphore,semaphore 사용 강좌,ansible ui를 시도하거나django 자체로 간단한 관리를 완성하는 것도 고려할 수 있다.

  • 참조:
    an-intro-to-network-automation-3-ansible an-ansible-tutorial ansible-simple-tutorial

    좋은 웹페이지 즐겨찾기