2017-09-28 6 views
0

저는 노트북에서 로컬로 사용하는 아이디어로 Ansible을 배우고 있으며 현재 "includes"로 작업하고 있습니다.Docker 서비스가 시작되지 않았습니다.

다른 작업 (기본 패키지 설치, git, vim 및 docker 설정)을 가져 와서 실행할 수있는 게임을 준비하고 싶습니다.

모든 코드는 GitLab에서 호스팅되며 무료 CI 서비스를 사용하여 게임을 테스트합니다.

docker 서비스가 실행 중인지 확인할 때까지 CI 작업이 실행됩니다. 이 시점에서, 놀이는 다음 메시지와 함께 실패합니다

fatal: [localhost]: FAILED! => { 
    "changed": true, 
    "cmd": ["service", "docker", "restart"], 
    "delta": "0:00:00.176233", 
    "end": "2017-09-28 18:49:56.194752", 
    "failed": true, 
    "msg": "non-zero return code", 
    "rc": 1, 
    "start": "2017-09-28 18:49:56.018519", 
    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "", 
    "stdout_lines": [] 
} 

나는 내 노트북에 고정 표시기 컨테이너 (docker run --rm -ti debian)를 생성하고 로컬 재생을 실행하고 동일한 자리에 실패했습니다.

컨테이너가 privileged 플래그로 생성 된 경우 서비스를 수동으로 시작한 다음 다시 실행할 수 있습니다. 이번에는 성공적으로 끝날 것입니다.


그래서, 내 질문은 :

  • 가 어떻게 Ansible를 사용하여 docker 서비스를 시작할 수 있습니까?
    • 나는 그것을 완전히 잘못하고 있으며이 방법을 사용하는 더 좋은 방법이 있습니까?
  • 내 랩톱에서 컨테이너를 실행할 때 privilege 모드로 만들었습니다. 이것은 서비스 을 시작하는 것을 허용했다.
  • privileged 플래그와 함께 프로젝트에 내 자신의 주자를 추가 할 수있는 가능한 솔루션
  • 을 활성화 할 수 없습니다 : 나는 용기가 GitLab-CI 공공 인스턴스를 생성하는 방법을 수정할 수 없기 때문에
    • ?

PS : 순간, 나는 정확히 모범 사례에 찾는 게 아니에요, 난 그냥이 함께 플레이 할 무언가를 가지고 실행 얻기 위해 노력하고있어.

환경 :

  • Ansible : 2.4.0
  • 파이썬 : 2.7.13
  • 도커 : 17.09.0-CE

--- --- ---

gitlab-ci.yml 파일 :

image: debian:latest 

variables: 
    HOST_INVENTORY: "./hosts" 
    INCLUDES_DIR: "./gists/includes" 

before_script: 
    - apt-get update -qq 
    - apt-get install -y curl gcc g++ openssh-server openssh-client python python-dev python-setuptools libffi-dev libssl-dev 
    - easy_install pip 
    - pip install ansible 

stages: 
    - syntax_check 
    - install 

check: 
    stage: syntax_check 
    script:  
    - ansible-playbook -i $HOST_INVENTORY $INCLUDES_DIR/play.yml --limit 'local' --syntax-check; 

run_includes: 
    stage: install 
    script: 
     - ANSIBLE_PIPELINING=True ansible-playbook -i $HOST_INVENTORY $INCLUDES_DIR/play.yml --limit 'local'; 

play.yml입니다 매우 간단 만 가져 일부 재생 :

- hosts: local 
    become: yes 
    become_method: sudo 

    pre_tasks: 
    - import_tasks: tasks/pre.yml # update package manager cache 

    tasks: 
    - import_tasks: tasks/common.yml 
    - import_tasks: tasks/docker.yml 

그리고 docker 작업 :

- name: Dependencies 
    package: 
    name: "{{ item }}" 
    state: installed 
    with_items: 
    - apt-transport-https 
    - ca-certificates 
    - curl 
    - gnupg2 
    - software-properties-common 

- name: Docker module dependencies 
    pip: 
     name: docker-py 

- name: Add Docker key 
    shell: curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - 

- name: Add Docker repo 
    shell: echo "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo $ID) $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list 

- name: Install Docker 
    apt: 
    pkg: docker-ce 
    state: installed 
    update_cache: yes 

- name: Ensure Docker group is present 
    group: 
    name: docker 
    state: present 

- name: Add current user to the Docker group 
    user: 
    name: "{{ ansible_user }}" 
    groups: 
     - docker 
    append: yes 

- name: Ensure service is enabled 
    command: service docker restart 

