windows7内にansibleを使ってWebサーバ、DBサーバを構築する ~provision用shell編~

windows7内にansibleを使ってWebサーバ、DBサーバを構築する ~Vagrantfile編~の続きです。

  1. vagrant_dataに各種設定ファイルを設置しておきます。

    ansible.cfg
    hosts
    httpd.conf
    MariaDB.repo
    my.cnf
    php.ini
    lamp.yml
    php.yml
    mariadb.yml
    repo.yml
    

    apacheやMariaDB、phpの設定ファイルについてはこちらでは説明しません。
    各種ymlファイルはansibleのplaybookになっているので、次回説明します。
    ansible.cfg

    [defaults]
    host_key_checking = False
    inventory = /etc/ansible/hosts
    

    ここではsshに初めてアクセスする際の確認をスキップする設定とインベントリファイルの指定を行っています。
    hosts

    [web-servers]
    192.168.33.12 ansible_ssh_private_key_file=/etc/ansible/private_key_web ansible_ssh_user=vagrant
    [db-servers]
    192.168.33.13 ansible_ssh_private_key_file=/etc/ansible/private_key_db ansible_ssh_user=vagrant
    

  2. ctrl_setup.shにシェルで実行するコマンドをまとめて記述しておきます。

    #!/bin/bash
    #epelリポジトリのimport
    sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
    #epel,sshpass,pythonのインストール
    sudo yum install -y epel-release sshpass python-devel
    #pipのインストール
    sudo easy_install pip
    #ansible,paramiko,PyYAML,Jinja2,httplib2のインストール
    sudo pip install ansible paramiko PyYAML Jinja2 httplib2
    #ansible設定ファイル設置ディレクトリの作成
    if [ ! -e '/etc/ansible/' ]; then
        sudo mkdir /etc/ansible/
    fi
    #webのssh用private_keyを権限が変更出来るディレクトリにコピー
    sudo cp -f /vagrant/.vagrant/machines/web/virtualbox/private_key /etc/ansible/private_key_web
    #dbのssh用private_keyを権限が変更出来るディレクトリにコピー
    sudo cp -f /vagrant/.vagrant/machines/db/virtualbox/private_key /etc/ansible/private_key_db
    #webのssh用private_key権限を700に変更
    sudo chmod 700 /etc/ansible/private_key_web
    #dbのssh用private_key権限を700に変更
    sudo chmod 700 /etc/ansible/private_key_db
    #ansbileのインベントリファイルをコピー
    sudo cp -f /vagrant_data/hosts /etc/ansible/
    #ansbileインベントリファイルの実行権限を削除
    sudo chmod -x /etc/ansible/hosts
    #ansible設定ファイルをコピー
    sudo cp -f /vagrant_data/ansible.cfg /etc/ansible/
    #ansibleのplaybookの実行
    sudo ansible-playbook /vagrant_data/lamp.yml
    

windows7内にansibleを使ってWebサーバ、DBサーバを構築する ~Vagrantfile編~

  1. 現在のところansibleはwindowsには対応していません。
    なので、今回はvagrantでマルチマシン設定を行います。
    構築するのは下記の構成。
    ansible
    ctrl : ansibleをインストールしここからwebサーバ、DBサーバの構築を指示します。
    web : webサーバです。apache、php、mariaDB(クライアント用途)をインストールします。web→dbサーバに接続する設定をします。
    db : dbサーバです。mariaDB(サーバ)をインストールして外部から接続するように設定します。
    ※git bashをインストールしておくとlinuxのコマンドがある程度打てるようになるのでお勧めです。

  2. vagrant init行います。
    今回のテスト用にホームディレクトリにansibleというディレクトリを作成し、その中でvagrant init行います。
    ※vagrant、git bashのインストールは完了しているのが前提です。

    mkdir /c/ansible
    cd /c/ansible
    vagrant init centos71
    vi Vagrantfile
    

    上記の例ではc:\の直下に作業ディレクトリansibleを作成しました。

  3. Vagrantfileの記述
    ctrlにansibleをインストール行い、webサーバ、dbサーバの構成を管理するようにします。

    Vagrant.configure(2) do |config|
    

    に追記していく。
    下記の設定を行うとwindows7のディレクトリとVM内のディレクトリでファイルの共有が可能になります。
    前者がwindows、後者がlinux側のディレクトリ。

    config.vm.synced_folder "./data", "/vagrant_data"
    

まずはctrl
下記のように記載する。

//ctrl
config.vm.define :ctrl do |ctrl|
    //ボックス名
    ctrl.vm.box = "centos71"
    //sshのforward設定
    ctrl.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    //IP設定
    ctrl.vm.network :private_network, ip: "192.168.33.11"
    //provision実行するshell指定
    ctrl.vm.provision "shell", privileged: false, path: "ctrl_setup.sh"
