AnsibleとVagrantで開発環境を構築する | さくらのナレッジ
という記事を読んで、開発環境の Ubuntu サーバに MySQL や PostgreSQL をインストールするなら、Vagrant と Ansible を連携させた方がやりやすいな、と思ったのでメモがてらまとめておきたいと思います。
ベースとしては、以前使った Ansible Galaxy を使います。
具体的には、
- MySQL は ANXS.mysql で
- PostgreSQL は ANXS.postgresql で
インストールします。
Vagrant 以外の仮想サーバや通常のサーバに対して、MySQL や PostgreSQL を簡単にインストールする手順については、以下の過去記事を参照してください。
<過去記事>
akiyoko.hatenablog.jp
ホスト
- macOS Sierra 10.12.3
- Vagrant 1.9.1
- VirtualBox 5.1.14
macOS Sierra に Vagrant および VirtualBox をインストールする手順については、以下を参照してください。
<過去記事>
akiyoko.hatenablog.jp
ゲスト
- Ubuntu 14.04
ゲストマシンのプライベート IPアドレスは「192.168.33.10」に設定しておきます。
データベース
- MySQL 5.5.54
- PostgreSQL 9.3.16
インストールと同時に以下の設定もおこなう想定です。
項目 | 設定内容 |
---|---|
データベース名 | myproject |
データベースユーザ | myprojectuser |
データベースユーザパスワード | myprojectuserpass |
ちなみに、MySQL の root のパスワードは「rootpass」となります。
また、PostgreSQL の場合は「postgres」という Linuxユーザが作成されます。
MySQL のインストール
MySQL は ANXS.mysql でインストールします。
$ cd ~/dev/vagrant/ubuntu14 $ mkdir provisioning $ ansible-galaxy install ANXS.mysql -p provisioning/roles
etc_mysql_my.cnf.j2 ファイル内の「character_set_server」および「collation_server」のキーワードを修正します。 *1
$ sed -i '' 's/^character_set_server/character-set-server/g' provisioning/roles/ANXS.mysql/templates/etc_mysql_my.cnf.j2 $ sed -i '' 's/^collation_server/collation-server/g' provisioning/roles/ANXS.mysql/templates/etc_mysql_my.cnf.j2
provisioning/hosts
[db-servers] 192.168.33.10
provisioning/site.yml
- hosts: db-servers become: true user: vagrant vars_files: - vars/mysql.yml roles: - { role: ANXS.mysql }
$ mkdir provisioning/vars
provisioning/vars/mysql.yml
mysql_current_root_password: '' mysql_root_password: rootpass mysql_databases: - name: myproject mysql_users: - name: myprojectuser pass: myprojectuserpass priv: "myproject.*:ALL"
最終的なディレクトリ構成はこのような感じになります。
~/dev/vagrant/ubuntu14/ ├── Vagrantfile └── provisioning ├── hosts ├── roles │ └── ANXS.mysql │ ・ │ ・ ├── site.retry ├── site.yml └── vars └── mysql.yml
Vagrantfile
・ ・ # Create a private network, which allows host-only access to the machine # using a specific IP. config.vm.network "private_network", ip: "192.168.33.10" ・ ・ # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL config.vm.provision "ansible" do |ansible| ansible.playbook = "provisioning/site.yml" ansible.inventory_path = "provisioning/hosts" ansible.limit = "all" end
provision
サーバを初回起動する際に provision が実行されます。
$ vagrant up
起動済みのサーバには、以下のコマンドを実行することで provision が実行されます。
$ vagrant provision or $ ansible-playbook -i provisioning/hosts provisioning/site.yml -k -vv
後者のコマンドの場合には、vagrant ユーザのパスワードが要求されます。
パスワードを入力したくない場合は、
$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config ### 念のためパーミッションを変更 $ sudo chmod 600 ~/.ssh/config
を設定しておけば、
$ ansible-playbook -i provisioning/hosts provisioning/site.yml -vv
で、パスワード無しで実行可能です。
動作確認
$ vagrant ssh or $ ssh vagrant@192.168.33.10
でサーバにログインして、
$ mysql -u root -p
で動作確認します。
書籍
PostgreSQL のインストール
PostgreSQL は ANXS.postgresql でインストールします。
$ mkdir provisioning $ ansible-galaxy install ANXS.postgresql -p provisioning/roles
provisioning/hosts
[db-servers] 192.168.33.110
provisioning/site.yml
- hosts: db-servers become: true user: vagrant vars_files: - vars/postgresql.yml roles: - { role: ANXS.postgresql }
$ mkdir provisioning/vars
provisioning/vars/postgresql.yml
postgresql_databases: - name: myproject postgresql_users: - name: myprojectuser pass: myprojectuserpass postgresql_user_privileges: - name: myprojectuser db: myproject priv: "ALL"
最終的なディレクトリ構成はこのような感じになります。
~/dev/vagrant/ubuntu14/ ├── Vagrantfile └── provisioning ├── hosts ├── roles │ └── ANXS.postgresql │ ・ │ ・ ├── site.retry ├── site.yml └── vars └── postgresql.yml
Vagrantfile
・ ・ # Create a private network, which allows host-only access to the machine # using a specific IP. config.vm.network "private_network", ip: "192.168.33.10" ・ ・ # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL config.vm.provision "ansible" do |ansible| ansible.playbook = "provisioning/site.yml" ansible.inventory_path = "provisioning/hosts" ansible.limit = "all" end
provision
サーバを初回起動する際に provision が実行されます。
$ vagrant up
起動済みのサーバには、以下のコマンドを実行することで provision が実行されます。
$ vagrant provision or $ ansible-playbook -i provisioning/hosts provisioning/site.yml -k -vv
後者のコマンドの場合には、vagrant ユーザのパスワードが要求されます。
パスワードを入力したくない場合は、
$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config ### 念のためパーミッションを変更 $ sudo chmod 600 ~/.ssh/config
を設定しておけば、
$ ansible-playbook -i provisioning/hosts provisioning/site.yml -vv
で、パスワード無しで実行可能です。
動作確認
$ vagrant ssh or $ ssh vagrant@192.168.33.10
でサーバにログインして、
$ psql -U postgres or $ sudo su postgres $ psql
で動作確認します。
おまけ
### ユーザ一覧 postgres=# \du ### データベース一覧 postgres=# \l ### データベース接続 postgres=# \c myproject ### テーブル一覧 myproject=# \d myproject=# \dt ### 終了 myproject=# \q