pimvh.cloud_init

Molecule テスト

要件

  1. Ansible のインストール:
sudo apt install python3
python3 -m ensurepip --upgrade
pip3 install ansible
  1. requirements.yaml のインストール(このロールは pimvh.ssh_keygen を使用します):
ansible-galaxy install -r requirements.yaml

必要な変数

デフォルトに示されている変数を確認してください。

cloud_init_machine_name: ""
cloud_init_ansible_user_passwd_hash: "" # ansible ユーザーのパスワードハッシュ
cloud_init_github_token: ""

cloud_init_userdata:
  hostname: hostname
  fqdn: hostname.example.com
  groups: []
  users:
    - name: my user
      gecos: My user description
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL # パスワードなしの sudo
      groups: sudo                 # sudo のメンバー
      lock_passwd: false           # パスワードを解除
      passwd: "{{ password_here | password_hash('sha512') }}"
      ssh_authorized_keys: []      # オプションの認証鍵
  runcmd: []                       # cloudinit で実行する追加コマンド
  writefiles: []                   # 追加のファイルを書き込む
  packages: []                     # 追加のパッケージをインストール

cloud_init_networkdata:
    # IP を定義し、以下の `default routes` と `nameservers` を使用
    ipv4: << ipv4 >>
    ipv6: << ipv6 >>
    # --- または ---
    # netplan 全体をダンプ
    # 次のように
    netplan:
      network:
        version: 2
        ethernets:
          enp1s0:
            dhcp4: false
            addresses:
              - << addr >>
            gateway4: << addr >>
            gateway6: << addr >>
            nameservers:
              addresses:
              - << dns_server ip >>

cloud_init_netplan_routes:
  - to: default
    via: 1.0.0.1
  - to: default
    via: 2001:db8::11

cloud_init_netplan_nameservers:
  addresses:
    - 1.1.1.1
    - 1.0.0.1

cloud_init_add_to_known_hosts: true
cloud_init_reboot_on_finish: true
cloud_init_enable_ssh_ca: true

# 私のおすすめはこのようなルックアッププラグインを使うことです:
# cloud_init_ssh_host_ca_publickey: "{{ lookup('ansible.builtin.file', 'your_ca') }}"
# またはこのような変数のルックアップ:
# "{{ lookup('ansible.builtin.vars', 'your_ca') }}"
cloud_init_ssh_host_ca_privatekey: ""
cloud_init_ssh_host_ca_privatekey_pass: ""
cloud_init_ssh_host_ca_publickey: ""
cloud_init_ssh_user_ca_publickeys: []

cloud_init_enable_ansible_pull: false
cloud_init_ansible_pull_repo_owner: ""
cloud_init_ansible_pull_repo_name: ""
cloud_init_ansible_pull_playbook_name: ""
cloud_init_ansible_pull_deploy_key_name: "Ansible-pull デプロイキー"

cloud_init_validity_period: 520w
cloud_init_ssh_ca_runcmd:
  # サーバーでの CA 使用を設定
  - echo "@cert-authority * $(cat /etc/ssh/host_ca.pub)" >> /etc/ssh/ssh_known_hosts
  # ホスト CA の公開鍵を削除
  - rm -f /etc/ssh/host_ca.pub
  # 新しい TrustedUserCAkey キーを設定
  - echo "TrustedUserCAKeys /etc/ssh/ssh_trusted_user_ca_keys" >> /etc/ssh/sshd_config.d/50-cloud-init.conf
  # 変更を有効にするために sshd を再起動
  - systemctl restart sshd

使用例のプレイブック

hosts:
  - foo
roles:
  - pimvh.cloud_init

TLDR - これを実行すると何が起きるか

  • 必要な変数が定義されていることを確認
  • cloud-init ファイルを開始するためのディレクトリを作成
  • Github ホストキーを取得(要求された場合)
  • Ansible プル用の SSH キーペアを生成(要求された場合)
  • SSH ホスト CA とユーザー CA を設定(要求された場合)
    • コントローラーで証明書キーに署名
  • cloud-init 設定に repo_url の requirements.yaml を入れて Ansible-pull を設定(要求された場合)
  • cloud_init をテンプレート化
    • 署名された証明書を cloud-init 設定にテンプレート化
    • 必要な cloud-init userdata をテンプレート化
    • cloud-init networkdata をテンプレート化
    • Ansible pull requirements.yaml をテンプレート化
  • 要求された Ansiblepull リポジトリに Github デプロイキーを追加(要求された場合)
  • システム上で ansible ユーザーとして Ansible-pull を実行(要求された場合)
  • 知っているホストに SSH CA を追加(要求された場合)

将来的な改善

  • 異なる認証方法を使用して Github への一時的アクセスを得るより良い方法を見つける。

参考文献

SSH CA ロジックの一部は このブログ に基づいています。

プロジェクトについて

Role to configure cloud-init.

インストール
ansible-galaxy install pimvh.cloud_init
ライセンス
gpl-3.0
ダウンロード
1.5k
所有者