end

実行するshellファイルctrl_setup.shは主にansibleのインストールやsshの設定、ansibleのplaybookの実行を行うように記述しています。
内容は後述します。
次にweb。

//web
config.vm.define :web do |web|
    //ボックス名
    web.vm.box = "centos71"
    //sshのforward設定
    web.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    //httpのforward設定
    web.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
    //IP設定
    web.vm.network :private_network, ip: "192.168.33.12"
end

最後にdb。

//db
config.vm.define :db do |db|
    //ボックス名
    db.vm.box = "centos71"
    //sshのforward設定
    db.vm.network :forwarded_port, guest: 22, host: 2003, id: "ssh"
    //IP設定
    db.vm.network :private_network, ip: "192.168.33.13"
end

すべてまとめて書くと下記のようになる。
ctrlが最下部なのはwebとdbに対してansibleのplaybookを実行するため。

Vagrant.configure(2) do |config|
    config.vm.box = "base"
    config.vm.synced_folder "./data", "/vagrant_data"
    config.vm.define :web do |web|
        web.vm.box = "centos71"
        web.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
        web.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
        web.vm.network :private_network, ip: "192.168.33.12"
    end
    config.vm.define :db do |db|
        db.vm.box = "centos71"
        db.vm.network :forwarded_port, guest: 22, host: 2003, id: "ssh"
        db.vm.network :private_network, ip: "192.168.33.13"
    end
    config.vm.define :ctrl do |ctrl|
        ctrl.vm.box = "centos71"
        ctrl.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
        ctrl.vm.network :private_network, ip: "192.168.33.11"
        ctrl.vm.provision "shell", privileged: false, path: "ctrl_setup.sh"
    end
end

LAMP環境構築itamaeレシピを作ってみる

実際に実行するレシピ setup.rb

まずはtimezoneを設定します

# timezoneの設定
execute 'set timezone' do
  command 'timedatectl set-timezone Asia/Tokyo'
end

次にfirewallの停止と無効化
開発環境なのでばっさりきります

# firewalld停止,無効化
service 'firewalld' do
  action [:disable, :stop]
end

インストールするミドルウェア別にレシピを作成しそれを読み込む
それぞれの内容は後述する
それぞれのレシピはこのレシピと同階層のcookbooks配下に
それぞれのミドルウェアのディレクトリを作成してそこに配置することとする。

include_recipe "./cookbooks/apache/default.rb"
include_recipe "./cookbooks/php/default.rb"
include_recipe "./cookbooks/mariadb/default.rb"
include_recipe "./cookbooks/phpmyadmin/default.rb"

最後に設定の反映を兼ねてApacheを起動、有効化する

# Apache起動、有効化
service 'httpd' do
  action [:start, :enable]
end

Apache設定レシピ ./cookbooks/apache/default.rb

# Apacheインストール
package 'httpd' do
  version '2.4.6'
end

# httpd.confのバックアップ
execute 'httpd.conf backup' do
    command 'mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org'
end

# httpd.confの転送
remote_file "/etc/httpd/conf/httpd.conf" do
  owner "root"
  group "root"
  source "/vagrant_data/httpd.conf"
end

PHP設定レシピ ./cookbooks/php/default.rb

# PHPのremiリポジトリ設定
execute 'php remi repo set' do
    command <<-EOF
rpm --import https://raw.githubusercontent.com/remicollet/remirepo/master/remi-release/RPM-GPG-KEY-remi
yum -y install yum-utils http://remi.kazukioishi.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php56
EOF
end

# PHPのインストール
package 'php' do
    version '5.6.14'
end

# PHPのプラグインをインストール
package 'php-mysqlnd php-gd php-intl php-mbstring'

# php.iniのバックアップ
execute 'php.ini backup' do
    command 'mv /etc/php.ini /etc/php.ini.org'
end

# php.iniの転送
remote_file "/etc/php.ini" do
  owner "root"
  group "root"
  source "/vagrant_data/php.ini"
end

# phpinfoの転送
remote_file "/var/www/html/info.php" do
  owner "apache"
  group "apache"
  source "/vagrant_data/info.php"
end

MariaDB設定レシピ ./cookbooks/mariadb/default.rb

# MariaDBインストール
package 'mariadb-server'

# MariaDB所有者設定
execute 'mariadb permition' do
    command <<-EOL
chown -R mysql:mysql /var/log/mariadb
chown -R mysql:mysql /var/lib/mysql
EOL
end

# my.cnfのバックアップ
execute 'my.cnf backup' do
    command 'mv /etc/my.cnf /etc/my.cnf.org'