- name: Pull images from Docker hub 
    docker_image: 
    name: "{{ item }}" 
    with_items: 
    - debian 
    - cern/cc7-base 
+0

실제로 단계를 수행해 도커 서비스가 시작되지 않습니다! – Deano

+0

@Deano 내 데비안에서는 서비스가 중지 된 상태에서'service docker restart'를 실행하면 서비스가 시작됩니다. 어니 셔 너의 행동이 다를 수 있습니까? –

+0

나는 docker를 설치하기 위해 사용하지는 않았지만 그것을 관리하기 위해 사용했다. 서비스를 시작하기 위해 다른 행동을 보지 말아야한다. 아마도'service name = docker state = started'를 사용할 것이다. – Deano

답변

1

그래서 나는 당신이 우리가 당신의 ansible 따라서 컨테이너 내부에서 실행되어 볼 수 있듯이 주자

$ echo PWD is $PWD 
PWD is /builds/tarunlalwani/testci 
$ id 
uid=0(root) gid=0(root) groups=0(root) 
$ ps aux 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root   1 0.0 0.1 20260 2984 ?  Ss 19:41 0:00 /bin/bash 
root   7 0.0 0.1 20420 2652 ?  S 19:41 0:00 /bin/bash 
root  10 0.0 0.0 17500 1996 ?  R 19:41 0:00 ps aux 
$ which systemctl 
/bin/systemctl 
$ systemctl status docker 
Failed to get D-Bus connection: Unknown error -1 
ERROR: Job failed: exit code 1 

에 몇 가지 명령을 실행하는 gitlab.com에 샘플 프로젝트를 생성 스크립트가 작동하지 않습니다. 시작 또는 종료 할 부두 서비스가 없습니다. 또한 도커 컨테이너 안에 있기 때문에 도커 컨테이너를 다시 시작하면 실행중인 컨테이너가 종료됩니다.

우분투 VM을 설치 한 다음 쉘 실행 프로그램과 함께 Gitlab Runner를 설정해야합니다. 쉘 실행기는 명령 systemctl

+0

나는 본다. 도와 주셔서 감사합니다! 나는 시험을 위해 주자를 세울 것이다. –

0

또 다른 방법은 우리가 이미 제공되는 공유 주자를 사용하여 컨테이너 내부의 플레이 북을 테스트하게됩니다 GitLab's dind service을 사용 docker 서비스를 것 VM에서 실행한다는 것을 의미합니다.

두 가지가 여기에 필요하다 :

Ansible을 실행하기위한 모든 요구 사항을 기본 이미지를 구축하기위한 Dockerfile
  1. .
  2. 컨테이너 내에서 작업을 실행하기 위해 수정 된 gitlab-ci 파일. 예를 들어

Dockerfile는 다음과 같이 수 :

image: docker:latest 
services: 
    - docker:dind 

variables: 
    DOCKER_IMAGE: "registry.gitlab.com/<YOUR_USER>/<YOUR_REPO>/dummy-image" 
    CONTAINER_NAME: "test" 
    IMAGE_USERNAME: "dummy" 

stages: 
    - build 
    - check 

before_script: 
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com 
after_script: 
    - docker rm -f $(docker ps -aq) 
    - docker rmi $DOCKER_IMAGE 
    - docker logout registry.gitlab.com 

build_image: 
    stage: build 
    script: 
    - docker build --pull -t $DOCKER_IMAGE --build-arg USERNAME=$IMAGE_USERNAME . 
    - docker push $DOCKER_IMAGE 
    when: manual 

check_version: 
    stage: check 
    script: 
     - docker run -di --name $CONTAINER_NAME $DOCKER_IMAGE 
     - docker exec $CONTAINER_NAME /bin/bash -c "ansible-playbook --version" 

이도 추가했다 : 다음

FROM debian:latest 
ARG USERNAME 

RUN apt-get update && \ 
    apt-get install -y curl \ 
         git \ 
         gcc \ 
         g++ \ 
         libffi-dev \ 
         libssl-dev \ 
         openssh-client \ 
         openssh-server \ 
         python \ 
         python-dev \ 
         python-setuptools \ 
         sudo 

RUN easy_install pip && \ 
    pip install ansible \ 
       jmespath 

RUN useradd -ms /bin/bash $USERNAME 
USER $USERNAME 
WORKDIR /home/$USERNAME 

과의 gitlab-ci.yml 파일에, 우리는 같은 것을 할 수 있습니다 Ansible 실행을위한 모든 필수 조건은 build 단계에서 설정되며 CI 프로세스가 실행될 때마다 다시 반복하지 않아도됩니다 (원래 gitlab-ci.yml 파일).