問題タブ [ansible-playbook]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
provisioning - Ansible 通知を再生する方法
現在、私は人形からAnsibleに切り替えていますが、いくつかの概念、または少なくとも ansible の仕組みについて少し混乱しています。
セットアップに関する情報:
私はAnsible Best Practicesの例を使用しており、プロジェクトをいくつかのロール (プレイブック) などと同様に構成しています。
プロビジョニングに Vagrant を使用しており、ボックスは Saucy64 VBox です。
混乱の原因:
プロビジョニングして ansible を実行すると、タスクの実行が開始され、次に通知のスタックが開始されます。
例:
最後のタスク:
それから最初の通知:
これで問題ありません。役割が増えるにつれて、ますます多くの通知が行き詰まります。
ここで問題が発生します。
通知が失敗すると、プロビジョニングは通常どおり停止します。しかし、通知スタックは空です! これは、障害のある通知以降のすべての通知が実行されないことを意味します。
その場合、apache の vhosts 設定を変更し、apache サービスをリロードするように通知した場合、これは失われます。
例を挙げましょう(疑似言語):
上記が実行されると:
- Apache モジュールがインストールされている
- 仮想ホストは有効です
- PHP がインストールを試みて失敗する
- スクリプトの終了
- (通知はどこにありますか?)
この時点で、すべてが論理的に見えますが、Ansible は巧妙に (いいえ!*) スタック通知を試行するため、apache をリロードして再起動すると、プロビジョニングの最後に実行される apache が 1 回再起動されます。つまり、すべての通知が失敗します!!!
ここまでは、人によってはこれでもいいです。彼らは、プロビジョニングを再実行するだけで通知が起動すると言うでしょう。したがって、Apache が最終的にリロードされ、サイトが再び起動します。これはそうではありません。
PHP をインストールするためのコードが修正された後のスクリプトの 2 回目の実行では、設計により通知が実行されません。なんで?
これが理由です: Ansible は、正常に実行されたタスクを「完了/グリーン」としてマークし、これらのタスクの通知を登録しません。プロビジョニングが成功し、通知をトリガーして apache を再起動するには、次のいずれかを実行できます。
- ansible または ssh を介してサーバーに直接コマンドを実行します。
- スクリプトを編集してタスクをトリガーする
- そのための別のタスクを追加します
- ボックスのインスタンスを破棄して再プロビジョニングする
ボックスの完全なクリーンアップが必要なため、これは非常にイライラしますか、それとも Ansible で何かを正しく理解していないのでしょうか?
通知を「回収」/再生/強制的に実行する別の方法はありますか?
- 賢明なのは、タスクを未完了としてマークしてから通知を再開するか、通知を独自のタスクとして別のキューに保持することです.*
nginx - Flask アプリを使用した Nginx、Ansible、および uWSGI、内部サーバー エラー
タイトルのソフトウェアを使用して EC2 にアプリをデプロイしましたが、内部サーバー エラーが発生します。これが私がフォローしているチュートリアルです。
これは、ブラウザ経由でアプリケーションにアクセスしようとしたときのエラー ログです。
ansible - Ansible AWX/Tower でデフォルトのプロジェクト ベース パスを変更する
カスタム プロジェクト ベース パスを使用したい。私が理解している限り、/etc/awx/settings.py の PROJECTS_ROOT を変更する必要があります。しかし、私がしても何も起こりません...手動でsettings.pyをリロードするために何かをする必要がありますか?
ansible - Ansible: DNS が割り当てられる前にホスト名を設定する方法
ホスト名をサーバーに割り当てる前に、ホスト名を使用してインスタンスを構成するためのより良い解決策はありますか?
AWS を使用していて、インスタンスec2-1-2-3-4.compute-1.amazonaws.comをインスタンス化するとしましょう。構成が完了したら、最終的にnew-instance.example.comの DNS で CNAME を割り当てて、既に運用されている既存のインスタンスを置き換えます。
new-instance.example.comはすでに存在し、本番環境にあるため、マシンが適切に構成され、切り替える準備ができました。ただし、DNS の変更に備えて、インスタンスの内部構成ファイルとホスト名をnew-instance.example.comにする必要があります。ec2-1-2-3-4.compute-1.amazonaws.comになるため、 inventory_hostname変数は使用できません。また、新しいホスト名を使用する必要のない通常の運用サーバーもあるため、既存のinventory_hostnameを使用できるようにしたいと考えています。
これまでの私の最善のアイデアは、インベントリ ファイルに変数を割り当てることでした。
Playbook では、 new_hostnameの存在をテストできます。new_hostnameが存在する場合はそれが使用され、存在しない場合はinventory_hostnameが使用されます。error_on_undefined_varsがfalseに設定されていない限り、これは致命的なエラーを引き起こします。タイプミスを防ぐという利点のために、これを設定しないことをお勧めします。以下失敗例。
テスト プレイブック:
結果:
すべての単一サーバーにnew_hostnameを設定すると機能しますが、すべてのサーバーに設定するのではなく、新しいホスト名が必要なサーバーだけに設定します。また、次のようなホスト名のグループ化も中断します。
ec2-1-2-3-[4:5].compute-1.amazonaws.com
new_hostnameが存在する場合、これは機能します。
結果:
ただし、error_on_undefined_vars がデフォルトの true に設定されていて、new_hostnameが設定されていない場合、失敗します。
この戦略のベストプラクティスは?
nginx - Nginx エラー: (13: 許可が拒否されました) アップストリームへの接続中に
nginx-error.log
ファイルに次のエラーが表示されます。
ブラウザには、502 Bad Gateway エラーも表示されます。a の出力はcurl
同じ、 Bad Gateway html です
/tmp/uwsgi.sock
のアクセス許可を 777に変更して修正しようとしましたが、うまくいきませんでした。私もwww-data
グループに自分自身を追加しました (似たように見えるいくつかの質問がそれを示唆していました)。また、サイコロはありません。
これが私のnginx.conf
ファイルです:
nginx.conf
説明を徹底するために、NginsxとUwsgiでFlaskアプリケーションを実行しています。誰かに何かアイデアがあれば、本当に感謝します。
編集
uwsgi 構成ファイルを提供するように求められました。そのため、nginx や uwsgi ファイルを個人的に作成したことはありません。ansible-playbook を使用してすべてをセットアップするガイドhereに従いました。ファイルは自動生成されましたが、とフォルダの両方にあるファイル以外nginx.conf
には何もありませんでした。uwsgi 用に独自の構成ファイルを作成する必要がありますか? ansible がそれらすべてを処理してくれるという印象を受けました。/etc/uwsgi
README
apps-enabled
apps-available
ansible-playbook
このコマンドを実行したときから、uwsgi の構成を把握したと思います
起動し、これを出力します: