ロックとチュウーハイとこりんがるな日々

日々のインプットした事をアウトプットする場所

chef でゼロからサーバ構築をやってみる

サーバ構築は開発マシンであるmacから「knife-solo」でサーバ構築を行います

※knife-soloの設定は以下の記事をに書いています

knife-soloを設定して開発マシン(mac)からchef-soloを実行する

設定を行うサーバは「sakura vps 1G」です、osはデフォルトの「centos6.3 x86_64」です

サーバは単純なLAMP環境です

以下構築のログになります、なお今回はできるだけopscode communityに公開されているcookbookを使っていこうかと思います

opscode community

またサーバにログインするのは確認のみで設定をするのはすべてchefで行う予定です

構築ログ

  1. chef を実行するユーザを作成

    この作業のみサーバで実行する

     $ ssh [ipaddress] -l root
     # useradd chef
     # passwd chef
     ユーザー chef のパスワードを変更。
     新しいパスワード:
     新しいパスワードを再入力してください:
     passwd: 全ての認証トークンが正しく更新できました。
    

    sudo の設定を行う

     # visudo
     chef    ALL=(ALL)       ALL
    

    上記を追加する

  2. 対象サーバにchefを設定する

    knife solo prepare で楽する

     $ knife solo prepare chef@[IP address]
    

    途中passwordを聞かれるので入力を行う

  3. cookbook を作る

     $ knife solo init [chef-repo]
    

    ※cookbookはローカルPCに作成するので管理しやすい場所に作って下さい

  4. yum の設定

    opscodeに公開されているcookbookを使う

    cookbooksの中にcloneする

     $ cd [chef-repo]/cookbooks
     $ git clone https://github.com/opscode-cookbooks/yum.git
    

    上記の作業で「cookbooks」の中にyumディレクトリが作成されています

    runlistにrecipeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
       "run_list":[
         "recipe[yum::epel]",
         "recipe[yum::remi]"
       ]
     }
    
  5. userの作成/設定

    いきなりですが、ユーザ追加のレシピは自分で用意します

    group / userの追加を行う

     $ cd [chef-repo]
     $ knife cookbook create users -o site-cookbooks
     $ vim site-cookbooks/users/recipes/default.rb
     # create group dm_user
     group 'dm_user' do
       group_name 'dm_user'
       gid 999
       action :create
     end
     # create user dm_user
     user 'dm_user' do
       comment 'dm_user'
       group 'dm_user'
       home '/home/dm_user'
       shell '/bin/bash'
       password 'hogefuga'
       supports :manage_home => true
       action :create
     end
    

    password の項目に指定する文字列は、設定したい値のhash値になります、以下のコマンドでhash値を求めます

     $ sudo openssl passwd -1 "[password]"
     $1$8R8ZFsYI$2IcbmAyCsBfe4NbdwM/gW.
    

    group にユーザを追加

     $ cd [chef-repo]
     $ vim site-cookbooks/users/recipes/default.rb
     # group add user
     group 'dm_user' do
       action :modify
       members ['dm_user']
       append true
     end        
    

    runlistにrecipeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
       "run_list":[
         "recipe[yum::epel]",
         "recipe[yum::remi]",
         "recipe[users]"
       ]
     }
    
  6. sudo の設定

    opscodeに公開されているcookbookを使う

    cookbooksの中にcloneする

     $ cd [chef-repo]/cookbooks
     $ git clone https://github.com/opscode-cookbooks/sudo.git
    

    上記の作業で「cookbooks」の中にsudoディレクトリが作成されています

    sudoの設定を行う、cloneしたcookbookの中にあるattributes/default.rbを編集

     $ cd cookbooks/sudo/attributes
     $ vim default.rb
     default['authorization']['sudo']['groups']            = ['dm_user', 'chef']  ← 対象のグループを設定
     default['authorization']['sudo']['users']             = ['dm_user', 'chef']  ← 対象のユーザを設定
     default['authorization']['sudo']['passwordless']      = false
     default['authorization']['sudo']['include_sudoers_d'] = false
     default['authorization']['sudo']['agent_forwarding']  = false
     default['authorization']['sudo']['sudoers_defaults']  = ['!lecture,tty_tickets,!fqdn']        
    

    runlistにrecipeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
       "run_list":[
         "recipe[yum::epel]",
         "recipe[yum::remi]",
         "recipe[users]",
         "recipe[sudo]"
       ]
     }
    
  7. rootログインの禁止

    ここも自前で用意するのでとりあえずcookbookを作成

     $ cd [chef-repo]/
     $ knife cookbook create setting -o site-cookbooks
    

    sshd_configのtemplateを用意して、templates/default/ に設定する

    templates/default/ にファイルを置いたら sshd_config のファイル名を sshd_config.erbに変更する

     $ cd [chef-repo]/site-cookbooks/setting/templates/default/
     $ mv sshd_config sshd_config.erb
    

    ファイル名の変更が完了したら、sshd_config.erbの中を編集する

     $ vim sshd_config.erb
    
     #PermitRootLogin yes
    
     以下のように編集
    
     PermitRootLogin no
    

    recipeを作成

     $ cd [chef-repo]/site-cookbooks/setting/recipes
     $ vim default.rb
     service "sshd" do
         supports :status => true, :restart => true, :reload => true
         action [ :enable, :start ]
     end
     template "/etc/ssh/sshd_config" do
       source "sshd_config.erb"
       owner "root"
       group "root"
       notifies :reload, "service[sshd]"
     end        
    

    runlistにrecipeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
       "run_list":[
         "recipe[yum::epel]",
         "recipe[yum::remi]",
         "recipe[users]",
         "recipe[sudo]",
         "recipe[setting]"
       ]
     }
    
  8. mysql の設定

    opscodeに公開されているcookbookを使う

    cookbooksの中にcloneする

     $ cd [chef-repo]/cookbooks
     $ git clone https://github.com/opscode-cookbooks/mysql.git
    

    上記の作業で「cookbooks」の中にmysqlディレクトリが作成されています

    mysql の cookbookの中でincludeしているcookbookがあるのでcookbooksにcloneする

     $ cd [chef-repo]/cookbooks
     $ git clone https://github.com/opscode-cookbooks/build-essential.git
     $ git clone https://github.com/opscode-cookbooks/openssl.git
    

    runlistにrecipeとattributeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
         "mysql": {
           "server_root_password": "hogefuga",
           "server_repl_password": "hogefuga",
           "server_debian_password": "hogefuga"
         },
         "run_list":[
           "recipe[yum::epel]",
           "recipe[yum::remi]",
           "recipe[users]",
           "recipe[sudo]",
           "recipe[setting]",
           "recipe[mysql::server]"
         ]
     }
    

    追加しているattributeはmysqlのrootのパスワードを設定しています

  9. php を設定

    以前に作ったcookbookを使う

    recipeをsite-cookbooksにコピーする

    以下 recipe 単純にpackage でphpをinstallしているだけです、php.iniをtemplateで置き換え

     %w{php php-pear php-cli php-common php-devel php-gd php-mbstring php-mysql php-pdo php-xml php-pecl-apc}.each do |suffix|
       package suffix do
         action :install
       end
     end
     template "/etc/php.ini" do
       source "php.ini.erb"
       owner "root"
       group "root"
       mode 0644
     end
     # httpd の再起動処理を追加
     service "httpd" do
       action [ :enable, :restart ]
     end
    

    runlistにrecipeとattributeを追加

     $ cd [chef-repo]
     $ vim node/node.json
     {
       "php": {
         "extension_dir": "/usr/lib64/php/modules",
         "upload_max_filesize": "16M",
         "post_max_size": "16M",
         "enable_dl": "On",
         "timezone": "date.timezone = Asia/Tokyo"
       },
       "mysql": {
         "server_root_password": "hogefuga",
         "server_repl_password": "hogefuga",
         "server_debian_password": "hogefuga"
       },
       "run_list":[
         "recipe[yum::epel]",
         "recipe[yum::remi]",
         "recipe[yum::epel]",
         "recipe[yum::remi]",
         "recipe[users]",
         "recipe[sudo]",
         "recipe[setting]",
         "recipe[php]",
         "recipe[selinux::disabled]"  
       ]
     }
    
  10. httpd を設定

    以前に作ったcookbookを使う

    recipeをsite-cookbooksにコピーする

    以下 recipe 単純にpackage でhttpdをinstallしているだけです

    変更する可能性が高いのでhttpd.confをtemplate化しておく

    package "httpd" do
      action :install
    end
    service "httpd" do
      action [ :enable, :start]
    end
    template "/etc/httpd/conf/httpd.conf" do
    

      source "httpd.conf.erb"   owner "root"   group "root"   mode 0644     end

    runlistにrecipeとattributeを追加

    $ cd [chef-repo]
    $ vim node/node.json
    {
      "php": {
        "extension_dir": "/usr/lib64/php/modules",
        "upload_max_filesize": "16M",
        "post_max_size": "16M",
        "enable_dl": "On",
        "timezone": "date.timezone = Asia/Tokyo"
      },
      "mysql": {
        "server_root_password": "hogefuga",
        "server_repl_password": "hogefuga",
        "server_debian_password": "hogefuga"
      },
      "run_list":[
        "recipe[yum::epel]",
        "recipe[yum::remi]",
        "recipe[yum::epel]",
        "recipe[yum::remi]",
        "recipe[users]",
        "recipe[sudo]",
        "recipe[setting]",
        "recipe[php]",
        "recipe[httpd]",
        "recipe[selinux::disabled]"  
      ]
    }
    
  11. selinux を設定

    opscodeに公開されているcookbookを使う

    cookbooksの中にcloneする

    $ cd [chef-repo]/cookbooks
    $ git clone https://github.com/opscode-cookbooks/selinux.git
    

    上記の作業で「cookbooks」の中にselinuxディレクトリが作成されています

    runlistにrecipeとattributeを追加

    $ cd [chef-repo]
    $ vim node/node.json
    {
      "php": {
        "extension_dir": "/usr/lib64/php/modules",
        "upload_max_filesize": "16M",
        "post_max_size": "16M",
        "enable_dl": "On",
        "timezone": "date.timezone = Asia/Tokyo"
      },
      "mysql": {
        "server_root_password": "hogefuga",
        "server_repl_password": "hogefuga",
        "server_debian_password": "hogefuga"
      },
      "run_list":[
        "recipe[yum::epel]",
        "recipe[yum::remi]",
        "recipe[users]",
        "recipe[sudo]",
        "recipe[setting]",
        "recipe[mysql::server]",
        "recipe[php]",
        "recipe[httpd]",
        "recipe[selinux::disabled]"
      ]
    }
    

以上で構築は終了です、opscodeに公開されているcookbookをもっと使っていきたい所ですが、時間が足りませんでした

apache,phpは公開されているcookbookを使いたいです、今度個人のサーバで使ってみようかと思います

でわでわ