2016-06-13 13 views
1

私はAWS EC2イメージ(AMI)を作成するためにパッカーを使用しています。 Ansibleは、Java 8のインストール、データベース(Cassandra)のインストール、Ansibleのインストール、Ansibleプレイブックのアップロード(私はgitにプッシュブックをプッシュしてプルする必要があることを知っています。インスタンスがAMIから起動されたときにカサンドラのプロパティのいくつかを変更する必要があるため(例:カサンドラのオプションで現在のインスタンスIPを追加する)、私はAnsibleをインストールして、プレイブックをアップロードしています。これを達成するために、簡単なbashスクリプトを書いた。これはuser-data-fileというプロパティーとして追加されている。これはスクリプトです:EC2インスタンス上のユーザーデータスクリプトを使用して安全なプレイを実行してください。

#cloud-boothook 
#!/bin/bash 

#cloud-config 
output: {all: '| tee -a /var/log/cloud-init-output.log'} 


ansible-playbook -i "localhost," -c local /usr/local/etc/replace_cassandra.yaml 

私が見ることができるように、私はローカルホストモードで無能なプレイブックを実行しています。

問題は、インスタンスを開始するときに、/var/log/cloud-init.logファイル内にエラーが見つかりました。エラーansible-playbookが見つかりませんでした。そこで行をユーザデータスクリプトの中に追加して、/usr/bin/フォルダ(Anabilitiesがインストールされているフォルダ)の内容をチェックし、そこにAnabilitiesはありませんでしたが、sshでインスタンスにアクセスすると、 /usr/bin/フォルダ内に存在しており、無能なプレイブックの実行に問題はありません。

誰も同じような問題が発生しましたか?私はこれがEC2のAnsibleの非常にポピュラーなユースケースになるはずだと思います。


EDIT

一部伐採した後、私は何のAnsibleは、ユーザデータの実行中に、存在しないだけでなく、ことが分かったが、データベースにも欠けています。

PackerのAnsibleプロビジョナのコードの一部(またはそのすべて)が、インスタンスの起動時に実行される可能性はありますか?


EDIT2

私はここで何が起こっているのかを見出しました。パックデータをuser_data_fileプロパティのパッカーで追加すると、パッカーがインスタンスを起動してAMIをビルドするときにユーザーデータが実行されます。 ScriptはAnabilitiesプロビジョナが実行される前に起動されるため、Anabilitiesが存在しないのはそのためです。

私がしたいのは、ユーザーデータをAMIに自動的に追加することです。その結果、AMIからインスタンスが起動されると、パッカーが前記AMIを構築するときではなくユーザーデータが実行されます。

これを行う方法に関するアイデアはありますか?

+0

#cloud-config形式が間違っているようです。この[doc](http://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot)のように 'bootcmd:'にansible-playbookコマンドを入れてみてください –

+0

Iこれが問題だとは思わないでください。私が質問したところでは、 '/ usr/bin'フォルダには' ansible-playbook'がありません。それがコードが機能しない理由です。 –

+0

同様の問題は、ここでは、単にパッカーなしで: pip install ansible; アシスタントプレイブック... 不可能なプレイブック用にfoudではないコマンドで失敗する –

答えて

1

複数のプロビジョナを実行するだけで、クラウド初期化を介して実行することはできません。

あなたのプレイブックとロールは、パッカーの実行を開始する場所にローカルに保存されていることを前提にしています。無能なものをユーザーデータに分割する代わりに、シェルプロビジョナを実行してansbileをインストールし、必要なプレイブック/ロールを実行するために潜在的なプロビジョナを実行します。

以下は、私が話していることの簡単な例です。それはビルダーの設定でいくつかのより多くの値なしで実行されませんが、私は簡潔さのためにそれらを残しました。

jsonの例では、install-prereqs.shは安全なppa apt repoを追加してapt-get update -yを実行してから、安全なものをインストールします。

第2のプロビジョニング担当者が指定したプレイブックと役割をターゲットホストにコピーして実行します。

{ 
"builders": [ 
    { 
    "type": "amazon-ebs", 
    "ssh_username": "ubuntu", 
    "image_name": "some-name", 
    "source_image": "some-ami-id", 
    "ssh_pty": true 
    } 
], 
"provisioners": [ 
    { 
    "type": "shell", 
    "script": "scripts/install-prereqs.sh" 
    }, 
    { 
    "type": "ansible-local", 
    "playbook_file": "path/to/playbook.yml", 
    "role_paths": ["path/to/roles"] 
    }, 
] 
} 
0

これは可能です!以下の点を確認してください。

  • AMIに組み込まれていない場合は、クラウドフォーメーションのユーザーデータを使用してインストールできます。ターゲットには、クラウド情報で作成したセキュリティグループにSSHアクセス権があります。
  • セキュリティ上の問題が発生したサーバーにanonymous.cfgファイルをインストールした後、ansible.cfgファイルがセキュリティ保護されたサーバー上の秘密キーを指している
  • 秘密キーの対応する公開キーがルートのサーバー上のauthorized_keysファイルにコピーされますユーザの.sshディレクトリに の遊び方を実行したい - 可能なサーバとターゲットサーバの間でrootのsshアクセスを有効にした場合、これは/ etc/ssh/sshd_configファイルを編集して何もないことを確認することで行うことができますターゲットサーバー上のroot authorized_keysファイルのルートユーザーからのSSHアクセスを防止する