• MySQLのMyISAMが混在する環境のバックアップについて注意事項

    ※古い記事ですのでご注意ください※
    こんにちは。小宮です。

    社内のMyISAMテーブルが混在しているサービスにて、
    mysqldumpによるバックアップに失敗しコールドバックアップを取ったが不整合出たという事件について相談うけまして、
    その顛末を記録しがてら注意事項をまとめておきたいと思います。
     (昔軽く伝えた記憶があり皆知ってると思ってたんですが、わかりやすさや伝える力と、
     私と他の人のmysqlに対する愛のレベルが少し異なるという認識が足らなかったようです。
     トラブルは起きるもんだし失敗は挑戦の証で成功の元ですが同じことは繰り返さないようにしないと。)

    何が大切かって、マスタとスレーブのデータの整合性です。
     つまり、
     ⇒バックアップ対象が絶対に更新されてないこと
     ⇒バックアップ取得時点のポジションとバイナリログファイル名が明確であること
     が超重要です。
     MyISAM混在環境では気をつけないと不整合でます。
     不整合でると購入したはずのコンテンツが買われてないように見えるなど割と大変なことになりますね。
     InnoDBだけなら–single-transactionつけとけば不整合は気にしなくて大丈夫です。

    ・mysqldumpに失敗した原因

    mysqldump: Error 1317: Query execution was interrupted when dumping table
    

    このエラーは、
    mysqldumpでデータを読んでる間にクエリーが中断されると出るやつです。Ctrl + Cとかkillでスレッドが殺されたとか。。
    (とTwitterで教えていただきました。ありがとうございます。

    それから、整合性のためにマスタからmysqldumpでデータをとることになったのですが、
    その際にslaveでreplicationを止めて更新がない状態でとっている方法をそのまま用いたのも不整合が起きる原因になりました。
    (MyISAMが混在する環境なのにFLUSH TABLES WITH READ LOCK;をしてなかった)

    MyISAMが混在する環境の場合、トランザクションは使えないので、
    replicaion停止または共有ロックで更新停止が必要になります。

    ex)
    FLUSH TABLES WITH READ LOCK;
    sleepやsyncでロックが終わる(確実に更新停止される)のを待つ
    ポジションとファイル名をとりログに記録する
    mysqldumpする
    UNLOCK TABLES;
    

    特にクエリを中断したりしてない(中断と整合性がごっちゃ)という指摘があったりしてそれは私もよくわからないところですが、
    更新されないようにしてれば中断も起きるはずがないので、対処方法は更新を確実に止める一択かと思います。

    ...
  • AWSメンテナンスでstoppingのまま停止しない障害の対応

    こんにちは。小宮です。

    タイトルどおり障害がありまして、今後の為に記録しておこうかと思います。

    AWSメンテ通知の来たインスタンスをStopしたところ、最終的には6時間強ほどstoppingのままでした。
    今回のインスタンスは、自分で構築したわけでなく、構築メモは残っているもののメンテナンスされていない、
    という状況把握が難しいパターンでした。
    一応上がってるプロセスとポートくらいは控えてから止めましたが、snapshotは撮ってなくAMIも作っていませんでした。

    日本語フォーラムに投稿したところ特に反応がありませんでした。
    聞いた話によると英語フォーラムを使えば15分くらいで対応してもらえることもあるようです。

    その間、stoppingのインスタンスのsnapshotを撮ってAMI作成してそこから新インスタンスを起動してみましたが、
    NICの設定の問題かなにかで接続できませんでした。
    microインスタンスを起動しapacheだけ入れて簡単なsorryページを設置しました。

    stoppingのまま6時間ほど待ったのですが一向に進捗せず、
    しかもサポートにも未加入だったので、サポートに申し込んで以下のように問い合わせをしました。
    (申し込んだら10分くらいで反映されました)。
    -——————————– 1回目:
    EC2 Management ConsoleからサーバをStopしましたが、Stoppingから進みません。
    http://aws.amazon.com/jp/instance-help/
    に従い、何度かForce Stopを試みましたが同様のため、強制停止をお願いしたいです。

    Zone: ap-northeast-1a
    Instance: i-4a42a348

    インスタンスID: i-4a42a348
    -——————————– 2回目:

    先ほどstopしました。何か対応されましたでしょうか。
    同じインスタンスをstartしたいのですが、2回ほどstartしてもstopされてしまいます。
    可能なら起動をお願いできますでしょうか。
    -——————————– 私が時短なので帰宅後、stopedになってから選べたCreateImageでAMIを作って新インスタンスを起動したら接続できたようです。

    翌朝みたらサポートから返事が来ていました。
    -——————————– サポートの方から:
    お問い合わせ誠にありがとうございます。

    i-4a42a348についてお調べしたところ、仮想サーバホストに問題が発生していたためインスタンスの停止にお時間を要しておりました。
    EC2では、長時間StoppingやShuttingdownの状態が続いているインスタンスを自動でクリーンアップする仕組みがございます。
    今回はこちらの仕組みによってインスタンスのStopが行われておりました。
    このたびはご迷惑をおかけし、申し訳ございませんでした。

    インスタンスが起動できない件については、インスタンスとEBSボリュームの関連付けに問題が発生しており、その影響でインスタンスが起動しない状態となっているようです。
    お手数をおかけしますが、インスタンスにアタッチされているボリュームをデタッチ/アタッチして再度インスタンスの起動をお試しいただけるでしょうか。
    通常のデタッチが効かない場合、Force Detachをお試しください。

    ボリュームのデタッチ/アタッチを行ってもインスタンスが起動しない場合、恐れ入りますが、再度ご連絡いただけるでしょうか。

    ご不明な点がありましたらお知らせください。
    よろしくお願いいたします。
    -——————————–

    ...
  • VPC上でPrivateIPアドレスを付け替える

    こんにちは。小宮です。
    ちょっと前にAWSのVPC上でVIP(VirtualIPアドレス)を移動させる需要があって検証したのですが、
    個人的にメモってただけだったのと、質問される機会が数回ありましたので簡単にですが投稿しておきます。

    なんらかのクラスタ構成をVPC上で扱う際、VPC上でPrivateIPアドレスを付け替える必要が生じた場合、
    awsなので切替スクリプトをAPI使うように修正しないと内部はともかく外部から打ったPINGへの応答が帰ってこない。
    つまりVIPが移動したことになりません。

    つまり、以下のような感じになります
    落とすときは、IF落としてかつCLIも実行する
    [shell]ifconfig eth0:1 down ec2-unassign-private-addresses –network-interface eni-4b649*** –secondary-private-ip-address 10.0.0.96[/shell] ※ec2-unassign-private-addressesの短縮バージョンはec2upip
    起動するときも、IF起動かつCLI実行する
    [shell]ifconfig eth0:1 up ec2-assign-private-ip-addresses –network-interface eni-70609*** –secondary-private-ip-address 10.0.0.96[/shell] ※ec2-assign-private-ip-addressesの短縮バージョンはec2apip

    切替元のENI:eni-4b649***
    切替先のENI:eni-70609***

    参考:
    VPC 内の EC2 インスタンス に複数EIPを付与する
    ec2-assign-private-ip-addresses - Amazon Elastic Compute Cloud
    ec2-unassign-private-ip-addresses - Amazon Elastic Compute Cloud

    もし、EIPが紐づいてるENIをデタッチ、アタッチしたい場合、以下のような感じ。(たぶん(自分で試してないです))
    [shell]ec2-detach-network-interface ${eni_attach_id} ec2-attach-network-interface ${ENI_ID} –instance ${target_instance_id} –device-index ${TARGET_DEVICE_INDEX}[/shell]
    加えて、ifupしてip route処理をするといいらしい。
    [shell]ifconfig eth${TARGET_DEVICE_INDEX} up

    ...
  • MySQLのslaveでDuplicate entryエラーが出た時の対処

    こんにちは。小宮です。
    このまえ出たエラーの記録です。

    ・エラーログ

    >show slave status\G
    
                       Last_Error: Error 'Duplicate entry '1133523-2013-08-18 05:03:01' for key 'PRIMARY'' on query. Default database: '*****'. Query: 'INSERT INTO `event_****_logs` ...
    

    時刻がプライマリキーになってるから重複してる感じのエラーなような。
    ログとかセッションとか重複しやすい感じがします。

    念のためmysqldumpのオプションをみたものの、
    --skip-optは入ってないのでoptが勝手について–add-drop-tableは有効なはず。

    MYDUMP_PAR='--single-transaction --dump-slave=2 --routines --include-master-host-port --all-databases'
    

    http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html

    データ投入後にreset slaveしてログファイルとポジション合わせてstart slaveするなど手順には問題がないように見えました。

    お客さまに重複エントリは全部skipしていいか確認いただいたところ
    Insertでプライマリキーが被ってるのは大丈夫なのかは別途開発側で確認でとりあえずskipという話に。
    (対象がサービスで使用していないいので復旧優先ということだったと思います。不整合が気になるならマスタからdump撮り直すのが良いです。)

    ・エラーのクエリをskipする方法
    1つだけなら、

     SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    

    ですがいっぱいでてくる場合は
    Last_SQL_Errno: 1062
    こちらのエラー番号を指定してスキップ。重複エントリを全部スキップするということです。

    ...
  • Chefで書いたレシピをテストする(serverspec)

    こんにちは。小宮です。

    今回で最終回です。
    前回までにご紹介したレシピのテストするところをご紹介します。Serverspecを用います。

    なぜServerspecがいいかというのは以下リンクにも書いてますが、以下の点がよいと思います。
    ・Chefのテストツールでなく外部のツールなので依存関係がない(puppetでも使える)
    ・設計思想がシンプル簡単に使えるものということで、手間があんまりなくて簡単につかえた

    参考:
    Serverspec at hbstudy #45
    入門Chef Solo落ち穂拾い
    kayac/newbie-training
    「入門Puppet」
    resource_typeのマニュアル
    advanced_tips
    ncstudy#05 ハンズオン資料
    parallel_tests

    ・セットアップ
    バージョン0.3と0.6だとテストの書き方が若干違う感じだったので、マニュアルに沿ってる新しいほうを推奨します。
    [shell]# yum install rubygems

    gem install serverspec rake

    serverspec-init

    Select a backend type:
    
      1) SSH
      2) Exec (local)
    
    Select number: 1
    
    Vagrant instance y/n: y
    Input vagrant instance name: 10.0.0.241
     + spec/10.0.0.241/
     + spec/10.0.0.241/httpd_spec.rb[/shell]
    <br>
    コマンドの実行が終わると、上記のようにいくつかのファイルが作成されます。<br>
    

    [shell]# serverspec-init ~略~ Input target host name: 10.0.0.240 + spec/10.0.0.240/ + spec/10.0.0.240/httpd_spec.rb[/shell]
    SSHを指定し、ターゲットホストを入力すると、ホスト毎のディレクトリが作成されました。

    ...
  • Chefで既存手順のレシピを書く5(munin、zabbix)

    おつかれさまです。小宮です。

    前回に引き続き、munin,zabbixの手順のレシピをご紹介します。レシピはこの記事でおしまいです。
    記事の最後にはレシピの適用方法を記載します。

    ・muninのレシピ

    # cd /opt/src/rpms
    # mkdir -p /root/chef-repo/site-cookbooks/munin/files/default/rpms
    # mkdir -p /root/chef-repo/site-cookbooks/munin/files/default/var/www/html/munin
    # mkdir /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/plugin-conf.d
    # cp -p /etc/munin/munin.conf /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/
    # scp -Cp xxx-web01:/etc/munin/munin-node.conf /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/
    # cp -p /var/www/html/munin/.htaccess /root/chef-repo/site-cookbooks/munin/files/default/var/www/html/munin/
    # cp -p /etc/munin/plugin-conf.d/munin-node /root/chef-repo/site-cookbooks/munin/files/default/etc/munin/plugin-conf.d/
    # tar cf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-node-rpm.tar ./munin-node-rpm/
    # tar tf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-node-rpm.tar ./munin-node-rpm/
    # tar cf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-serv-rpm.tar ./munin-serv-rpm/
    # tar tf /root/chef-repo/site-cookbooks/munin/files/default/rpms/munin-serv-rpm.tar ./munin-serv-rpm/
    
    # cd /root/chef-repo/site-cookbooks/munin/recipes
    # touch munin-node.rb munin-server.rb munin-node-db.rb munin-node-web.rb
    # vi munin-node.rb
        filename = "munin-node-rpm.tar"
        cookbook_file "/tmp/#{filename}" do
          source "rpms/#{filename}"
          mode 0644
        end
    
        package "perl-DBI" do
          not_if "rpm -qa|grep perl-DBI"
          action :install
        end
    
        script "install_munin-node" do
          not_if 'ls /etc/munin/munin-node.conf'
          interpreter "bash"
          user        "root"
          code <<-EOL
            cd /tmp
            tar xf /tmp/#{filename}
            rpm -i /tmp/munin-node-rpm/perl-Dig*
            rpm -i /tmp/munin-node-rpm/perl-{C*,H*,I*,L*,N*,X*,li*}
            rpm -i /tmp/munin-node-rpm/perl-DBD-Pg*
            rpm -i /tmp/munin-node-rpm/munin-*
            cp -p /etc/munin/munin-node.conf{,.org}
          EOL
        end
    
        cookbook_file "/etc/munin/munin-node.conf" do
          source "etc/munin/munin-node.conf"
          mode 0644
        end
    
        script "link_plugins" do
          not_if 'ls /etc/munin/plugins/tcp'
          interpreter "bash"
          user        "root"
          code <<-EOL
            rm -f /etc/munin/plugins/*
            ln -s /usr/share/munin/plugins/cpu /etc/munin/plugins/cpu
            ln -s /usr/share/munin/plugins/if_err_ /etc/munin/plugins/if_err_eth0
            ln -s /usr/share/munin/plugins/if_ /etc/munin/plugins/if_eth0
            ln -s /usr/share/munin/plugins/iostat /etc/munin/plugins/iostat
            ln -s /usr/share/munin/plugins/load /etc/munin/plugins/load
            ln -s /usr/share/munin/plugins/memory /etc/munin/plugins/memory
            ln -s /usr/share/munin/plugins/tcp /etc/munin/plugins/tcp
            ln -s /usr/share/munin/plugins/df /etc/munin/plugins/df
          EOL
        end
    
        service "munin-node" do
          supports :status => true, :restart => true
          action [ :enable, :start ]
        end
    
    
    # vi munin-server.rb
        filename = "munin-serv-rpm.tar"
        cookbook_file "/tmp/#{filename}" do
          source "rpms/#{filename}"
          mode 0644
        end
    
        script "install_munin-serv" do
          not_if 'ls /etc/munin/munin.conf'
          interpreter "bash"
          user        "root"
          code <<-EOL
            tar xf /tmp/#{filename}
            rpm -i /tmp/munin-serv-rpm/*
            cp -p /etc/munin/munin.conf{,.org}
          EOL
        end
    
        cookbook_file "/etc/munin/munin.conf" do
          source "etc/munin/munin.conf"
          mode 0644
        end
    
        service "munin-node" do
          supports :status => true, :restart => true
          action [ :enable, :start ]
        end
    
        cookbook_file "/var/www/html/munin/.htaccess" do
          source "var/www/html/munin/.htaccess"
          mode 0644
        end
    
    # vi munin-node-web.rb
        script "link_plugins_web" do
          not_if 'ls /etc/munin/plugins/apache_accesses'
          interpreter "bash"
          user        "root"
          code <<-EOL
            ln -s /usr/share/munin/plugins/apache_accesses /etc/munin/plugins/apache_accesses
            ln -s /usr/share/munin/plugins/apache_processes /etc/munin/plugins/apache_processes
          EOL
        end
    
        service "munin-node" do
          supports :status => true, :restart => true
          action [ :enable, :restart ]
        end
    
    # vi munin-node-db.rb
        script "link_plugins_db" do
          not_if 'ls /etc/munin/plugins/mysql_threads'
          interpreter "bash"
          user        "root"
          code <<-EOL
            ln -s /usr/share/munin/plugins/mysql_queries /etc/munin/plugins/mysql_queries
            ln -s /usr/share/munin/plugins/mysql_slowqueries /etc/munin/plugins/mysql_slowqueries
            ln -s /usr/share/munin/plugins/mysql_threads /etc/munin/plugins/mysql_threads
          EOL
        end
    
        cookbook_file "/etc/munin/plugin-conf.d/munin-node" do
          source "etc/munin/plugin-conf.d/munin-node"
          mode 0644
        end
    
        service "munin-node" do
          supports :status => true, :restart => true
          action [ :enable, :restart ]
        end
    

    role毎にちがうコマンド実行するとかひとつのレシピ内でやる方法ってあるのかが気になります。ifとかでできるんでしょうか。
    今回はそんな方法はわからなかったので、webとdbそれぞれ用のレシピを分けて作りました。
    roleに適用する順序は、munin-node.rbを最初にしないとプラグインが最初全部消される仕様です。(レシピは上から順に実行されます)

    ...
  • Chefで既存手順のレシピを書く4(DBサーバ)

    おつかれさまです。小宮です。

    前回に引き続きdbserverのレシピについて書いていきます。
    のこってるのはmunin、zabbxとserverspecでのテストだけです。もうすこしの辛抱です。

    webと同じくバージョン固定インストールなので、外部レシピは基本的に使わない方向とする

    ・mysqlのインストールと起動と自動起動の有効化

    [shell]# cd /root/chef-repo/site-cookbooks/mysqld/recipes

    mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms

    mkdir -p ../templates/default/etc/init.d

    mkdir -p ../files/default/etc/init.d

    mkdir -p ../files/default/root

    mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d

    mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/opt/{backup,bin}

    scp -Cp xxx-db02:/opt/bin/mysql-back.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/

    cp -p /etc/logrotate.d/mysqld /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d/

    scp -Cp xxx-db01:/etc/init.d/mysqld ../files/default/etc/init.d/

    scp -Cp xxx-db02:/etc/my.cnf ../templates/default/etc/

    cp -p /root/.path_to_file ../files/default/root/

    cd /opt/src/rpms/

    tar czf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-rpm.tar.gz ./db-rpm/

    tar czf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-tools-rpm.tar.gz ./db-tools-rpm/

    tar tzf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-rpm.tar.gz

    vi ../templates/default/etc/my.cnf

    diff /etc/my.cnf ../templates/default/etc/my.cnf

    53c53

    ...
  • Chefで既存手順のレシピを書く3(WEBサーバ)

    こんにちは。プラットフォームの小宮です。
    前回に引き続き既存手順のレシピ化をすすめていきます。あと3回くらいだと思われるので気長におつきあいください。

    今回はWEBサーバのレシピになります。
    特別なことは特にしていなくて普通のwebサーバだと思いますが、一応何してるか書いておきますと、
    apache2.2+php5.3系で中間コードキャッシュにAPCを使っていてwordpressとそのsshプラグインつかっておりAWSのS3にmountしています。
    s3mountに使うfuseが最新版からソースコードで入れる必要があり、バージョン固定のphpのパッケージが18個くらいとかありまして
    一つ一つpackageリソース書くのが面倒だったこともありましてscriptつかいました。
    scriptつかうときはnot_if忘れるとmakeとか何回も実行されて困るので注意が必要です。
    あとcd書き忘れると展開場所が認識してるとこに出ないのでその後の手順でファイルが存在しないエラーがでました。

    ・httpdのレシピを書く
    設定ファイルの準備をする
    [shell]# mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/rpms # tar cf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/ # tar tf /root/chef-repo/site-cookbooks/httpd/files/default/rpms/web-rpm.tar ./web-rpm/ # cd /root/chef-repo/site-cookbooks/httpd/recipes # mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/{conf,conf.d} # cp -p /opt/src/config/web/httpd.conf /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/ # vi /root/chef-repo/site-cookbooks/httpd/files/default/etc/httpd/conf/httpd.conf # mkdir -p /root/chef-repo/site-cookbooks/httpd/files/default/etc/php.d # cp -p /opt/src/config/php/php.ini /root/chef-repo/site-cookbooks/httpd/files/default/etc/ # cd /root/chef-repo/site-cookbooks/httpd/files/default/rpms # wget http://rpms.famillecollet.com/enterprise/5/olds/x86_64/php-pecl-apc-3.1.13-3.el5.remi.x86_64.rpm # cp -p /etc/php.d/apc.ini /root/chef-repo/site-cookbooks/httpd/files/default/etc/php.d/ # wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/php-pecl-ssh2-0.11.3-2.el5.remi.x86_64.rpm[/shell]
    apacheのインストールと基本設定
    [shell]# vi httpd-server.rb cookbook_file “/tmp/web-rpm.tar” do source “rpms/web-rpm.tar” mode 0644 end

    ...
  • MysqlのHAとトラブル事例

    久しぶりの更新になります。プラットフォームの宮下です。

    先日開催されました、July Tech Festa2013というイベントの中の1コマで何と私が発表をさせて頂きました。
    その時使用した資料をアップしますので興味のある方は是非一読下さい。

    [slideshare id=24320385&doc=mysqlha-130716215401-phpapp02]

    mysqlのHA構成のデザインパターン紹介を経験談を交えて話させて頂きました。
    とても緊張してしまって肝心のトラブル事例がお話出来ませんでした。このブログでは、包み隠さずトラブルのレポートが出来ればと思います。
    今回のテーマは、小宮先生のレポートを多分に活用させて頂いています。
    次回こそは、私の成果を発表したいもんです。

    それではまた近いうちに更新します。

    ...
  • Chefで既存手順のレシピを書く2(ユーザ作成)

    こんにちは。プラットフォームの小宮です。

    前回に引き続きChefの記事で失礼します。

    data_bagsでユーザ管理の用意をします。

    一応、以前にこちらに書いてるのですが、関連情報がまとまってるほうがいいと思うので部分的に再掲します。

    data_bagsとはldapのような機能をもったデータ検索など管理ができるもの。
    chef-server使う場合はサーバと通信してデータ取ってきて反映することが可能。
    今回はChef-soloなので、ローカルのファイルにデータを用意して反映させる方法をとります。

    参考:
    もしユーザ数が多くて頻繁にアカウントが追加変更される場合、以下リンクのようにdata_bagsで有効無効も管理するのもよさそうです。
    chef-data-bag活用法

    [shell]# cd ;cd chef-repo/data_bags # mkdir users;cd users # vi xxx-op.json // xxx-op.json { “id” : “xxx-op”, “groups”: [ “xxx-op”,“wheel” ], “uid”: 1000, “username” : “xxx-op”, “home” : “/home/xxx-op”, “shell” : “/bin/bash”, “password” : “$1$Ka.Mw69U$TT5HRfSe7xxxxx” }

    # vi yyy-op.json // yyy-op.json { “id” : “yyy-op”, “groups”: [ “yyy-op”,“wheel” ], “uid”: 500, “username” : “yyy-op”, “home” : “/home/yyy-op”, “shell” : “/bin/bash”, “password” : “$1$Ka.Mw69U$TT5HRfSe78Pxxxxx” }

    ...
  • Chef-Soloでレシピを書く前の環境について(Vagrantfile,role,node,data_bags)

    こんにちは。小宮です。
    いつのまにか今年の前半が終了しました。宇治金時がおいしい季節になってしまったようです。
    それはともかく前回の続きです。 今回はChef-Soloのレシピを書く前の環境の定義などまでを書きます。

    Chef用語などは軽く解説してる、今日から使い始めるChefを見ていただくか定番の入門Chef Soloを見ていただくのが早いんではないかと思います。
    Automated infrastructure is on the menuも英語ですがわかりやすいです。
    やりたいこととしては以下のとおりです。
     Vagrantfileを書いて仮想インスタンスをたてる
     chefレポジトリを作る
     chefクックブックを作る
     nodeを定義する
     roleを定義する
     data_bagsを定義する
      ★今回はここまで★
     レシピを書く
     レシピをノードに適用する
     serverspecテストを書く
     テストを実環境に実行する

    テストの構成:
     chef-solo元のadmserver:10.0.0.93
     knife-solo適用クライアントwebserver:10.0.0.240
     knife-solo適用クライアントdbserver:10.0.0.241
     全てCentOS5.8です。

    ・AWSの環境変数を定義

    AWSのVPC上なので適宜定義しておきます
    [shell]# cd # vi .ec2 export AWS_ACCESS_KEY_ID=****** export AWS_SECRET_ACCESS_KEY=******* export AWS_KEYPAIR_NAME=xxx-key export AWS_PRIVATE_KEY_PATH=/root/.ssh/xxx-key # source .ec2[/shell]

    ・VagrantFileを書く

    vagrant initを実行するとVagrantfileができますのでそれを編集し、
    VPC上で仮想インスタンスを起動するための設定を書きます。

    ...
  • Chefで既存手順のレシピを書く1(初期設定)

    こんにちは。プラットフォームの小宮です。
    前回はChefでレシピを書く前のroleやdata_bagsなどの環境定義について書きました。
    今回は既存手順のレシピ化ということで淡々と地味に書いていきたいと思います。

    注意:
     scriptリソースを使うときはnot_ifまたはonly_ifを必ず書くこと(複数回実行されないように)
     bash内でcdを書き忘れるとtarの解凍先パスがその後のコマンドの指定と一致しなくなるので注意
     scriptリソースを使うとエラーがまともに出ないので自分でコマンドをたたいて状況を確認する必要がある
     リソースのマニュアルを熟読推奨。

    クックブック名とその内容は以下の通り。
     base_setting 初期設定など ★今回ご紹介するレシピはこちらのみです。
     login-users ログインユーザ作成
     httpd web関連設定
     mysqld db関連設定
     munin 統計グラフ設定
     zabbix 監視設定

    レシピを書く
    ・base_settingのレシピを書く
    使いまわしやすさを意識した結果細かく分割して書くことにしました。
    ☆バックアップディレクトリ作成レシピ
    [shell]# cd site-cookbooks/base_setting/recipes/ # for i in bkup_dir hosts sysctl disable ntpd ntpdate mail logrotate ;do touch $i.rb ;done # vi bkup_dir.rb directory ‘/etc/.backup/’ do owner ‘root’ group ‘root’ mode ‘0755’ action :create end[/shell]

    ...
  • Chef-SoloとVagrantの導入(VPC環境)

    こんにちは。プラットフォームの小宮です。
    最近chef流行ってますね。
    せっかくだからこの波に乗ってプロダクト環境に合わせてやってみよう的な記事を書こうかと思います。
    さっさとServerspecまでたどり着きたいんですが、今回は導入のみの記事でレシピなどはまた次回以降に。
    やってみよう的なレベルなのでリファクタリングし甲斐のあるレシピになる予感がします。

    さて今回Chef化を試みる環境はVPC上に移行する話になってます。(構成はweb2、db2、stg1、nat1です。ELB利用。soloで十分な感じ。)
    Vagrant-awsでVPCつかう方法が可能なようなので、Vagrantを使用して構成管理を行いつつKnife-soloも使うことにします。
    vagrantとsahara連携でOSの状態を保存してロールバックということが可能となります。
    knife-soloだと/sbin等の下のrubyを消して入れ替えようとしてしまうことがあるらしいので、アプリケーションにおいてrubyを使用しないことを確認しておきます。

    vagrantを入れるのでruby1.8.7より上のバージョンをrbenvで入れます。
    (CentOS5系の場合。6系や他のディストリビューションでは別途ruby -vで確認してください)

    実は、Chef-Clientを/opt/chefの下に入れた段階で以下のようにPATHを通しておけばrubyのバージョンは気にしなくてもよいかもしれません。
    [shell]# curl -L https://www.opscode.com/chef/install.sh | bash # export PATH=$PATH:/opt/chef/embedded/bin/ # vi ~/.bashrc PATHをとおしておく[/shell] gemでchefを入れるのは古いやりかたみたいですね。

    ・最初にOracleVirtualBoxを導入
    入れる理由はVagrant-awsでインスタンスの起動と管理を行うため。
    [shell]cat /etc/redhat-release CentOS release 5.8 (Final) yum install libXmu libXt mesa-libGL qt qt-x11 SDL

    wget http://download.virtualbox.org/virtualbox/4.2.12/VirtualBox-4.2-4.2.12_84980_el5-1.x86_64.rpm rpm -ivh VirtualBox-4.2-4.2.12_84980_el5-1.x86_64.rpm[/shell]
    ・ruby-1.8.7より新しいバージョンを導入(必要な場合)
    [shell]yum -y install zlib-devel readline-devel openssl-devel yum install ruby ruby-devel rdoc irb rubygems yum install git –enablerepo=rpmforge[/shell]
    rbenvのインストール
    [shell]git clone git://github.com/sstephenson/rbenv.git ~/.rbenv[/shell]
    rbenvのパスを設定する為に以下2行追記
    [shell]vi ~/.bashrc export PATH="$HOME/.rbenv/bin:$PATH" eval “$(rbenv init -)” source ~/.bashrc[/shell] ここでのPATHは各環境に合わせてください(rbenvで入れない場合は/opt/chef/embedded/binに通す等)

    ...
  • AmazoneSESを使ってメール送信する(SMTPリレー)

    こんにちは。プラットフォームの小宮です。 ちょっと前にAmazoneSESを使ってSMTPリレーでメール送信の設定をしたのでその記録を公開させていただきます。

    ※SDKでなくSMTPリレーのほうを試します。(SDKつかうにはサーバにruby入っていてruby使う必要があるため。)

    ★SESの申し込みをする SESのサービスダッシュボードに「RequestProductionAccess」というボタンがあるのでそれを押すと お問い合わせ画面が出てくるので、必要な内容を入力する (名前とサービスドメインとメールアドレスとメールの用途など) Request Production Access to Simple Email Service(お問い合わせ) 入力送信すると、 リクエストありがとう、1日も早く使えるように審査するからマニュアル読んでお待ちください と英文メッセージが出る。

    申請の翌日SESのダッシュボードを確認したところ、以下の標記になっていた

    Your Amazon SES Sending Limits
    Sending Quota: send 10000 emails per 24 hour period
    Quota Used: 0% as of 2013-03-08 10:53 UTC+9
    Max Send Rate: 5 emails/second
    

    24時間に10000通まで送ることが可能 現在の使用率は0% 最大送信レートは秒間5通

    送信元は以下と教えていただいた → 会員登録時「no_reply@hoge.jp」というメールを送信、 問合せ時「support@hoge.jp」というメールを受信(転送)、

    ...