Como detectar o nome do host / IP do hypervisor de dentro de uma máquina virtual KVM?

3

Temos uma pequena frota de hosts KVM / libvirt com algumas centenas de máquinas virtuais, gerenciados por um grupo de administradores em locais diferentes. Eu me deparei com um problema em que estou conectado a uma máquina virtual pelo SSH, mas não consigo descobrir o nome do host de metal puro que possui. Alguém sabe uma maneira de encontrar o nome do host de metal nu dentro de uma máquina virtual?

Se isso não é algo que o KVM faz de fábrica, há algum exemplo de configurações que possamos aplicar em todos os nossos hipervisores para expor essas informações?

Utilizamos software de gerenciamento de inventário para acompanhar nossas máquinas virtuais & seus hosts bare metal - no entanto, ele tem bugs e, de tempos em tempos, perdemos a noção de qual host possui uma máquina virtual. Vou consertar esse problema - mas o conceito de encontrar um host KVM de dentro de uma VM seria útil, independentemente disso.

Eu sei que isso vai contra muitos princípios de segurança empregados em ambientes compartilhados, onde cada máquina virtual é um produto vendido para um cliente diferente - mas em nosso ambiente onde somos donos dos hosts, a segurança não é um problema.

    
por Patrick 21.06.2013 / 08:16

4 respostas

2

Estou bem certo de que isso não é possível, por motivos de segurança. Não fazer o que você quer diretamente, consultando o convidado.

No entanto, você pode instalar um agente programável no host e usar algo como virsh list para despejar uma lista de nomes de VMs e ter uma política (na verdade, uma política de espaço de trabalho, não técnica) para garantir que o nome do host do convidado corresponde exatamente ao nome da VM.

OU .. Faça o mesmo que acima, exceto use algo como virsh para despejar o nome da VM e o endereço IP do convidado e, em seguida, trabalhe recursivamente pela lista, ssh neles em ordem, executando algum tipo de dados script de coleta e colocando-o em seu inventário.

Dessa forma, você conhece o host em que ele foi executado (porque você executou virsh dele e conseguiu uma lista) e sabe o que está sendo executado lá.

Não precisa ser virsh , você pode fazer a maioria / tudo isso com libvirtd diretamente ou as ligações do Python.

    
por 21.06.2013 / 08:47
2

Não é possível sem trabalhar em torno do problema, basicamente, algum tipo de agente na VM que manteria os dados do host nele. Se esses convidados migrarem, então ele precisa ser atualizado pela rede de alguma forma.

Se você usa um sistema de gerenciamento KVM (com centenas de VMs, você definitivamente deveria) como oVirt, você pode ver em qual host uma VM é executada no painel de controle do administrador

    
por 21.06.2013 / 19:32
2

Você está pensando sobre isso da maneira errada. Em vez de tentar derivar o nome do host KVM do convidado (impossível por design), tente descobrir como o host KVM pode informar o convidado de seu nome.

Os dados podem ser facilmente compartilhados com um convidado de um host KVM usando o recurso Passagem do sistema de arquivos. Há até mesmo uma opção de GUI no Virtual Machine Manager (veja Adicionar Hardware - > Filesystem).

Basta criar um diretório em algum lugar no host KVM com qualquer coisa que você queira compartilhar com o convidado. Isso pode ser um arquivo de texto contendo o nome do host, algum script de configuração ou manutenção ou o que você realmente quer. Marque como somente leitura para simplicidade e segurança. Em seguida, configure a passagem do sistema de arquivos usando esse caminho e monte-o em algum lugar conveniente em cada convidado.

Obviamente, esta abordagem requer pequenas modificações em cada host e convidado do KVM, mas com algumas centenas de hosts, presumo que você tenha algum tipo de gerenciamento de configuração (como Puppet, Ansible, etc.), simplificando importa.

Desculpe esta resposta é super tarde, mas como a pergunta tem mais de 5.000 visualizações, imaginei que deveria publicá-la mesmo assim.

    
por 03.01.2018 / 03:50
0

Pode ser um pouco tarde, mas você pode usar o qemu-guest-agent para isso. Isso permitirá que você crie arquivos nos sistemas convidados a partir do hipervisor:

root@hypervisor-node-01:~# echo "'date': testing file write from hypervisor['hostname']" | base64
  VGh1IE1heSAyNCAwOToxNDoxMCBDRVNUIDIwMTg6IHRlc3RpbmcgZmlsZSB3cml0ZSBmcm9tIGh5
  cGVydmlzb3JbaHlwZXJ2aXNvci1ub2RlLTAxXQo=

root@hypervisor-node-01:~# socat /var/run/qemu-server/101.qga -
  {"execute":"guest-file-open", "arguments":{"path":"/tmp/hypervisor","mode":"w+"}}
  {"return": 1032}
  {"execute":"guest-file-write", "arguments":{"handle":1032,"buf-b64":"VGh1IE1heSAyNCAwOToxNDoxMCBDRVNUIDIwMTg6IHRlc3RpbmcgZmlsZSB3cml0ZSBmcm9tIGh5cGVydmlzb3JbaHlwZXJ2aXNvci1ub2RlLTAxXQo="}}
  {"return": {"count": 86, "eof": false}}
  {"execute":"guest-file-close", "arguments":{"handle":1032}}
  {"return": {}}

Resultado no convidado:

root@kvm-guest-01:~$ cat /tmp/hypervisor
  Thu May 24 09:14:10 CEST 2018: testing file write from hypervisor[hypervisor-node-01]

Criei um script para definir fatos de marionetes sobre o hipervisor em meus convidados:

por 24.05.2018 / 09:37