Ansible 배포 노드. js

9351 단어
교과 과정 지수
난이도 지수: 4 성 (만 성 5 성) 기술 지수: 5 성 (만 성 5 성) 이론 지수: 3 성 (만 성 5 성) 대상: 자동화 운영 & 초 중급 운영
디 렉 터 리 공유
1.1 추가 소스 1, 2 를 추가 하여 Node. js app 4, 3 을 배치 하고 Node. js app 6 1.4 Node. js app 서버 를 실행 합 니 다.질문
다음은 우리 의 CentOS 6. x 서버 에 Nodejs 를 설정 하고 간단 한 nodejs 인 스 턴 스 를 시작 할 것 입 니 다. 이 서버 는 간단 한 구조 가 있 습 니 다.
시 작 했 습 니 다. 우선 플레이 북 파일 을 만 듭 니 다. 우 리 는 가능 한 한 간단하게 유지 할 것 입 니 다.
---
- hosts: all
  tasks:

이 플레이 북 을 실행 하 는 호스트 를 정의 한 다음 일련의 tasks 를 보 여 줍 니 다.
1.1 추가 소스 추가
서버 를 사용 하려 고 할 때 패 키 지 를 지정 하거나 최신 버 전에 사용 할 수 있 도록 관리자 가 먼저 추가 소스 를 추가 합 니 다.다음 스 크 립 트 는 node. js 와 유사 한 패 키 지 를 얻 을 수 있 도록 EPEL 과 Remi 소스 를 추가 하고 싶 습 니 다.셸 스 크 립 트 로 처리 하면 다음 과 같 습 니 다.
 #    Remi GPG    –    : http://rpms.famillecollet.com/RPM-GPG-KEY-remi
wget http://rpms.famillecollet.com/RPM-GPG-KEY-remi \
 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
 
#    Remi repo, Remi repo        PHP  
rpm -Uvh --quiet \
http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
 
#   EPEL 
yum install epel-release
 
 #    Node.js (npm +        ).
 yum --enablerepo=epel install npm

이 셸 스 크 립 트 는 EPEL 과 Remi 의 GPG keys 를 가 져 온 다음 원본 을 추가 하고 마지막 으로 Nodejs 를 설치 하 는 데 사 용 됩 니 다.이것 은 간단 한 배치 에 문제 가 없 지만, 이렇게 많은 명령 을 실행 하 는 것 은 비교적 어 리 석 은 방법 입 니 다. 만약 당신 의 연결 이 부주의 로 끊 어 지면, 당신 의 스 크 립 트 도 멈 출 것 입 니 다.만약 이때, 당신 의 대본 이 막 완성 되 었 다 면?
알림: 지정 한 절 차 를 뛰 어 넘 으 려 면 GPG keys 를 추가 하 는 절 차 를 뛰 어 넘 을 수 있 습 니 다. 명령 을 실행 할 때 - nogpgcheck 을 추가 하거나 Ansible 에서 yum 모듈 에 disable 을 설정 하 십시오.gpg_check 인 자 는 yes 이지 만 GPG keys 를 추가 하 는 것 이 좋 습 니 다.GPG 를 사용 하면 가방 의 작성 자가 누구 인지, 가방 에 수정 원고 가 있 는 지 알 수 있 습 니 다. 당신 이 무엇 을 하고 있 는 지 알 지 않 는 한 GPG 검 사 를 금지 하지 않 는 것 이 좋 습 니 다.
Ansible 은 일 을 더욱 건장 하 게 만 들 었 습 니 다. 아래 에 Ansible 을 사용 한 사례 는 더욱 상세 해 보 입 니 다. 이 는 위의 셸 스 크 립 트 와 같은 기능 을 가지 지만 이해 하기 쉽 고 구조 화 되 었 습 니 다.다음은 Ansible 의 변수 와 다른 유용 한 특성 을 사용 합 니 다.위의 플레이 북 을 이어서 우 리 는 계속 아래로 썼 다.
  tasks:
   - name: Import Remi GPG key
     rpm_key: "key={{ item }} state=present"
     with_items:
       - "http://rpms.famillecollet.com/RPM-GPG-KEY-remi"
   - name: Install Remi repo.
     command: "rpm -Uvh --force {{ item.href }} creates={{ item.creates }}"
     with_items:
       - href: "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm"
         creates: "/etc/yum.repos.d/remi.repo"

   - name: Install epel repo
    yum: name=epel-release state=present

   - name: Stop the firewall
     service: name=iptables state=stopped
 
   - name: Install NodeJS and npm
     yum: name=npm state=present enablerepo=epel

