Ansibleで環境構築をしてみた(Ubuntu 18.04)
こんちか!!たくみんです。今回はAnsibleを使って、Vagrantを用いて作成した仮想環境(Ubuntu 18.04)の簡単な環境構築を行ってみたので記事にしたいと思います! 本来は、冪等性を確保するためにインストールはaptではなくソースビルドを行ったりするみたいなんですけど、 今回は初めてという事で普通にaptでインストールを行っていきます。
目次
Version
今回使用するVersionは次の通りです。
- Python : 2.7.10
- Ansible : 2.8.4
- Vagrant : 2.2.2
- VirtualBox: 6.0.2 r128162 (Qt5.6.3)
自動化するタスク
Ansibleを使って、自動化するタスクは以下のものになります。
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
タスクとしては、以下のような感じです。
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 ssh
vagrant sshで仮想環境にリモートログインしてみます。 なんて貧相なターミナルなんでしょう。
ssh-copy-id
Ansibleを対象に適応させるには、対象に公開鍵認証でSSHを行えるようにする必要があります。そのため、ホストの公開鍵をAnsibleの対象に渡しておきます。
ansible-playbook
では、Ansibleを実行します。このWARNINGはなんなんですかね。調べてもよくわからなったので知っている方がいたら教えて欲しいです。
実際にSSHでログインして、しっかり環境構築ができているのか確かめてみましょう。
ちゃんとターミナルが私の作成したものに変わっています!
終わりに
Ansibleは学生の頃にちょびっと触っただけだったんですけど、なんとか環境構築ができて良かったです。今はUbuntuの環境構築のみですが今後はCentOSだったりMacの環境構築もできたらと考えています。ではでは。