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

时间:2016-04-20 07:25:44

标签: linux ansible ansible-playbook devops lxc

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

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

我脑子里有两个解决方案:

  1. 有2个单独的ansible手册,一个在控制机器上运行 第二个复制到每个主机并从第一个内部执行 剧本。听起来很笨拙。

  2. 使用新创建的容器动态创建主机组,然后为每个组运行container-setupping play。

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

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

    应该有一种更简单的方法。

3 个答案:

答案 0 :(得分:1)

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

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

    • name: update container user ca key shell: 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 }}'"
    • name: trust user ca key shell: 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'"
  3. 各处证书:这很疯狂,我真的很喜欢这种做法。 正如#2复制计算机上的CA公钥一样,然后复制容器主机证书并与CA签名,将证书放在容器上。现在,您可以使用私钥和用户证书使用ssh连接到容器。因为您的本地计算机信任CA ansible,如果它连接到未知主机(您的容器),如果它公开主机证书,则不会尖叫。

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

  5. 我真的想选择#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。您可以通过两种方式将密钥复制到容器中。

  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。

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

答案 2 :(得分:0)

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