end

# my.cnfの転送
remote_file "/etc/my.cnf" do
  owner "root"
  group "root"
  source "/vagrant_data/my.cnf"
end

# MariaDB起動、有効化
service 'mariadb' do
  action [:start, :enable]
end

# MariaDB初期設定
execute "mysql_secure_installation" do
  user "root"
  only_if "mysql -u root -e 'show databases' | grep information_schema" # パスワードが空の場合
  command <<-EOL
mysqladmin -u root password "password"
mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='';"
mysql -u root -ppassword -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');"
mysql -u root -ppassword -e "DROP DATABASE test;"
mysql -u root -ppassword -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
mysql -u root -ppassword -e "FLUSH PRIVILEGES;"
EOL
end

phpMyAdmin設定レシピ ./cookbooks/phpmyadmin/default.rb

# phpMyAdminインストール
package 'phpMyAdmin'

# phpMyAdmin権限設定
execute 'phpMyAdmin owner permition' do
  command <<-EOL
chown -R apache:apache /usr/share/phpMyAdmin/
chmod -R 700 /usr/share/phpMyAdmin/
EOL
end

# phpMyAdmin.confのバックアップ
execute 'phpMyAdmin.conf backup' do
    command 'mv /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.org'
end

# my.cnfの転送
remote_file "/etc/httpd/conf.d/phpMyAdmin.conf" do
  owner "root"
  group "root"
  source "/vagrant_data/phpMyAdmin.conf"
end

※各設定ファイルはそれぞれ/vagrant_data配下に設定しておく必要がある

あとは実行するだけ

su -
itamae local setup.rb

Vagrant + Itamaeでサーバの構成管理をする

itamae

今回はまずVagrant内の環境でお試します。

  1. Vagrantのインストール
    https://www.vagrantup.com/
    DOWNLOADボタンをクリック
    該当のOSのリンクをクリック
    インストーラーにしたがってインストールする
    ※少し時間がかかります。

  2. BOXの追加
    http://www.vagrantbox.es/
    でお好みのOSを探し、URLをコピーする。

    $ vagrant add centos71 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
        

  3. vagrant up
    ディレクトリを作成し、vagrantの初期化を行います。
    その後、vagrant upで起動させます。

    $ mkdir vagrant_test
    $ cd vagrant_test
    $ vagrant init cenetos71
    $ vagrant up
        

    少し時間がかかるので、まったりと待つ。

  4. vagrant ssh
    起動されたらsshでアクセスしてみましょう。

    $ vagrant ssh
        

  5. rubyをインストールする
    itamaeを動かすにはrubyが必要なのでインストールする

    $ su -
    # yum install ruby
        

    確認

    # ruby -v
    ruby 2.0.0p598 (2014-11-13) [x86_64-linux]
        

  6. itamaeをインストールする
    gemでインストールする

    # gem install itamae
        

    確認

    # itamae version
    Itamae v1.6.0
        

    ※ rubyとitamaeのインストールはVagrantfileに書いておくと楽

    config.vm.provision ”shell”, inline: <<-SHELL
      sudo yum install -y ruby
      sudo gem install itamae
    SHELL
        

  7. recipeを作成する

    # mkdir /recipes
    # vi httpd.rb
        

    apacheをインストールして起動するレシピ

        # Apacheインストール
        package 'httpd' do
          action :install
        end
    
        # Apache起動、有効化
        service 'httpd' do
          action [:enable, :start]
        end
        

  8. recipeを実行する

    # cd recipes
    # itamae local httpd.rb
        

  9. Apacheの起動を確認する

    # systemctl status httpd
    
        

    activeとなっておりapacheの起動が確認出来た。

VagrantにLAMP(Linux+Apache+MySQL+PHP)環境を構築する Part.2

Part.2ではchefのrecipeを使ってみる

この記事は下記の続きです
VagrantにLAMP(Linux+Apache+MySQL+PHP)環境を構築する Part.1

1.作業のディレクトリの作成

作業用のディレクトリを作成します。

$ mkdir vagrant-lamp

2.Vagrantfileの生成

次に先程作成したディレクトリに移動して、Vagrantの初期設定コマンドを実行します。

$ cd vagrant-lamp
$ vagrant init chef/centos-6.5

これでvagrant-lampディレクトリ配下にVagrantfileが生成されました。
このVagrantfileを修正してプロビジョニングを行います。

3.SELinuxでrecipeを試す

まずSELinuxが有効になっているのを確認します。
一旦Vagrantfile修正前の状態でインスタンスを起動してみます。

  
$ vagrant up
$ vagrant ssh
$ getenforce
  

Berksfileを修正します。