구체 적 인 절 차 를 살 펴 보 자.
  • rpm_key 는 RPM 데이터베이스 에서 GPG key 를 추가 하거나 제거 하 는 Ansible 모듈 입 니 다.리 미 소스 에서 키 를 가 져 오고 있 습 니 다.
  • Ansible 은 rpm 명령 이 없 기 때문에 우 리 는 command 모듈 을 사용 하여 rpm 명령 을 사용 합 니 다. 그러면 우 리 는 다른 두 가지 일 을 할 수 있 습 니 다.a) 크 레 아 스 파 라 메 터 를 사용 하여 Ansible 이 언제 이 명령 을 실행 하지 않 는 지 알려 줍 니 다. 이 예 에서 우 리 는 Ansible 에 게 이 명령 이 성공 적 으로 실 행 된 후에 그 파일 을 만 들 것 이 라 고 알려 줍 니 다.이 파일 이 존재 할 때 이 명령 은 실행 되 지 않 습 니 다.b) with 사용items 는 URL 과 creates 검사 에 사용 할 파일 을 정의 합 니 다.
  • yum 은 EPEL 소스 설 치 를 책임 진다.
  • 이 서버 는 테스트 용 으로 사 용 될 것 이기 때문에 저 희 는 service 모듈 을 사용 하여 시스템 방화벽 을 금지 하고 테스트 에 간섭 하지 않도록 합 니 다.
  • yum 은 Node. js (npm, Node 's package manager 를 동시에 설치 합 니 다) 를 설치 합 니 다. 저 희 는 enablerepo 를 사용 하여 EPEL 소스 에서 검색 할 것 을 지정 합 니 다. 물론 disablererepo 를 사용 하여 그 소스 (reposcory) 를 사용 하지 않 을 것 을 지정 할 수도 있 습 니 다.
  • NPM 이 설치 되 어 있 기 때문에 Ansible 의 npm 모듈 을 사용 하여 Node. JS 도구 forever, forever 를 설치 하여 우리 의 app 을 실행 합 니 다. global 을 yes 로 설정 하고 NPM 설치 모듈 이 / usr / lib / node 에 있다 고 알려 줍 니 다.modules 위치, 그리고 모든 사용자 가 사용 할 수 있 습 니 다.

  • Node. js app 서버 가 있 습 니 다. 간단 한 Node. js app 을 배치 하여 80 포트 에서 HTTP 요청 에 응답 합 니 다.
    1.2 Node. js app 배치
    이 단 계 는 우리 서버 에 간단 한 Node. js app 을 배치 하 는 것 입 니 다.우선, 새 폴 더 를 만 드 는 것 을 통 해 간단 한 Node. js app 을 만 듭 니 다. 이 폴 더 는 위의 ymal 파일 과 같은 경로 아래 에 있 습 니 다.그리고 새 파일, app. js 를 만 들 고 이 폴 더 에서 아래 파일 을 편집 합 니 다.
    //app.js
    //   express   .
    var express = require('express'),
    app = express.createServer();
     
    //   ”/”    'Hello World'.
    app.get('/', function(req, res){
            res.send('Hello World! Yunzhonge');
    });
     
    //              80  
    app.listen(80);
    console.log('Express server started successfully.')
    

    node. js 의 문법 과 우리 의 사례 를 걱정 하지 마 세 요.우 리 는 빠 른 배치 사례 가 필요 합 니 다. 이 사례 는 Python, Perl, Java, PHP 또는 다른 프로 그래 밍 언어 로 쓸 수 있 습 니 다. 그러나 Node 는 매우 간단 한 언어 이기 때문에 간단 한 경량급 환경 을 운영 합 니 다. 이것 은 매우 좋 은 언어 로 서버 를 테스트 합 니 다.
    이 작은 app 은 Express (간단 한 Node 의 HTTP 프레임 워 크) 에 의존 하기 때문에 저 희 는 package. json 파일 을 통 해 NPM 에 의존 관 계 를 알려 야 합 니 다. 이 파일 은 app. js 와 같은 경로 아래 에 있 습 니 다.
    {
            "name": "examplenodeapp",
            "description": "Example Express Node.js app.",
            "author": "yunzhonghe",
            "dependencies": {
            "express": "3.x.x"
            },
            "engine": "node >= 0.10.6"
    }
    

    그리고 다음 내용 을 플레이 북 에 추가 하고 앱 전 체 를 이 서버 에 복사 한 다음 npm 에 의존 하 는 것 을 다운로드 하도록 합 니 다. (여 기 는 express 입 니 다.)
       - name: Ensure Node.js app folder exists.
         file: "path={{ node_apps_location }} state=directory"
     
       - name: Copy example Node.js app to server.
         copy: "src=app dest={{ node_apps_location }}"
     
       - name: Install app dependencies defined in package.json.
         npm: "path={{ node_apps_location }}/app"
    
  • 우선 우리 가 설치 한 app 디 렉 터 리 가 존재 하도록 file 모듈 을 사용 합 니 다.{{node apps location} 변 수 는 vars 부분 에서 정의 할 수 있 으 며, vars 부분 은 playbook 의 맨 위 에 있 습 니 다.물론 inevtory 에서 도 정의 할 수 있 고 ansible - playbook 을 실행 할 때 도 정의 할 수 있 습 니 다.
  • 저 희 는 Ansible 의 copy 모듈 을 사용 하여 이 모든 app 폴 더 를 테스트 서버 에 복사 합 니 다. copy 모듈 은 단일 한 파일 과 파일 을 포함 하 는 디 렉 터 리 를 똑똑 하 게 구분 한 다음 에 디 렉 터 리 에서 재 귀적 으로 rsync 나 scp 와 같 습 니 다.Ansible 의 copy 모듈 은 하나의 파일 이나 소량의 파일 을 사용 할 때 매우 좋 지만 대량의 파일 을 복사 하고 몇 층 의 디 렉 터 리 를 끼 워 넣 으 면 copy 모듈 이 감당 할 수 없습니다.이 경우 디 렉 터 리 전 체 를 복사 하려 면 synchronize 모듈 을 사용 하 는 것 이 좋 습 니 다. 압축 파일 을 복사 하고 펼 치 려 면 unarchive 모듈 을 사용 하 는 것 이 좋 습 니 다.
  • 세 번 째 단 계 는 npm 모듈 을 사용 합 니 다. 이번 에는 app 의 경 로 를 제외 하고 추가 적 인 매개 변수 가 없습니다.이것 은 NPM 에 게 package. json 파일 을 분석 하고 모든 의존 관계 가 존재 하 는 지 확인 하 라 고 알려 준다.이미 완성 되 었 습 니 다. 마지막 단 계 는 이 app 을 시작 하 는 것 입 니 다
  • 1.3 Node. js app 실행
    우 리 는 지금 forever 를 사용 하여 이 app 을 시작 합 니 다.
       - name: Check list of running Node.js apps.
         command: forever list
         register: forever_list
         changed_when: false
     
       - name: Start example Node.js app.
         command: "forever start {{ node_apps_location }}/app/app.js"
         when: "forever_list.stdout.find('{{ node_apps_location }}/app/app.js') == -1"
    

    이 플레이 에서 우 리 는 두 가지 새로운 일 을 했다.
  • register 는 새로운 변 수 를 만 들 었 습 니 다. forever다음 task 에서 다음 명령 을 실행 할 수 있 는 지 여 부 를 판단 하 는 데 사용 할 수 있 도록 list 입 니 다.register 명령 을 저장 하 는 출력 은 표준 출력 과 오류 출력 을 포함 하고 변수 이름 을 부여 합 니 다.
  • changed_when Ansible 에 게 언제 이 play 가 변 화 를 가 져 올 지 알려 줍 니 다.여기 서 forever list 명령 은 서버 의 변 화 를 가 져 오지 않 습 니 다. false 를 지정 하기 때 문 입 니 다.

  • 두 번 째 play 는 실제로 forever 를 사용 하여 이 app 을 시작 했다.이 앱 을 시작 할 수 있 습 니 다. node {{node apps location}} / app / app. js 를 호출 할 수 있 습 니 다. 하지만 이 방식 은 더 제어 하기 어렵 습 니 다.
    Forever 가 관리 하 는 Node app 을 추적 한 다음 에 저 희 는 Forever 의 list 옵션 을 사용 하여 일련의 실행 app 을 인쇄 합 니 다.우리 가 이 플레이 북 을 처음 실 행 했 을 때 이 list 는 분명히 비어 있 었 지만 비어 있 는 것 으로 판단 되면 실 행 됩 니 다. 만약 app 이 실행 중이 라면 다른 인 스 턴 스 를 시작 하지 않 을 것 입 니 다. 이러한 상황 을 피하 기 위해 서 우 리 는 when 문 구 를 사용 하여 app 의 경로 가 forever list 의 출력 정보 에 없 을 때 이 app 을 시작 합 니 다.
    1.4 Node. js app 서버 요약.
    이때 플레이 북 을 완성 한 다음 에 간단 한 Node. js app 을 설치 하여 80 포트 에서 HTTP 요청 에 응답 합 니 다.이 플레이 북 을 한 서버 에서 실행 하기 위해 아래 명령 을 사용 하여 node 를 전달 합 니 다.apps_location 변 수 는 명령 을 통 해
    ansible-playbook --extra-vars="node_apps_location=/usr/local/opt/node"
    

    서버 가 서버 설정 과 배 치 를 마 쳤 을 때 브 라 우 저 에서 테스트 서버 의 호스트 이름 을 지정 하여 효 과 를 봅 니 다.
    간단 하지만 유효 합 니 다. 50 줄 이하 의 YMAL 파일 에 Nodejs 응용 서버 를 설정 하 였 습 니 다.
    여기 서 마 치 겠 습 니 다. 여러분 의 관심 에 감 사 드 립 니 다.
    1.5 문제:
    문제 1: 내 가 100 대의 서버 에 nodejs app 배 치 를 진행 할 때 20 대가 중단 되 었 을 때 다시 실행 하 겠 습 니 다. 그 는 어떤 과정 입 니까? 앞 에 설 치 된 패 키 지 를 진행 하 는 설정 은 다시 실행 할 것 입 니까? 아니면 건 너 뛸 것 입 니까?번 거 로 운 황소 해답: Ansible 자체 가 멱 등 특성 을 가지 고 있어 모든 작업 의 안전성 을 효과적으로 보장 할 수 있 습 니 다. 실행 에 실패 한 경우 자동 으로 홈 디 렉 터 리 에서 해당 하 는 오류 서버 목록 을 생 성 합 니 다. - limit 을 통 해 나머지 작업 을 다시 목적 성 있 게 수행 합 니 다.
    문제 2: 대 협 의 nodejs 는 도 구 를 통 해 배 치 된 것 입 니까?npm 복잡 하 다.
    질문 3: -- extra - vars = 기업 에서 많이 응용 되 나 요?답: 많 습 니 다. 적어도 저희 업무 에서 계속 응용 되 었 습 니 다. 몇 기 전의 공유 도 보 셨 을 것 입 니 다. 이 매개 변 수 는 많이 응용 되 었 습 니 다.하지만 홈 페이지 에 소 개 된 것 은 한 몫 했다.많이 쓰 시 길 바 라 겠 습 니 다.
    질문 4: 제 가 ansible 을 통 해 임 무 를 수행 하 는 과정 에서 임 무 를 장시간 카드 주인 에 게 맡 기 는 원인 이 발생 할 수 있 습 니 다. 이 는 보통 어떤 부분 을 다시 조사 해 야 합 니까? 답: 많은 친구 들 이 이 문 제 를 만 났 을 때 계속 물 었 습 니 다. 개인의 경험 에 따라 다음 과 같은 몇 가지 측면 에서 조사 하 는 것 을 권장 합 니 다.
  • 현재 명령 실행 시간 이 길지 않 은 것 이 확실 합 니 다.
  • pong 검 측 서버 생존
  • 일부 명령 은 외부 네트워크 에 연결 하여 업데이트 시간 이 비교적 긴 네트워크 광대 역 상황 을 검사 해 야 한다
  • .
  • - vvv 는 매우 좋 은 조사 방식
  • 만약 에 풀 리 지 않 으 면 / etc / ansible / ansible. cfg 에서 작업 수행 시간 을 단축 하고 최종 종료 시 도 를 기 다 립 니 다
  • 좋은 웹페이지 즐겨찾기