我最近開始使用ansible和docker,一開始遇到了困難,但終於成功啟動了

简述

看到某个网站提到ansible可能可以改变按照Excel操作手册进行操作的现实,所以我尝试了与docker的组合来验证。然后在验证过程中发现了一个叫做“Ansible的Docker连接插件”的方法,可以在连接到容器时不需要ssh,于是我修改了配置以实现能够进行连接的备忘录。

环境

操作系统:CentOS 7
Ansible版本:2.9.13
Docker版本:19.03.13
Docker Compose版本:1.26.2

由于各种中间件的安装方式已在不同的来源上公开,因此不再赘述。

遭遇失败时的设置

容器端

    DockerFile
# OS
FROM centos:centos7

# pkg install
RUN yum install -y epel-release && \
    yum update -y  && \
    yum install -y openssh-server openssh-clients sshpass && \
    yum install -y net-tools vim

ENV LANG ja_JP.UTF-8

# root password
RUN echo password | passwd --stdin root

# # sshd_config edit
RUN sed -ri "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
RUN systemctl enable sshd.service

CMD ["/sbin/init"]

使用ansible来准备连接容器(最初打算使用ssh,因此创建了该容器)。

    docker-compose
version: '3.7'

services:
  srv1:
    build:
     context: .
     dockerfile: srv-dockerfile
    hostname: srv1
    container_name: srv1
    environment:
      - TZ=Asia/Tokyo
    restart: always
    tty: true
    networks:
      app_net:
        ipv4_address: 172.16.238.101

  srv2:
    build:
     context: .
     dockerfile: srv-dockerfile
    hostname: srv2
    container_name: srv2
    environment:
      - TZ=Asia/Tokyo
    restart: always
    tty: true
    networks:
      app_net:
        ipv4_address: 172.16.238.102

# 固定IP付与用のNW設定
networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.238.0/24

加上固定IP,看起来SSH会方便一些。

启动容器。

# docker-compose up -d
Starting srv1 ... done
Starting srv2 ... done

ansible侧。

    hosts
[testGrp]
172.16.238.101
172.16.238.102
    yaml
- name: start up a docker container
  hosts: localhost
  tasks:
    - name: start up a docker container by running bash
      command: docker-compose -f /srv/ansible/docker-compose.yml up -d
  tags:
    - never # docker-composeで「alwaus: restart」としているので、普段は動作しないようにした

- name: connection test
  hosts: testGrp
  connection: docker #connection plugin利用の指定
  tasks:
  - name: ping
    ping:

运行playbook的结果

# ansible-playbook -i hosts test-ansible.yml --check --diff

PLAY [start up a docker container] ***********************************************************************************************************************************

PLAY [connection test] ***********************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
fatal: [172.16.238.101]: UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1602479114.98-3164-90901945313893 `\" && echo ansible-tmp-1602479114.98-3164-90901945313893=\"` echo ~/.ansible/tmp/ansible-tmp-1602479114.98-3164-90901945313893 `\" ), exited with result 1", "unreachable": true}
fatal: [172.16.238.102]: UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in \"/tmp\", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p \"` echo ~/.ansible/tmp `\"&& mkdir \"` echo ~/.ansible/tmp/ansible-tmp-1602479115.05-3165-268763785818242 `\" && echo ansible-tmp-1602479115.05-3165-268763785818242=\"` echo ~/.ansible/tmp/ansible-tmp-1602479115.05-3165-268763785818242 `\" ), exited with result 1", "unreachable": true}

PLAY RECAP ***********************************************************************************************************************************************************
172.16.238.101             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
172.16.238.102             : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   

没有发生任何失败。
错误信息中提到tmp文件夹可能没有权限,但是我觉得不可能是权限不足之类的问题,所以就没处理。

# docker-compose ps
Name    Command     State   Ports
---------------------------------
srv1   /sbin/init   Up           
srv2   /sbin/init   Up
# docker inspect srv1 | grep IPv4Address
                        "IPv4Address": "172.16.238.101"
# ping 172.16.238.101
PING 172.16.238.101 (172.16.238.101) 56(84) bytes of data.
64 bytes from 172.16.238.101: icmp_seq=1 ttl=64 time=0.133 ms
64 bytes from 172.16.238.101: icmp_seq=2 ttl=64 time=0.134 ms

为了确认一下,我单独执行了ping命令,结果是成功的,所以可以确定容器本身没有问题。

成功时的设置 shí de

    hosts
[testGrp]
#172.16.238.101
#172.16.238.102
srv1
srv2

在浏览了许多有参考价值的文章后,我突然意识到每篇文章在使用插件时都是用”主机名”来进行指定(在这段时间内已经半天过去了)。
因此,我决定将目标指定方式从”IP”改为”容器名”。
※除此之外,我还删除了dockerfile中的ssh等内容,但这与成功无关,所以不再赘述。

执行结果

# ansible-playbook -i hosts test-ansible.yml --check --diff

PLAY [start up a docker container] ***********************************************************************************************************************************

PLAY [connection test] ***********************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [srv2]
ok: [srv1]

TASK [ping] **********************************************************************************************************************************************************
ok: [srv2]
ok: [srv1]

PLAY RECAP ***********************************************************************************************************************************************************
srv1                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
srv2                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

胜利了!

总结一下

    • 「Docker connection plugin for Ansible」を利用するとコンテナ内にsshdが要らない

 

    • pluginを利用して接続する場合は、playbookで「connection: docker」を指定する

 

    ホストの指定方法は必ず「コンテナ名」で指定する

即使不仔细看,也可以看到包括容器名称和主机名称在内的官方文件中有所写明。从验证SSH连接开始,一直坚信能够固定IP并进行指定IP连接的测试,然而最后以失败告终…

未解决的问题

    ansibleのコンテナ化

实际上,我原本希望将所有东西都在容器中启动,包括Ansible,但是容器化后,无法通过相应的插件访问其他容器,因此暂时直接在主机上安装了。
我看到有一篇文章说如果使用DooD可以实现,但奇怪的是容器无法识别,并且无法使用docker命令。
嗯,虽然这不是主要问题,但以后再说吧。

请查阅

    • AnsibleでDockerコンテナを操作してみよう

 

    • dockerのコンテナに固定IPを振る(compose file version 3の注意点)

 

    コンテナからコンテナを操作する
广告
将在 10 秒后关闭
bannerAds