Ansibleでdocker使用可能ユーザーを一挙に作成する


概要

dockerをインストールした直後は、root以外のユーザーはdockerコマンドを管理者権限sudo付きでないと使用できない。
これを構成管理ツールAnsibleによって、root以外のユーザーでもsudoなしでdockerコマンドを実行できるよう自動設定する。

背景

docker上で色々動かすプロトタイプなマシンサーバーをAnsibleで構成管理したい。
ところが、単にdockerを入れただけでは、dockerコマンドを実行時に面倒な事が起こる。
具体的には、sudo付きでdockerコマンドを実行したり、rootユーザーになったりしなければならない。

そこで、Ansibleでこれも自動設定もしてしまいたいと考えた。

具体と解説

動作検証環境

  • python version:2.7.15
  • ansible-playbook:2.6.3
  • ホストOS:CentOS 7.5.1804

ディレクトリ構造

再利用できるよう、タスクはユーザー設定とdocker関係設定に分割してロール内に記述しました。

ansible/
 ├ hosts/
 ├ roles/
 │ ├ docker/
 │ │ ├ files/
 │ │ │ └ docker.repo
 │ │ └ tasks/
 │ │   └ main.yml
 │ └ user/
 │   └ tasks/
 │     └ main.yml
 └ site.yml

各ファイルの中身

dockerはyumでインストールすることとします。
また、ホストOSはCentOSを想定しています。
(掲題の件の部分に関しては、他の大半のLinux OSでも同様のソースで動作するかと思います。)

roles/docker/tasks/main.yml
- name: Yum update packages
  yum:
    name: "*"
    state: latest
- name: Set docker repo
  copy:
    src: "{{ role_path }}/files/docker.repo"
    dest: /etc/yum.repos.d/docker.repo
    owner: root
    group: root
    mode: 0755
- name: Install docker
  yum:
    name: docker-engine
    state: present
- name: docker setting mkdir
  file: 
    path: /etc/systemd/system/docker.service.d
    state: directory
    owner: root
    group: root
    mode: 0755
- name: Add to docker group
  user:
    name: "{{ item }}"
    groups: docker
    append: yes
  with_items: "{{ docker_users }}"
- name: Start docker
  systemd:
    name: docker
    state: started
    enabled: yes
roles/docker/files/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

roles/docker/tasks/main.yml 内の Add to docker group というタスクで、実行したいユーザー群docker_usersdockerグループへ入れます。
これによって、docker_usersに登録されているユーザーは、sudoなしでdockerコマンドを実行できるようになります。

docker_users は、Ansibleの実行ファイルsite.yml等で変数として設定します。

site.yml
- hosts: all
  user: user1
  become: true
  vars:
    docker_users:
      - user1
      - user2
  roles:
    - role: user
    - role: docker

docker実行したいユーザー群のユーザーアカウントが存在しておく必要があるため、タスクdockerの実行前にタスクuserにてユーザー作成を行います。

roles/user/tasks/main.yml
- name: Add users
  user:
    name: "{{ item }}"
  with_items: "{{ docker_users }}"

ファイルhostsには、ホストサーバー(デプロイ先の)アドレスを記述します。

127.0.0.1
127.0.0.2
127.0.0.3

実行

$ ansible-playbook -i hosts site.yml

実行は、ホスト側でsudoが利用可能な環境で。

上記は、ゲストにおいて秘密鍵をssh-agentで登録している場合で、
そうでない場合は、--private-keyなど適切なオプションをつけて実行ください。