代码之家  ›  专栏  ›  技术社区  ›  Adri C.S. nicogui

Ansible中未启动Docker服务

  •  1
  • Adri C.S. nicogui  · 技术社区  · 7 年前

    Ansible 考虑到在我的笔记本电脑中本地使用它,目前我正在使用“includes”。

    所有代码都托管在 GitLab 我用他们的免费 CI 测试剧本的服务。

    docker 服务正在运行。此时,播放将失败,并显示以下消息:

    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公司
      • 我是不是完全错了,有更好的方法让它工作吗?
    • privilege 模式这允许我启动服务 手动操作
      • GitLab-CI 公共实例:
      • 可能是一个可能的解决方案,将我自己的跑步者添加到项目中

    PS: 目前,我并不是在寻找最佳实践,我只是想让这项运动有点发挥作用。

    环境:

    • Ansible:2.4.0
    • Python:2.7.13
    • Docker: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
    

    码头工人 任务:

    - 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
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Tarun Lalwani    7 年前

    所以我在上创建了一个示例项目 gitlab.com 在运行程序上运行少量命令

    $ 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
    

    正如您所看到的,我们正在一个容器中运行,因此您的ansible脚本无法工作。没有要启动或结束的docker服务。此外,由于您位于docker容器内,因此重新启动docker容器也意味着杀死正在运行的容器。

    systemctl docker 服务

        2
  •  0
  •   Adri C.S. nicogui    7 年前

    GitLab's dind service 这将让我们使用已经提供的共享运行程序在容器中测试剧本。

    1. A. Dockerfile
    2. gitlab-ci

    例如 Dockerfile文件

    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 文件,我们可以有如下内容:

    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"
    

    build 阶段,并且不需要每次运行CI过程时都重复它们(与原始过程类似) gitlab ci。yml公司 问题中的文件)。