我通过ansible配置了一堆LXC容器,然后卡住了。
我已经设置了主机,通过lxc_container
模块创建了一些容器,现在我需要对这些容器执行一些操作。
我可以使用container_command
中的lxc_container
,但它没有提供任何检查机制,看起来像是一些简单操作的工具。但我需要在这些容器上执行复杂的设置,我希望使用ansible。
换句话说,我需要在所有" submachines"上执行操作(角色)。对于每个主机,这些子机器是动态创建的。
我脑子里有两个解决方案:
有2个单独的ansible手册,一个在控制机器上运行 第二个复制到每个主机并从第一个内部执行 剧本。听起来很笨拙。
使用新创建的容器动态创建主机组,然后为每个组运行container-setupping play。
第一种解决方案虽然很笨拙,但听起来似乎是使用ansible-pull的好机会,但出于简单原因,我并不想这样做。
第二个解决方案是我无法工作的解决方案,因为我没有从控制计算机对这些容器进行SSH访问,因为我不知道如何为动态生成的组运行游戏主机。
应该有一种更简单的方法。
答案 0 :(得分:1)
以下是我的想法,在我的组织中我们确实选择了#3
证书:我们设置了证书颁发机构,将CA公钥复制到具有&lxc-attach ...'的机器上。并使sshd信任它。然后您可以使用您的公钥和用户证书登录访客。 Ansible会疯狂,因为主机不知道,使用模块' add_host'在没有警告的情况下为ssh设置适当的选项并继续工作。我们把这种方法称为托儿所,它不是幂等的。
各处证书:这很疯狂,我真的很喜欢这种做法。 正如#2复制计算机上的CA公钥一样,然后复制容器主机证书并与CA签名,将证书放在容器上。现在,您可以使用私钥和用户证书使用ssh连接到容器。因为您的本地计算机信任CA ansible,如果它连接到未知主机(您的容器),如果它公开主机证书,则不会尖叫。
只需复制所有内容:您正在使用ansible,因此您需要python和ssh,只需手动创建模板容器并克隆它而不是创建新容器。
我真的想选择#2,但现在我们已经被#3坚持了。
答案 1 :(得分:0)
您可以使用container_command将主机的SSH密钥(运行ansible的位置)复制到container的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"
额外的args需要身份验证不使用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。
这些不是太优雅的解决方案,但我花了好几天时间寻找更好,但没有找到。
答案 2 :(得分:0)
您可以使用SSH-proxyCommand进行第二种选择(为自己的主机组中的所有新创建的LXC运行一个playbook),通过该命令,您可以使Ansible管理主机通过目标主机SSH连接到容器(堡垒)或者跳转主机)运行lxc_container模块来创建它们。