pimvh.cloud_init

分子测试

需求

  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: 我的用户描述
      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: []                       # 额外的命令
  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
  # 通过追加云初始化 SSH 配置来配置新的 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 pull 的 SSH 密钥对(如果请求)
  • 配置 SSH 主机 CA 和用户 CA(如果请求)
    • 在控制器上签署证书密钥
  • 通过在 cloud-init 配置中放置 repository_url 的 requirements.yaml 来配置 Ansible-pull(如果请求)
  • 模板 cloud_init
    • 将签名证书模板化为 cloud-init 配置
    • 模板化所需的 cloud-init userdata
    • 模板化 cloud-init networkdata
    • 模板化 Ansible pull 的 requirements.yaml
  • 将 Github 部署密钥添加到请求的 Ansible pull 存储库(如果请求)
  • 作为 ansible 用户在系统上运行 Ansible pull(如果请求)
  • 将 SSH CA 添加到已知主机(如果请求)

未来改进

  • 找到一种更好的方法使用不同的验证方法获得对 Github 的短期访问。

来源

SSH CA 逻辑的一部分基于 以下博客

安装
ansible-galaxy install pimvh.cloud_init
许可证
gpl-3.0
下载
1.5k
拥有者