11
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ansible-playbookでdockerコンテナをプロビジョニングしてみた

Posted at

はじめに

通常dockerコンテナを構築する際、イメージのビルドの為にdockerfileの記述を行います。
しかしながら、イメージレイヤーを減らすためにRUNにAND演算子をひたすら繋げたコマンドを記述する必要があるため、
少々処理が追いにくくなることが難点です。
また、ansible用のロールをコンテナに適用する事を考えたときに、いちいち処理を書き直すのは面倒だなー…と
思っていた矢先にAnsibleのConnection Pluginの存在を知りました。

Connection Plugin

簡単に言えば、Ansibleサーバーとリモートホストの接続方式を切り替えられるプラグインのことです。
デフォルトではAnsibleサーバーとリモートホストの接続はsshが用いられますが、
Ansible 2.0からはdockerコンテナと接続できるDocker Connection Pluginも用意されていました。
ので、今回はこちらのプラグインを使用してみたいと思います。
詳しくは以下の参考元などをご覧ください。
ちなみにdocker connection pluginを使用する際は、connection: dockerを指定すれば良いとのことです。

実行例

例に倣ってとりあえず試してみました。

環境

項目名 バージョン
CentOS 7.3.1611
ansible 2.3.1.0
pip 9.0.1

手順

  1. Ansible(=>2.0)をインストール

    # yum install openssl-devel python-devel
    # pip install ansible
    
  2. docker-pyをインストール

    # pip install docker-py
    
  3. 以下のようにrole,playbookを記述
    今回は単純にCentOS6のベースイメージから作成したコンテナ上に、某界隈で有名なslをインストールしてみます。

    tree
    .
    |-- ansible.cfg
    |-- playbook
    |   `-- docker
    |       `-- test.yml
    `-- roles
    |-- docker
    |   `-- docker-run
    |       |-- defaults
    |       |   `-- main.yml
    |       `-- tasks
    |           |-- docker_run.yml
    |           `-- main.yml
    |-- remi
    |   `-- tasks
    |       |-- epel.yml
    |       `-- main.yml
    `-- sl
        `-- tasks
            |-- main.yml
            `-- sl.yml
    
    ansible.cfg
    [defaults]
    roles_path    = roles
    
    playbook/docker/test.yml
    ---
    
    - hosts: localhost
      connection: local
      roles:
        - { role: docker/docker-run }
    
    - hosts: test
      connection: docker
      roles:
        - { role: epel }
        - { role: sl }
    
    roles/docker/docker-run/defaults/main.yml
    docker_image: centos:6.9
    docker_hostname: test
    
    roles/docker/docker-run/tasks/docker_run.yml
    ---
    
    - name: Dockerコンテナ起動
      docker_container: image={{ docker_image }} name={{ docker_hostname }} detach=yes tty=yes command=/bin/bash 
    - name: Dockerコンテナをホストとして追加
      add_host: name={{ docker_hostname }}
    
    roles/remi/tasks/epel.yml
    ---
    
    - name: "epel install"
      yum: name=epel-release
    
    roles/sl/tasks/sl.yml
    ---
    
    - name: "sl install"
      yum: name=sl state=latest enablerepo=epel
    
  4. ansible-playbook

    # ansible-playbook playbook/docker/test.yml
    
  5. コンテナ内で確認

    # docker exec -ti test /bin/bash
    [root@b3a5b2f0ebe1 /]# sl
    
                              (@@) (  ) (@)  ( )  @@    ()    @     O     @     O      @
                         (   )
                     (@@@@)
                  (    )
    
                (@@@)
              ====        ________                ___________
          _D _|  |_______/        \__I_I_____===__|_________|
           |(_)---  |   H\________/ |   |        =|___ ___|      _________________
           /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
          |      |  |   H  |__--------------------| [___] |   =|                        |
          | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
          |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
        __/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
         |/-=|___|=O=====O=====O=====O   |_____/~\___/          |_D__D__D_|  |_D__D__D_|
          \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/
    

上記のようにslが走り出したら、成功です!

参考元

Ansible公式:Developing Plugins
Ansible Docker Connection Pluginを使う

11
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?