たくみん成長日記

開発したアプリやプログラミングの備忘録を不定期に上げていきます。

Ansibleで環境構築をしてみた(Ubuntu 18.04)

こんちか!!たくみんです。今回はAnsibleを使って、Vagrantを用いて作成した仮想環境(Ubuntu 18.04)の簡単な環境構築を行ってみたので記事にしたいと思います! 本来は、冪等性を確保するためにインストールはaptではなくソースビルドを行ったりするみたいなんですけど、 今回は初めてという事で普通にaptでインストールを行っていきます。

f:id:takuminv:20190928003956p:plain:w500

目次

Version

今回使用するVersionは次の通りです。

自動化するタスク

Ansibleを使って、自動化するタスクは以下のものになります。

  • zsh、gitをインストール
  • シェルをzshに変更
  • 自分のGitHubからdotfilesをgit cloneする。
  • zshemacsの設定ファイルを反映させる。
  • rbenvのインストール

Vagrantfile

Vagrantfileは以下のような感じです。

Vagrant.configure(2) do |config|
  config.vm.define "target" do |node|
    node.vm.box = "bento/ubuntu-18.04"
    node.vm.hostname = "target"
    node.vm.network :private_network, ip: "192.168.100.20"
    node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
  end
end

Playbook

Playbookのディレクトリ構成

Playbookのディレクトリ構成はこんな感じです。

├── hosts // Playbookを適応させる対象を決めるやつ
├── roles
│   ├── apt // apt installをやるやつ
│   │   └── tasks
│   │       └── main.yml
│   ├── dotfile // dotfileをgit cloneして設定するやつ
│   │   └── tasks
│   │       └── main.yml
│   ├── ruby // rbenvインストールするやつ
│   │   └── tasks
│   │       └── main.yml
│   └── zsh // zshを設定するやつ
│       └── tasks
│           └── main.yml
└── site.yml // Playbookの本体

hosts

hostsファイルは以下のような感じです。Vagrantで作成した仮想環境を対象にします。

[target]
192.168.100.20

site.yml

site.ymlは以下のような感じです。それぞれ別ファイルに分けたタスクを 順次実行しています。

- hosts: all # hostsファイルにある全てが対象
  user: vagrant # userはvagrant
  become: yes  # sudoを使う
  roles:
    - apt
    - dotfile
    - zsh
    - ruby

aptのmain.yml

aptディレクトリのmain.ymlは以下のような感じです。結構インストールしていますが、だいたいrbenvとruby-buildに必要なやつです。

 - name: apt install
   apt:
     name:
       - zsh
       - git
       - gcc
       - emacs
       - autoconf
       - bison
       - build-essential
       - libssl-dev
       - libyaml-dev
       - libreadline6-dev
       - zlib1g-dev
       - libncurses5-dev
       - libffi-dev
       - libgdbm5
       - libgdbm-dev
       - cmake
     update_cache: yes # インストールする前に apt-get updateを実行
     force_apt_get: yes  # apt-getを使う

zshディレクトリのmain.yml

タスクとしては、以下のような感じです。

  • 現在のシェルがzshかどうかチェック
  • zshでなければzshに変更

Ansibleのshellモジュールとcommandモジュールは自動で冪等性を確保してくれないため、 現在のシェルがzshかどうかで処理を分ける事で冪等性を確保しています。

これをPlaybookにすると以下のようにになります。

- name: zsh check # 現在のシェルがzshかどうかチェック
  become: no # sudoでやるとvagrantユーザのシェルをみてくれないためoff
  shell: echo $SHELL
  register: current_shell # shellで実行した結果をcurrent_shellに格納
  changed_when: no # 毎回changedになってしまうのでoff

- name: zsh set  # 現在のシェルがzshじゃなければzshに変更
  shell: chsh -s '/usr/bin/zsh' vagrant
  when: "'zsh' not in current_shell.stdout"

dotfileディレクトリのmain.yml

タスクとしては、以下のような感じです。

これをPlaybookにすると以下のようにになります。

- name: git clone dotfile
  become: no # sudoをつけるとvagrantユーザのHOMEディレクトリに置いてくれない
  git:
    repo: https://github.com/takuminish/.dotfiles
    dest: ~/.dotfiles

- name: zsh symlink
  become: no
  file:
    src: ~/.dotfiles/zsh/{{ item }}
    dest: ~/{{ item }}
    state: link # シンボリックリンク
    force: yes # ファイルがあったら置き換える
  with_items:
    - .zsh.d
    - .zshrc

- name: emacs symlink
  become: no
  file:
    src: ~/.dotfiles/emacs/{{ item }}
    dest: ~/{{ item }}
    state: link
    force: yes
  with_items:
    - .emacs.d

rubyディレクトリのmain.yml

タスクとしては、以下のような感じです。本当はrbenvを使ってRubyのインストールまで行っても良かったんですが、そこまでする必要はないのかなと思ったのでタスクからは省きました。

  • rbenvをgit clone
  • ruby-buildをgit clone

これをPlaybookにすると以下のようにになります。

- name: git clone rbenv
  become: no
  git:
    repo: https://github.com/rbenv/rbenv
    dest: ~/.rbenv
- name: git clone ruby-build
  become: no
  git:
    repo: https://github.com/rbenv/ruby-build
    dest: ~/.rbenv/plugins/ruby-build

実際にやってみた

上記のPlaybookを実際に実行してみました。

vagrant up

vagrant upで仮想環境を起動します。

vagrant upの結果

vagrant ssh

vagrant sshで仮想環境にリモートログインしてみます。 なんて貧相なターミナルなんでしょう。 vagrant sshの結果

ssh-copy-id

Ansibleを対象に適応させるには、対象に公開鍵認証でSSHを行えるようにする必要があります。そのため、ホストの公開鍵をAnsibleの対象に渡しておきます。

ssh-cpy-idの結果

ansible-playbook

では、Ansibleを実行します。このWARNINGはなんなんですかね。調べてもよくわからなったので知っている方がいたら教えて欲しいです。 Ansibleの実行結果

実際にSSHでログインして、しっかり環境構築ができているのか確かめてみましょう。 sshで確認した結果

ちゃんとターミナルが私の作成したものに変わっています!

終わりに

Ansibleは学生の頃にちょびっと触っただけだったんですけど、なんとか環境構築ができて良かったです。今はUbuntuの環境構築のみですが今後はCentOSだったりMacの環境構築もできたらと考えています。ではでは。

参考にしたサイト

qiita.com

qiita.com

qiita.com

qiita.com