[英]Run ansible role for just created LXC container
我正在通过 ansible 配置一堆 LXC 容器,但卡住了。 我已经设置了主机,通过lxc_container
模块创建了一些容器,现在我需要对这些容器进行一些操作。 我可以用container_command
从lxc_container
,但它不提供任何检查机制,看起来像一些简单动作的工具。 但是我需要在这些容器上执行复杂的设置,我希望为此使用 ansible。
换句话说,我需要在每个主机的所有“子机”上执行操作(角色),而这些子机是动态创建的。
我有两个解决方案:
有 2 个独立的 ansible playbook,一个在控制机器上运行,第二个复制到每个主机并从第一个 playbook 中执行。 听起来很笨拙。
使用新创建的容器动态创建主机组,然后为每个组运行容器设置播放。
第一个解决方案虽然很笨拙,但听起来可能是使用 ansible-pull 的好机会,出于简单的原因,我不想这样做。
第二个解决方案是我无法工作的解决方案,因为我没有从控制机器对这些容器的 SSH 访问,并且因为我不知道如何为动态生成的组主机运行播放。
应该有一种更简单的方法来做到这一点。
这就是我的想法,在我的组织中,我们确实选择了 #3
证书:我们设置了证书颁发机构,使用“lxc-attach ...”将 CA 公钥复制到机器上,并使 sshd 信任它。然后您可以使用您的公钥和用户证书登录来宾。 Ansible 会因为主机未知而发疯,使用模块 'add_host' 为 ssh 设置适当的选项以在没有警告的情况下登录并继续工作。 我们称这种方法为托儿所,它不是幂等的。
\n\n\n
到处都有证书:这太疯狂了,我真的很喜欢这种方法。 与#2 完全一样,在机器上复制 CA 公钥,然后复制容器主机证书并使用您的 CA 对其进行签名,将证书放在容器上。 现在您可以使用您的私钥和用户证书通过 ssh 连接到您的容器。 因为您的本地机器信任 CA,如果它暴露了主机证书,那么如果它连接到未知主机(您的容器),它就不会向您尖叫。
只需复制所有内容:您使用的是 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。 您可以通过两种方式将密钥复制到容器中。
在 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 ""
如果您将一个文件夹从主机安装到容器,您可以将您的 .pub 密钥带到该文件夹,并在 container_command 中将其复制到authorized_keys。
这些不是太优雅的解决方案,但我花了几天时间寻找更好的解决方案,但没有找到。
您可以使用 SSH-proxyCommand 进行第二个选择(在他们自己的主机组中为所有新创建的 LXC 运行剧本),通过它您可以使 Ansible 管理主机通过目标主机(堡垒或跳转主机)通过 SSH 连接到容器) 在其中运行 lxc_container 模块来创建它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.