いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Gitpod で Ansible の環境を用意して遊んでみる

概要

ひょんなことから Ansible を使うことになりそうなので、勉強用の環境をGitpodで作ってみます。

Gitpodでは docker が使えるので、イメージとしては

  • Ansibleが入っているコンテナを用意 (コントロールノード)
  • 素の debian:latest に openssh サーバを立ててSSH出来るようにしたコンテナ(ターゲットノード)

という2つを作って、遊ぶ構成を作ってみます。

Gitpod側で用意される環境では、ping などが打てないように制御されているので

自分で作ったコンテナ上でやります。

以下のサンプルなどですが、ついでにGithubにアップしておきました。ご参考までに。

github.com

コントロールノード用のコンテナ

ansible使って操作する側のコンテナです。

FROM debian:latest

RUN mkdir -p /playbooks

RUN apt-get update -q \
    && apt-get install -yq iputils-ping net-tools dnsutils procps gnupg2 nano vim sshpass \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367 \
    && echo 'deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main' >> /etc/apt/sources.list \
    && apt-get install -y ansible \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /playbooks

# https://qiita.com/ken992/items/872a90736e6af26ef4ab
# https://eel3.hatenablog.com/entry/2020/09/12/110814
CMD [ "bash", "./startup.sh" ]

最後の CMD のところで実行しているシェルスクリプトはこんな感じ。

mkdir -m 700 $HOME/.ssh
ssh-keyscan demo001 >> $HOME/.ssh/known_hosts

tail -f /dev/null

ターゲットノード用のコンテナ

ansibleから操作される側のコンテナです。

普通はしないですが、ansibleで遊ぶには ssh で接続できないといけないので、opensshサーバを立ててます。

FROM debian:latest

RUN apt-get update -q \
    && apt-get install -yq python3 \
    && apt-get install -yq iputils-ping net-tools dnsutils procps ssh gnupg2 nano vim

RUN apt-get install -y openssh-server

#
# https://qiita.com/y-vectorfield/items/587d3f3a6eec8f251f3c
#
RUN mkdir /var/run/sshd
RUN echo 'root:rootroot' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication/PasswordAuthentication/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Docker Compose 用ファイル

ボリュームやネットワークなどの設定を毎回毎回打つのは面倒なので docker-compose で実行できるようにします。

version: "3"
services:
  ansible:
    container_name: ansible001
    build:
      context: .
      dockerfile: Dockerfile.ansible
    tty: true
    networks:
      - net001
    volumes:
      - ./playbooks:/playbooks
    restart: always
    depends_on:
      - demo
  demo:
    container_name: demo001
    build:
      context: .
      dockerfile: Dockerfile.demo
    tty: true
    networks:
      - net001
    restart: always
networks:
  net001:

起動

ここまで来たら、後は起動して、Ansible側のコンテナに入ればオッケイ。

$ docker-compose up -d
Starting demo001 ... done
Starting ansible001 ... done

$ docker-compose exec ansible bash
root@160f7b398b01:/playbooks#

Ansible実行してみる

インベントリの中は以下のようにしています。

# cat apt/install/inventry.ini 
[demo]
demo001

#
# https://qiita.com/suin/items/ab40779347c910a74d05
#
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=rootroot
ansible_sudo_pass=rootroot

ちゃんと通信が通るかどうかを ping モジュールで確認。

# ansible -i apt/install/inventry.ini demo001 -m ping
demo001 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

オッケイ。

なので、試しに以下のプレイブックを流してみます。

# https://qiita.com/maki_azuki/items/b0679959a61e00966c75
# https://cloudpack.media/32424
# https://stackoverflow.com/questions/32429259/ansible-fails-with-bin-sh-1-usr-bin-python-not-found
- hosts: demo
  gather_facts: yes
#
# もし、相手先にPythonが入っていない場合は以下のようにする
#
#  gather_facts: no
#  pre_tasks:
#    - name: 'install python3'
#      raw: apt install -y python3
  tasks:
    - name: apt update
      apt:
        update_cache: yes
    - name: apt install sl
      apt:
        name:
          - sl
# ansible-playbook -i apt/install/inventry.ini apt/install/playbook.yml 

PLAY [demo] ************************************************************

TASK [Gathering Facts] **************************************************
ok: [demo001]

TASK [apt update] *******************************************************
[WARNING]: Updating cache and auto-installing missing dependency: python3-apt
ok: [demo001]

TASK [apt install sl] ******************************************************
changed: [demo001]

PLAY RECAP *************************************************************
demo001                    : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

オッケイ。ちゃんと流れました。

ターゲットノード上には sl コマンドが入っていないので、初回はちゃんとインストールされていますね。

で、Ansibleのような構成管理ツールの売りは「冪等性」ですので、再度同じプレイブックを流してみます。

# ansible-playbook -i apt/install/inventry.ini apt/install/playbook.yml 

PLAY [demo] ************************************************************
TASK [Gathering Facts] **************************************************
ok: [demo001]

TASK [apt update] *******************************************************
ok: [demo001]

TASK [apt install sl] ******************************************************
ok: [demo001]

PLAY RECAP *************************************************************
demo001                    : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ちゃんと、既にインストールされているので何もせずに終わりました。

f:id:gsf_zero1:20211025152815p:plain

参考情報

docs.ansible.com

qiita.com

eel3.hatenablog.com

qiita.com

qiita.com

qiita.com

cloudpack.media

stackoverflow.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com