Ansible:構成と展開
(セクション: 技術とインフラ)
概要
Ansibleは、インフラストラクチャがすでに作成されている場合(Terraform/IaC)、環境を「復活」する必要があるVM/ホスト、サービス、アプリケーションの繰り返し構成に最適な宣言的構成およびオーケストレーションツールです。パッケージのインストール、リリースのロールアウト、テンプレートのロールアウト、ダウンタイムのないサービスの再起動、セキュリティポリシーを適用します。成功への鍵:モジュラー構造(役割/コレクション)、厳格なidempotence、秘密のきちんとした作業(Vault)、動的インベントリ、テスト、GitOpsの規律。
Ansibleが適切な場合(およびTerraformにどのように適合するか)
Terraform-リソース(VPC、クラスタ、データベース)を作成します。
Ansible-OS/ソフトウェアを構成し、バージョンをロールアウトし、移行をドライブし、ファイルやサービスを編集します。
リンク:Terraformはアーティファクトに'inventory '/IP/secretsを出力し、AnsibleはCDステップでそれらを読み込みます。
リポジトリ構造(推奨テンプレート)
ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
アンシブル。cfg(最小):
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True
インベントリ: 静的および動的
静的(ini):ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11
[db]
db-01 ansible_host=10. 0. 2. 10
[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'
ダイナミック
クラウドプラグイン(または独自のスクリプト)を使用してホストにタグ付けします。環境/タグ変数→'group_vars'。
役割とコレクション
役割=独立した再利用モジュール(タスク、ファイル、テンプレート、ハンドラ)。
コレクション-ロール/プラグイン/モジュールのセット。「コレクション/要件」のバージョンピンを修正しました。YML'。
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbook: Idempotentスクリプト
一般的なプレイブックの例:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
'Webapp' role(フラグメント):
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present
- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx
- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}" # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current
- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
ハンドラ:
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }
- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }
テンプレートと変数のJinja2
デフォルト変数を'defaults/mainに格納します。yml'、sensitive-Vaultで。
フィルタ('| to_nice_yaml',' | b64encode'、 '| default')、' when'条件を使用します。
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
秘密: Ansible VaultとSecret Manager
変数ファイル('group_vars/all。ヴォールトだ。yml')。
対応するモジュールを介して外部マネージャ(KMS/Secrets Manager/SSM)から秘密を読み取り、Vaultにリンク/ARNのみを格納することをお勧めします。
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
推奨事項:
- 共有アクセス:開発者はdev/stage、 prod-CIのみを参照してください。
- 秘密のローテーションを有効にし、監査にアクセスします。
Idempotencyと正しい変更
'shell/command'の代わりにモジュール('package'、 'user'、 'lineinfile'、 'template'、 'systemd')を使用する。
何も変更しない場合は「、noisy」タスク'changed_when: false'をマークします。
ロールのチェックモード('--check')とdiffをサポート。
不安定なタスクの場合:'retries'、 'delay'、 'until'。
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
パフォーマンス: 大規模な農場とピーク
フォーク:並行性を上げる(注意:ターゲットを過負荷にしない)。
strategy=隣人を待たずにタスクを自由に実行します。
pipelining=True-'ansible。cfg'はRTTを減らします。
gather_facts:事実が不要な場合はfalse。
長期運用のための非同期/世論調査;展開波のためのスロットル/シリアル。
単一のアクションのdelegate_toとrun_once(データベース移行など)。
ダウンタイムゼロのパターン
ローリング展開(各20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
カナリア島
Playbookを'--limit web-canary'(グループのサブセット)で実行し、メトリックを確認してからグループ全体にロールアウトします。
ブルーグリーン
2つのホストグループ'web_blue'と'web_green';Playbookで新しい波を準備し、コミュニティタスクでトラフィック(DNS/LB)を切り替えます。将軍。あなたのバランサーをaffiliate_lb'/APIしてください。
セキュリティと硬化
Hardening role: SSHポリシー、バナー、NOPASSWDのない'sudo'、ファイアウォール、auditd/rsyslog、 time-NTP、 'fail2ban'。
SELinux/AppArmorを有効にし、モジュールを使用してポリシーを管理します。
Bastion: jump-hostのみでSSHをターゲットに制限する('ProxyJump'を参照)。
'be: true'を最小化します。インベントリレベルでRBACを作成します(どのプレイブックを実行できるか)。
Windowsおよびネットワークハードウェア
Windows:モジュール'win_'、WinRM接続、PowerShellスクリプト-最後の引数として。
ネットワーク:'network_cli'/'httpapi'、 Cisco/Juniper/F5のモジュール;'save_when: changed'によるアトミシティ。
テストと品質
ansible-lint+yamllint→CI。
分子:ローカル/コンテナ役割テスト、idempotencyチェック(double run unchanged)。
サンドボックス:個別のVM一時インベントリ/イメージ。
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
CI/CDおよびGitOpsとの統合
典型的なパイプライン:1.Lint→Syntaxチェック→Molecule。
2.アプリケーションアーティファクトの構築。
3.展開:'ansible-playbook -i inventories/prod site。yml --limit web --tags deploy'。
4.変更されたホスト、ログのアーティファクトに関するレポート。
例ステップ(コンセプト):bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff
観察と監査
コールバックプラグイン(json/yaml/timer/profile_tasks)を接続-時間と変更のレポート。
Playbookのログを一元化されたストレージに保存します。
選択的な実行のための'tags:'タスクにラベルを付け、調査を迅速化します。
iGamingの頻繁なレシピ
Web/APIノード:Nginx+systemd-unit、ヘルスチェック、マネージャからの秘密、ロールリスタート。
ゲームサービス:'group_vars'によるリージョン/テナント別の設定テンプレート。
支払いコネクタ:キーの厳格なもの、通知による再起動、エンドポイントのポストチェック。
ETLジョブ:'cron'モジュールを使用したCronJobスクリプトの展開、idempotentロックファイル。
モニタリング:エージェントのインストール(node_exporter/otelcol)、モニタリングでの自動登録。
アンチパターン
モジュールが存在する'shell/command'を使用します。
'handlers'→不要な再起動とサービスジッタのないPlaybook。
公開'group_vars'に秘密を格納します。
'serial'/'max_fail_percent'が存在しないため、本番ウェーブが枯渇します。
グローバル'gather_facts: true'と'be: true'は不必要です。
分子テストのない役割と'--check'サポートのない役割。
'async/poll'のない長いコマンドは、波全体をブロックします。
実装チェックリスト
1.リポジトリフレームワークと命名規則に同意します。
2.動的インベントリとバスティオンを設定します。
3.ロール(webapp/hardening/monitoring)とコレクションのピンバージョンを作成します。
4.Vaultおよび/またはSecret Managerとの統合を有効にします。
5.idempotency、 '--check/--diff'、ハンドラとタグを確認します。
6.ansible-lint、 yamllint、 MoleculeをCIに接続します。
7.展開パターン(rolling/canary/blue-green)と'serial'の制限を記述します。
8.コールバックプラグインの追加、ログ収集、レポートの変更。
9.ロールバックランブックとインシデントアクションを文書化します。
10.定期的にゲームデーを保持します:SSHブレーク、ノードドロップ、バージョンのロールバック。
[結果]
Ansibleは、作成されたインフラストラクチャと動作する販売の間の「ラストマイル」を閉じます。迅速で安全で予測可能な構成とリリースの変更です。Ansibleは、最小限の再利用ユニット、動的インベントリ、正しいシークレット処理、および検証済みのゼロダウンタイムパターンとしての役割を備えており、iGamingチームが展開時間を短縮し、夜間のインシデントを減らし、SLOレベルでp99を維持するのに役立ちます。