まずはdevelopmentディレクトリに戻ります

$ cd ../

生成されたBerksfileには

site :opscode

と記述があると思いますが、vimなどで下記のように修正します。

source “https://api.berkshelf.com”

次に公開されているcookbookを記述して行きます。
https://supermarket.chef.io/cookbooks
ここから自分の環境に合わせたcookbookを探しBerksfileに追記します。

source "https://api.berkshelf.com"
cookbook 'selinux'

上記のようにBerksfileを編集したら

下記を実行しSELinuxのcookbookをダウンロードします。

$ berks vendor ./cookbooks

このときcookbooksディレクトリが存在している場合エラーになるので消します。
cookbooksディレクトリが存在している場合のみ下記を実行しディレクトリを一旦削除します。

$ rm -r ./cookbooks

Vagrantfileを修正します。

$ cd vagrant-lamp
$ vim Vagrantfile

まずはchefのプロビジョニングの設定
cookbooks、site-cookbooksディレクトリへのパスを指定
使用するレシピを指定

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = “chef/centos-6.5”
config.omnibus.chef_version = :latest
config.vm.provision “chef-solo” do |chef|
chef.cookbboks_path = [“../cookbooks”, “../site-cookbooks”]
chef.add_recipe “selinux::disabled”
end
end

上記の設定を再読み込みさせます。


$ vagrant reload --provision

SELinuxが無効になっていれば完了です。

$ vagrant ssh
$ getenforce
これでSELinuxをdisableにするrecipeを使いこなせるようになりました(多分)

VagrantにLAMP(Linux+Apache+MySQL+PHP)環境を構築する Part.1

Part.1ではVagrantのインストールと最小構成で起動させることが目標

1.VirtualBoxのインストール

VirtualBoxの公式サイトからパッケージをダウンロードしてインストーラーの手順通りにインストールします。

http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#vbox

2.Vagrant本体のインストール

Vagrantの公式サイトからパッケージをダウンロードしてインストーラーの手順通りにインストールします。
https://www.vagrantup.com/downloads.html

3.vagrant-omnibus pluginのインストール

vagrant-omnibus
このプラグインはプロビジョニング時にchef-clientがインストールされているかを検出し、
指定したバージョンのchef-clientをインストールしてくれます。
・インストール方法

$ vagrant plugin install vagrant-omnibus

4.sahara pluginのインストール

sahara
仮想マシン(VirtualBox)の状態をロールバック出来るようにする。

・インストール方法

$ vagrant plugin install sahara

5.vagrant-vbguest pluginのインストール

  vagrant-vbguest
VirtualBoxのゲストOS用ソフトを更新する

・インストール方法

$ vagrant plugin install vagrant-vbguest

6.インストールされたpluginの確認

下記のコマンドでインストール済みのプラグインの確認が出来ます。

$ vagrant plugin list

7.chef DKのインストール

下記URLにアクセスし
https://downloads.getchef.com/chef-dk/
  今回Mac OS XにインストールするのでMac OS Xをクリック後

Downloadボタンを押下しダウンロードが完了後
インストーラーの指示通りにインストールします。

8.knife-soloのインストール

chef DKにはknif-soloが含まれていないのでインストールする

$ chef gem install knife-solo

Chef DKの環境内にknife-soloがインストールされます。

9.chef関連ファイルの生成

まずはchef関連ファイルを設置するディレクトリを作成します。

$ mkdir development

/user/ユーザー名/developmentというディレクトリが生成されます。
生成されたディレクトリにcdコマンドで移動しknifo soloを実行しchef関連ファイルを生成します。

$ cd development
$ knife solo init .

Berksfile, cookbooks, data_bags, environments,

nodes, roles, site-cookbooksが生成されます。

10.Vagrant Boxの取得

Vagrantで使用するBoxファイルをダウンロードします。
まず下記のサイトから希望のBoxファイルを探します。
https://vagrantcloud.com/discover/featured

今回はchef/centos-6.5を使用します。

$ vagrant box add chef/centos-6.5

下記のコマンドでインストールされたBoxファイルの確認が出来ます。

$ vagrant box list

作業用のディレクトリを作成します。

$ mkdir vagrant-lamp

次に先程作成したディレクトリに移動して、Vagrantの初期設定コマンドを実行します。

$ cd vagrant-lamp
$ vagrant init chef/centos-6.5

これでvagrant-lampディレクトリ配下にVagrantfileが生成されました。
このVagrantfileを修正してプロビジョニングを行います。

一旦Vagrantfile修正前の状態でインスタンスを起動してみます。

$ vagrant up

Vagrantの起動状態を確認します。

$ vagrant status

runningと表示されていれば問題なく起動しています。