繁体   English   中英

为刚刚创建的 LXC 容器运行 ansible 角色

[英]Run ansible role for just created LXC container

我正在通过 ansible 配置一堆 LXC 容器,但卡住了。 我已经设置了主机,通过lxc_container模块创建了一些容器,现在我需要对这些容器进行一些操作。 我可以用container_commandlxc_container ,但它不提供任何检查机制,看起来像一些简单动作的工具。 但是我需要在这些容器上执行复杂的设置,我希望为此使用 ansible。

换句话说,我需要在每个主机的所有“子机”上执行操作(角色),而这些子机是动态创建的。

我有两个解决方案:

  1. 有 2 个独立的 ansible playbook,一个在控制机器上运行,第二个复制到每个主机并从第一个 playbook 中执行。 听起来很笨拙。

  2. 使用新创建的容器动态创建主机组,然后为每个组运行容器设置播放。

第一个解决方案虽然很笨拙,但听起来可能是使用 ansible-pull 的好机会,出于简单的原因,我不想这样做。

第二个解决方案是我无法工作的解决方案,因为我没有从控制机器对这些容器的 SSH 访问,并且因为我不知道如何为动态生成的组主机运行播放。

应该有一种更简单的方法来做到这一点。

这就是我的想法,在我的组织中,我们确实选择了 #3

  1. 连接插件:ansible 可以为您的访客使用不同的连接; 我们确实使用了 lxc_attach 插件,但它不如 ssh 可靠。 基本上,我们将创建一个容器并在清单中创建一个新主机,并设置选项“ansible_connection”。
  2. 证书:我们设置了证书颁发机构,使用“lxc-attach ...”将 CA 公钥复制到机器上,并使 sshd 信任它。然后您可以使用您的公钥和用户证书登录来宾。 Ansible 会因为主机未知而发疯,使用模块 'add_host' 为 ssh 设置适当的选项以在没有警告的情况下登录并继续工作。 我们称这种方法为托儿所,它不是幂等的。

    \n\n\n
      \n\n
    • 名称:更新容器用户 ca 密钥外壳:lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "grep -F 'ssh-rsa {{ user_ca_key }}' /etc/ssh/ user_ca.pub || echo 'ssh-rsa {{ user_ca_key }}' > /etc/ssh/user_ca.pub" register: update_user_ca_key changed_when: "update_user_ca_key.stdout != 'ssh-rsa {{ user_ca_key }}'"
    • \n\n
    • 名称:信任用户 ca 密钥外壳:lxc-attach -n {{ vm_name }} --clear-env -e -- bash -c "grep -F 'TrustedUserCAKeys /etc/ssh/ user_ca.pub' /etc/ssh/ sshd_config || echo 'TrustedUserCAKeys /etc/ssh/user_ca.pub' >> /etc/ssh/sshd_config" register: trust_ca_key changed_when: "trust_ca_key.stdout !='TrustedUserCAKeys /etc/ssh/user_ca.pub'"
    • \n
  3. 到处都有证书:这太疯狂了,我真的很喜欢这种方法。 与#2 完全一样,在机器上复制 CA 公钥,然后复制容器主机证书并使用您的 CA 对其进行签名,将证书放在容器上。 现在您可以使用您的私钥和用户证书通过 ssh 连接到您的容器。 因为您的本地机器信任 CA,如果它暴露了主机证书,那么如果它连接到未知主机(您的容器),它就不会向您尖叫。

  4. 只需复制所有内容:您使用的是 ansible,因此您需要 python 和 ssh,只需手动创建一个模板容器并克隆它,而不是创建一个新的。

我真的很想选择#2,但现在我们坚持#3。

您可以使用 container_command 将主机的 SSH 密钥(运行 ansible 的位置)复制到容器的 authorized_keys 文件夹。 之后,如果您在主机文件中使用它,则可以访问该容器:

NAME hostname=HOSTNAME ansible_ssh_host=IP_ADDRESS  ansible_connection=ssh  ansible_user=USER   ansible_ssh_extra_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"

额外的参数需要身份验证不使用 known_hosts。 您可以通过两种方式将密钥复制到容器中。

  1. 在 lxc_container 模块之后使用 shell 模块,并将主机的 id_rsa.pub 复制到 /var/lib/lxc/CONTAINER_NAME/rootfs/USER/.ssh/authorized_keys 但在你需要在 container_command 中使用它之前:

    container_command: yum -y install openssh-server && ssh-keygen -b 2048 -t rsa -f /root/.ssh/id_rsa -q -N ""

  2. 如果您将一个文件夹从主机安装到容器,您可以将您的 .pub 密钥带到该文件夹​​,并在 container_command 中将其复制到authorized_keys。

这些不是太优雅的解决方案,但我花了几天时间寻找更好的解决方案,但没有找到。

您可以使用 SSH-proxyCommand 进行第二个选择(在他们自己的主机组中为所有新创建的 LXC 运行剧本),通过它您可以使 Ansible 管理主机通过目标主机(堡垒或跳转主机)通过 SSH 连接到容器) 在其中运行 lxc_container 模块来创建它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM