akiyoko blog

akiyoko の IT技術系ブログです

Vagrant と Ansible を連携させて Ubuntu 14.04 に MySQL, PostgreSQL を provision する手順

AnsibleとVagrantで開発環境を構築する | さくらのナレッジ
という記事を読んで、開発環境の Ubuntu サーバに MySQL や PostgreSQL をインストールするなら、Vagrant と Ansible を連携させた方がやりやすいな、と思ったのでメモがてらまとめておきたいと思います。


ベースとしては、以前使った Ansible Galaxy を使います。
具体的には、

インストールします。


Vagrant 以外の仮想サーバや通常のサーバに対して、MySQL や PostgreSQL を簡単にインストールする手順については、以下の過去記事を参照してください。

<過去記事>
akiyoko.hatenablog.jp

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


 

書籍