こんにちは、habrauser。 そこで、初心者向けの記事のサイクル(
パート1と
パート2 )をまとめた私の記事の
第3部が届きました。 このパートでは、
AmazonクラウドでChefを使用する具体的な例に焦点を当てます。 前述したように、これはかなり一般的なシナリオです。

わかりやすくするために、2つの
ec2インスタンス (Amazon仮想サーバー)のケースを考えます。1つはChefサーバーとして機能し、2つ目はノードとして機能します。
AWSとChef
AWS CloudFormationを使用してインスタンスを実行することをすぐに明確にします。 もちろん、手動で開始して管理することもできますが、そのような自動化のポイントは何ですか?
CloudFormationは2つの
概念に分けることができます。
-templateは、インスタンスを実行するために必要なすべてのリソースを記述するjsonファイルです。
-stackは、テンプレートで説明されているAWSリソース自体です。
AWSを初めて使用する人のために、AmazonはAWSのほとんどの側面をカバーするビルド済みの
サンプルテンプレートを提供しています。 テンプレートへのリンクは、記事の最後に提供されます。
テンプレートとは何かを考えます。 基本的なケースでは、
パラメーター、マッピング、リソース、出力の4つのブロックで構成されます。
Parametersブロックは、作成時にスタックに渡される変数とその値を記述します。 パラメータ値は、リソースの作成時に入力するか、パラメータの説明のデフォルトフィールドを使用して設定できます。 パラメータには、パスワードから始まり、ネットワークポートまたはディレクトリへのパスで終わる任意の情報を指定できます。 パラメータ値を取得するには、テンプレートでRef関数を使用します。
Mappingsブロックには、対応するパラメーターとその値を持つキーのセットが含まれています。 ほとんどの場合、マッピングを使用してAWSリージョンとそれに対応する仮想イメージ(インスタンス)を識別する方法を確認できます。 特定のマッピングの値を取得するには、Fn :: FindInMap関数を使用します。この関数は、この値またはその値を検索するキーとパラメーターを指定します。
Resourcesブロックは、
ec2-instanceまたは他のAWSリソースを記述します。 このセクションでは、Chefサーバーとクライアントノードのイメージが宣言されています。 説明では、リソースのタイプ(AWS :: EC2 ::インスタンスなど)を指定する必要があります。また、メタデータを指定することもできます。このメタデータでは、インストール前の手順でノードまたはディレクティブの説明を指定できます(たとえば、イメージの起動時にパッケージをインストールする必要がある場合) ) ブロックの主要部分は、スタートアップブロックの詳細を説明する
プロパティブロックです。 このブロックでは、起動するイメージのタイプ(たとえば、Amazon Linux 32ビット)、起動したイメージが1つまたは別の
セキュリティグループ (実際、
ファイアウォールであり、デフォルトのアクションが拒否されるトラフィックのルールが定義されている)を指定できます) ただし、Propertiesブロックの最も重要な部分は
User Dataです。 ここで、フェースレスインスタンスをChefサーバーまたはChefクライアントに変えるスクリプトを説明します。
私が使用する
テンプレートは 、以下の猫の下に示されています。それを考慮し、コメントします。
テンプレート{ : , : , : { : { : , : , : , : , : , : }, : { : , : }, : { : , : }, : { : , : , : , : [ ,], : }, : { : , : , : , : , : , : , : } }, : { : { : { : }, : { : } }, : { : { : , : , : }, : { : , : , : }, : { : , : , : } } }, : { ChefClientTypeAWS::EC2::InstanceMetadataDescriptionChef ClientAWS::CloudFormation::InitconfigpackagesyumgitPropertiesImageIdFn::FindInMapAWSRegionArch2AMIRefAWS::RegionFn::FindInMapAWSInstanceType2ArchRefInstanceTypeArchInstanceTypeRefInstanceTypeSecurityGroupsRefWebServerSecurityGroupKeyNameRefKeyNameUserDataFn::Base64Fn::Join#!/bin/bash -v\nyum update -y aws-cfn-bootstrap\nfunction error_exit\n{\n cfn-signal -e 1 -r \ '", { "Ref" : "WaitHandle" }, "'\n exit 1\n}\nyum update -y\nyum install git -y\n/sbin/service iptables stop\n/sbin/service ip6tables stop\n/sbin/chkconfig iptables off\n/sbin/chkconfig iptables off\nyum install git -y\n/usr/bin/curl -L https://www.opscode.com/chef/install.sh | bash\ncd /root/\n/usr/bin/git git://github.com/opscode/chef-repo.git\n/bin/mkdir -p /root/chef-repo/.chef\n/bin/mkdir -p /etc/chef\n/bin/mkdir /root/.aws\n/bin/touch /root/.aws/config\n/bin/echo '[default]' >> /root/.aws/config\n/bin/echo 'region = ", {"Ref" : "AWS::Region" }, "' >> /root/.aws/config\n/bin/echo 'aws_access_key_id = ", { "Ref" : "HostKeys" }, "' >> /root/.aws/config\n/bin/echo 'aws_secret_access_key = ", { "Ref" : "SecretAccessKey" }, "' >> /root/.aws/config\n/usr/bin/aws s3 cp s3://storage/admin.pem /root/chef-repo/.chef\n/usr/bin/aws s3 cp s3://storage/chef-validator.pem /root/chef-repo/.chef\n/usr/bin/aws s3 cp s3://storage/knife.rb /root/chef-repo/.chef\n/usr/bin/aws s3 cp s3://storage/client.rb /etc/chef\n/usr/bin/aws s3 cp s3://storage/json_attribs.json /etc/chef\n/bin/cp -p /root/chef-repo/.chef/chef-validator.pem /etc/chef/validation.pem\n/usr/sbin/ntpdate -q 0.europe.pool.ntp.org\n/bin/echo '\nchef_server_url \"", { "Ref" : "ChefServerURL" }, "\"' >> /etc/chef/client.rb\n/bin/echo '\nchef_server_url \"", { "Ref" : "ChefServerURL" }, "\"' >> /root/chef-repo/.chef/knife.rb\n/usr/bin/chef-client\n/opt/aws/bin/cfn-signal -e 0 -r \ '", { "Ref" : "WaitHandle" }, "'\nWaitHandleTypeAWS::CloudFormation::WaitConditionHandleWaitConditionTypeAWS::CloudFormation::WaitConditionDependsOnChefClientPropertiesHandleRefWaitHandleTimeout1200ChefServerTypeAWS::EC2::InstanceMetadataDescriptionBootstrap ChefServerAWS::CloudFormation::InitconfigpackagesyumwgetPropertiesImageIdFn::FindInMapAWSRegionArch2AMIRefAWS::RegionFn::FindInMapAWSInstanceType2ArchRefInstanceTypeArchInstanceTypeRefInstanceTypeSecurityGroupsRefWebServerSecurityGroupKeyNameRefKeyNameUserDataFn::Base64Fn::Join#!/bin/bash\ncfn-init --region RefAWS::Region -s RefAWS::StackId -r ChefServer -c orderby --access-key RefHostKeys --secret-key RefSecretAccessKey || error_exit 'Failed to run cfn-init'\nyum update -y aws-cfn-bootstrap\nfunction error_exit\n{\n cfn-signal -e 1 -r \ '", { "Ref" : "WaitHandle" }, "'\n exit 1\n}\nyum update -y\n/sbin/service iptables stop\n/sbin/service ip6tables stop\n/sbin/chkconfig iptables off\n/sbin/chkconfig ip6tables off\n#Install ChefServer package\ncd /root/\n/usr/bin/wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.10-1.el6.x86_64.rpm\n/bin/rpm -ivh /root/chef-server-11.0.10-1.el6.x86_64.rpm\n/usr/bin/wget https://s3.amazonaws.com/storage/default.rb\n/bin/cp -f default.rb /opt/chef-server/embedded/cookbooks/runit/recipes/default.rb\n#Configure ChefServer\nsu - -c '/usr/bin/chef-server-ctl reconfigure'\nsu - -c '/usr/bin/chef-server-ctl restart'\n#AWS creds installation\n/bin/mkdir /root/.aws\n/bin/touch /root/.aws/config\n/bin/echo '[default]' >> /root/.aws/config\n/bin/echo 'region = ", {"Ref" : "AWS::Region" }, "' >> /root/.aws/config\n/bin/echo 'aws_access_key_id = ", { "Ref" : "HostKeys" }, "' >> /root/.aws/config\n/bin/echo 'aws_secret_access_key = ", { "Ref" : "SecretAccessKey" }, "' >> /root/.aws/config\n#Upload files for client\n/usr/bin/aws s3 cp /etc/chef-server/admin.pem s3://storage/\n/usr/bin/aws s3 cp /etc/chef-server/chef-validator.pem s3://storage/\n#Chef client and dirs for it\n/usr/bin/curl -L https://www.opscode.com/chef/install.sh | /bin/bash\n/bin/mkdir /root/.chef\n/bin/mkdir /etc/chef\n/bin/mkdir /etc/chef/cookbooks\n/bin/mkdir /etc/chef/roles\n#Knife client config files from S3\n/bin/cp /etc/chef-server/admin.pem /etc/chef/client.pem\n/usr/bin/aws s3 cp s3://storage/knife_admin.rb /root/.chef/knife.rb\n#Roles and cookbooks from S3\n/usr/bin/aws s3 cp s3://storage/roles/ /etc/chef/roles/ --recursive\n/usr/bin/aws s3 cp s3://storage/cookbooks/ /etc/chef/cookbooks/ --recursive\n#Cookbooks from community\n/usr/bin/knife cookbook site download cron\n/usr/bin/knife cookbook site download jenkins\n/usr/bin/knife cookbook site download ntp\n/usr/sbin/ntpdate -q 0.europe.pool.ntp.org\nyum remove ruby -y\nyum install ruby19 -y\n#Unpack and move cookbooks\n/bin/mv /root/*.tar.gz /etc/chef/cookbooks\nfor i in `/bin/ls /etc/chef/cookbooks/*.tar.gz`; do /bin/tar zxf $i -C /etc/chef/cookbooks/; /bin/rm -f $i; done\nfor i in `/bin/ls /etc/chef/cookbooks`; do /usr/bin/knife cookbook upload $i; done\n#Upload cookbooks and roles\n/usr/bin/knife cookbook upload * -c '/root/.chef/knife.rb'\n/usr/bin/knife role from file /etc/chef/roles/*.rb\n/bin/echo -e \!roles:BaseRole\\\role[BaseRole]\\\ >> /etc/crontab\n/bin/echo -e \env_role:master AND !roles:master\\\role[master]\\\ >> /etc/crontab\n/bin/echo -e \env_role:slave AND !roles:slave\\\role[slave]\\\ >> /etc/crontab\n/opt/aws/bin/cfn-signal -e 0 -r \ '", { "Ref" : "WaitHandle" }, "'\nWaitHandleTypeAWS::CloudFormation::WaitConditionHandleWaitConditionTypeAWS::CloudFormation::WaitConditionDependsOnChefServerPropertiesHandleRefWaitHandleTimeout1200WebServerSecurityGroupTypeAWS::EC2::SecurityGroupPropertiesGroupDescriptionEnable HTTP access via port 80 and SSH accessSecurityGroupIngressIpProtocoltcpFromPort80ToPort80CidrIp0.0.0.0/0IpProtocoltcpFromPort8080ToPort8080CidrIp0.0.0.0/0IpProtocoltcpFromPort443ToPort443CidrIp0.0.0.0/0IpProtocoltcpFromPort22ToPort22CidrIpRefSSHLocation
テンプレートから、
5つのパラメーターを宣言していることがわかります。 そのうちの2つにはデフォルト値があります-作成される
インスタンスのタイプ(この場合はm1.small)と、ノードへの
SSHアクセスが許可されるIPアドレスのサブネット。 スタックを作成する場合、3つの
パラメーターを指定する必要があり
ます -ノードへのSSHアクセスのキー(AWSコンソールで個別に作成)、アクセスキー、シークレットキー(両方はAWSアクセスアカウントの登録時に生成されます)。
2つのタイプのインスタンスのマッピングについて説明します。どちらも
64ビットアーキテクチャです。 AWSRegionArch2AMIは、Amazon Linuxのインスタンスに対応する仮想イメージIDも記述します(これらのIDはAWSコンソールから取得できます)。
次に、ChefサーバーとChefクライアントの
リソースについて説明します。 どちらの場合も、
メタデータセクションを通じて、
ユーザーデータセクションからコマンドを実行する前に、
wgetがインストールされます(実際には、Amazon Linuxイメージにそのようなパッケージが含まれている必要があります)。 作成されるリソースは、
ImageIdおよび
InstanceType変数によって決定されます(この場合、これらは以前に指定されたパラメーターです。この場合はAmazon Linux、m1.smallおよび64ビットアーキテクチャです)。 次は、リソースの本体である
ユーザーデータです。 インスタンスが初期化された後、段階的に実行されるbash構成スクリプトの本体を表します。
つまり、
Chefサーバーになるノードに対して次の手順が実行され
ます 。
- iptablesを無効にします(ドロップドロップパケットに問題がないように)。
- オープンソースChefサーバーのインストール
- default.rbの代替(はい、Amazon Linuxのバグは、本質的にはredhatとして表示されないことですが、amazonのようであり、Chef-serverサービスは完全に機能しません);
- 自動構成とサーバーの再起動。
- AWSコンソールの構成ファイルを作成する
- admin.pemおよびchef-validator.pemファイルをリポジトリにアップロードします(クライアントで必要になります)。
- ノードにchef-clientをインストールします(はい、Chef-serverには独自のナイフがありません)。
- サーバーで実行されているナイフのclient.pemおよびknife.rbファイルを受信します(記事の最初の部分からの一種のスターターキット)。
- クックブック、ロールファイルなどが含まれるchef-repoディレクトリの構造を再作成します。
- サーバーにクックブックをダウンロードしてインストールします(クックブックはリポジトリにあり、一部はコミュニティから取得されます)。
- サーバーに役割をダウンロードしてインストールする
- 5分ごとにすべてのノードをポーリングし、新しいノードごとに基本的な役割を確立する定期的なタスクを追加します。
これは混oticとした理解できない説明のように見えるかもしれませんが、スクリプトの各部分を詳細に調べるには多くのスペースが必要です。 そのため、ご質問がある場合は、PMまたはコメントでお気軽にご連絡ください。
テンプレートに戻ります。
Chefクライアントになるノードの場合、次のアクションが実行されます。
- iptablesを無効にします(ドロップドロップパケットに問題がないように)。
- Chef Clientをインストールする
- AWSコンソールの構成ファイルを作成する
- ストレージからクライアント構成ファイルをダウンロードする
- Chefサーバーのアドレスをクライアント構成に追加します(イメージを再起動したとき、またはスタックが再び起動したときにも変更できます)。
- Chefクライアントを実行するための定期的なタスクを追加します。
json_attribsなどのオプションのおかげで、インフラストラクチャでの
役割を決定するノードのラベルを作成できることに注意してください。 これは、Chefクライアントの中に、さまざまなインフラストラクチャロールを受け入れるノードが存在する可能性がある場合に行われます。
以下のリソース、
WaitHandleおよび
WaitConditionは、スタックの作成プロセスを一時停止できる条件を説明しています。 WaitHandleが、WaitConditionで指定されたタイムアウト内にプロセスの正常終了に関するシグナルを受信した場合-スタックの作成プロセスは続行/終了します。
次に通知されるリソースは、ノードのファイアウォールである
セキュリティグループです。 このグループは、転送されたポートとパケットの送信元アドレスを記述します。
最後のブロック-
出力 -は、スタックとインスタンスの正常な起動後に、関心のある変数を取得することを保証するのに役立ちます。 たとえば、インスタンスにアクセスするためのドメイン名。
その結果、AWS管理コンソールで1つのコマンドを実行することにより、ユニバーサル
テンプレートと、小規模なインフラストラクチャをデプロイする機能(多数のインスタンスに関心がある場合-Auto-Scalingグループを使用)を取得します。 起動の結果は
CloudFormationセクションにあります。
次は? 次に、ナイフ、クックブック、およびロールによってノードを制御する機会が得られます。
コミュニティクックブックを使用したり、独自の
クックブックを作成したり、他の
クックブックに ラッパーを作成したりできます。 多くの機会があり、すべては最終タスクに依存します。
この一連の記事では、表面的にではありますが、PCフリート管理を自動化し、AWSクラウドリソースとやり取りするプロセスを説明しようとしました。 願わくば、初心者の
DevOpsにとって、これらの記事が興味深いものになることを願っています。
質問や提案がある場合は、私の記事に関するダイアログやコメントを自由に書いてください。 記事を読むのに時間を割いてくださった皆さんに感謝します。
じゃあね!参考文献 :