• data_bagsの用途について

    こんにちは。小宮です。 data_bagsについて内部的に解説する必要が生じたのでこちらにも書いておきます。

    最近のdata_bagsの活用方法は以下のとおり

    1.LDAPで管理していないシステム用途のOSユーザ情報をロードしてレシピで追加 2.SSL証明書の格納とレシピからロードしてtemplateで設定 3.ntpサーバの情報のロードとtemplateで設定 4.awsのクレデンシャル情報を管理して各種スクリプトへ埋め込み 5.mysqlやldapなどのパスワードなどアカウント情報の管理 6.roleとenvironmentに収まりきらないnginxやapacheのvhostやupstream等の情報の管理 7.gangliaのhead_nodeやcluster_nameの情報の管理


    0.下準備的な解説

    ※前提条件としてchef-soloの場合"knife-solo_data_bag"というgemが必要なので入れる。 (gem listでなければgem installかbundlerで入れてください)

    格納方法と確認方法

    暗号化しない場合、viなど任意のエディタで編集OK chef-repository/data_bags/任意のディレクトリ名/任意のファイル名.json をつくる。 中身はjsonの規則にのっとっている必要があるので、シンタックスをjson_verifyでCHK。

    cat data_bags/dirname/filename.json |json_verify で、JSON is valid と出るのを確認する

    暗号化する場合、 まずEDITORの環境変数を~/.bashrcなりに設定しておく必要があるのと暗号化用の鍵を作って設定しておく必要がある。 (※鍵は案件ごとに異なるイメージで、.gitignoreに書いとく必要があります。  流出厳禁かつ無くすとデータが見えなくなります。)

    export EDITOR=vi
    vi .chef/knife.rb
    ------コメントを外す---------------------
    encrypted_data_bag_secret "data_bag_key"
    -----------------------------------------
    

    ※コメント外すと鍵指定しなくてもknifeコマンドでcreateした場合常に暗号化される  ゆえに暗号化せず扱いたいデータファイルはviで作るかコメントインしてから作る必要有

    鍵が必要なら作る (※.chef/knife.rbの相対パスはchefリポジトリ直下を意味します)

    openssl rand -base64 512 > data_bag_key
    
    knife solo data bag create dirname filename # 作成(※既存は上書きされる)
    knife solo data bag edit dirname filename   # ファイルをエディタで編集
    knife solo data bag show dirname filename   # jsonの中身を表示
    knife solo data bag list            # ディレクトリ一覧表示
    

    ・注意するべきこと →bashやexecuteリソースは極力使うべきではない。templateリソースつかってください。  bashでsedるとdata_bagsから変数に入れた特殊文字が展開されて意図しない値が入ったりします  もうひとつ、sedると毎度毎度同じsedをする必要が生じるなど冪等にならないです。

    ...
  • chef-soloのレシピのカスタマイズの記録

    こんにちは。小宮です。
    おかげ様でカスタマイズする機会があったため、その一部を引用してご紹介いたします。

    基本的なことなどは、
    以下のリンクや「入門chef-solo」その落ち穂拾いもご覧になるとよいと思います。
    Chef Soloと Knife Soloでの ニコニコサーバー構築 (2) 〜導入編〜:dwango エンジニア ブロマガ
    chef-solo - Chefを読んで実行するための全知識 - Qiita
    DevOpsを実現するChef活用テクニック // Speaker Deck
    あとGW前後にchef実践入門的な書籍をエンジンヤード(chefが出る前から8年くらい使ってる会社)の御方が出されるそうで大変期待してるところです。

    chefのnode、role、enviroment、attribute、data_bagsの解説になります。
    この記事は基本の説明とカスタマイズの為の簡単な情報提供になるかと思います。
    以下に記載しているレシピを実際ためした環境はCentOS6.4のみで、申し訳ありませんが異なる環境での動作保障はできないです。
    異なるOS間の動作保障するような汎用的(複雑)なレシピはopscodeコミュニティの☆がいっぱいついてるクックブックを使えばいいらしいです。
    (余計なものを極力入れないとか既存の環境または手順をレシピ化するという需要には不向きかとは思います。)

    chefリポジトリ直下のディレクトリの解説を以下に記します。
      cookbooks :サードパーティのクックブック置き場
     data_bags :data_bagsのデータ置き場
     environments :環境設定ファイル置き場
     nodes :ノード(ホスト・各サーバ)設定ファイル置き場
     roles :役割設定ファイル置き場
     site-cookbooks :自作クックブック置き場(クックブックはレシピ、配布ファイル等を含む)

    各用語を以下に軽く解説します。
    ・ohai
    chefに同梱されているレシピを適用するホストの情報を取得するコマンドです。
    ohaiで取得した値に基づいてattributeを定義することが可能です。
    たとえばOS搭載メモリやCPUコア数に応じて設定値を変えたい場合やホスト名や
    IPアドレスなど固有の情報を設定ファイルに載せたい場合などに利用すると便利です。

    ・node
    nodesディレクトリ直下にhostname.jsonまたはipaddress.jsonというファイルを置き、
    そこにそのサーバ固有の設定値(attribure)や割り当てる役割(role)を定義します。

    ・role
    dbやwebなど、同じ役割のサーバをroleでまとめ、同じ役割のサーバ群に適用するレシピ
    やパラメータをまとめて定義します。

    ...
  • 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で既存手順のレシピを書く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上で仮想インスタンスを起動するための設定を書きます。

    ...