概要
ひょんなことから Ansible を使うことになりそうなので、勉強用の環境をGitpodで作ってみます。
Gitpodでは docker が使えるので、イメージとしては
- Ansibleが入っているコンテナを用意 (コントロールノード)
- 素の debian:latest に openssh サーバを立ててSSH出来るようにしたコンテナ(ターゲットノード)
という2つを作って、遊ぶ構成を作ってみます。
Gitpod側で用意される環境では、ping などが打てないように制御されているので
自分で作ったコンテナ上でやります。
以下のサンプルなどですが、ついでにGithubにアップしておきました。ご参考までに。
コントロールノード用のコンテナ
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
ちゃんと、既にインストールされているので何もせずに終わりました。
参考情報
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場