AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-614167

inframan's questions

Martin Hope
motorbass
Asked: 2024-02-08 23:55:56 +0800 CST

Ansible.builtin.wait_for emite comportamento estranho com Kerberos

  • 5

Estou acostumado a ter muitos projetos em funcionamento para lidar com o ambiente Windows usando a conta de serviço do Active Directory, cifrada usando o Hashicorp Vault. Os projetos são lançados de um servidor Debian 11 para muitos destinos do Windows Server (principalmente OS Server 2019-2022)

No momento, enquanto eu queria migrar um projeto Ansible normalmente lançado do meu servidor Debian para o AWX, me deparei com um erro que aconteceu em ambos.

Meus testes simples fazem o seguinte:

---
# --------------

- name: test-webrequest-win
  hosts: all

  vars_files:
  - vars.yml

  tasks:
  - name: Test win_ping
    ansible.windows.win_ping:

  - name: Test Sleep 10 sec 
    ansible.builtin.wait_for:
      timeout: 10
    delegate_to: localhost

  - name: Test check webrequest
    ansible.builtin.uri:
      url: http://{{inventory_hostname}}:6666/
      return_content: yes
    delegate_to: localhost

Meu vars.yml está configurado assim:

---
ansible_user: "{{ vault.ansible_account }}"
ansible_password: "{{ vault.ansible_password }}"

#### Configuration Ansible WinRM
ansible_connection: winrm
ansible_port: 5985
ansible_winrm_transport: kerberos

Aqui está o meu problema, como você pode ver abaixo, o win_ping (ou todas as tarefas do Windows, na verdade) está funcionando muito bem, mas a grande surpresa é sobre o módulo ansible.builtin.wait_for

PLAY [test-webrequest-win] ************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************jeudi 08 février 2024  15:55:34 +0100 (0:00:00.014)       0:00:00.014 *********
ok: [10.10.10.10]
ok: [my-server.ansible.com]

TASK [test win_ping] ******************************************************************************************************************************************************************************************jeudi 08 février 2024  15:55:38 +0100 (0:00:04.082)       0:00:04.097 *********
ok: [my-server.ansible.com]
ok: [10.10.10.10]

TASK [Test sleep 10 sec] **************************************************************************************************************************************************************************************jeudi 08 février 2024  15:55:40 +0100 (0:00:02.538)       0:00:06.635 *********
fatal: [10.10.10.10 -> localhost]: UNREACHABLE! => {"changed": false, "msg": "kerberos: authGSSClientStep() failed: (('Unspecified GSS failure.  Minor code may provide more information', 851968), ('Server not found in Kerberos database', -1765328377))", "unreachable": true}
fatal: [my-server.ansible.com -> localhost]: UNREACHABLE! => {"changed": false, "msg": "kerberos: authGSSClientStep() failed: (('Unspecified GSS failure.  Minor code may provide more information', 851968), ('Server not found in Kerberos database', -1765328377))", "unreachable": true}

Eu testo com vários hosts para verificar se algo estava errado nas partes do AD, mas está tudo bem em coletar fatos e testar o win_ping, não importa se eu uso FQDN (que é recomendado) ou IP (no meu caso foi apenas para testar )

Algum conselho por aí? :)

Gael

ansible
  • 1 respostas
  • 17 Views
Martin Hope
motorbass
Asked: 2023-09-14 22:29:07 +0800 CST

Como solucionar problemas de solicitações de API enviadas pelo módulo Ansible?

  • 7

Aqui está o contexto:
O manual a seguir (simplificado para uma tarefa para este tópico stackoverflow e para facilidade de uso) obteve resultados diferentes dependendo de onde eu o iniciei. Ele usa a coleção galaxy nutanix.ncp (testada com versão 1.9.0, 1.8.0, 1.7.0...)

O ntnx_subnets_infométodo é chamado para recuperar toda a lista de sub-redes existentes em uma instância central do prisma e é filtrado através do parâmetro name para recuperar apenas detalhes de uma VLAN específica.

---
- name: test-get-subnet-info
  hosts: localhost

  vars:
    nutanix_host: "{{ XXXXXXX }}"
    nutanix_username: "{{ XXXXXXX }}"
    nutanix_password: "XXXXXXX "

  collections:
    - nutanix.ncp
  module_defaults:
    group/nutanix.ncp.ntnx:
      nutanix_host: "{{ XXXXXXX }}"
      nutanix_username: "{{ XXXXXXX }}"
      nutanix_password: "XXXXXXX "

  tasks:
  - name: Retrieve subnet info
    ntnx_subnets_info:
      filter:
        name: "my-VLAN"

Em um servidor Debian 11, esta tarefa funciona perfeitamente, como você pode ver abaixoinsira a descrição da imagem aqui

Considerando que no meu AWX EE personalizado (testado com o docker e depois no K8s), recebi o seguinte erro que não é muito explícitoFailed to convert API response to json
insira a descrição da imagem aqui

Etapas de solução de problemas:

  • tente fazer o downgrade da coleção nutanix.ncp de 1.9.0 para 1.8.0 e 1.7.0 => ainda os mesmos resultados (funciona no debian, não no docker)
  • compare a versão ansible => ambos os ambientes são executados no núcleo ansible 2.15.4
  • compare a versão python => o ambiente de imagem do docker está em 3.9.17 e o servidor debian em 3.9.2
  • iniciar solicitações curl manuais de ambos os ambientes => tudo funciona em ambos os ambientes
  • inicie o playbook com a opção -vvvvvv e compare as diferenças no log => nutanix.ncp não é tão falador, não recebo nenhum outro erro como você pode ver na imagem abaixo.

Questões

  • Existe uma maneira de "analisar" solicitações de API Ansible? como um wireshark/fiddler para Ansible?
  • como posso prosseguir para solucionar e corrigir esse problema? como funciona de um lado, mas não dos outros, posso comparar algumas coisas e espero encontrar uma diferença?

Obrigado

docker
  • 1 respostas
  • 32 Views
Martin Hope
motorbass
Asked: 2023-09-12 22:29:04 +0800 CST

Erro AWX X509 usando imagem EE personalizada com pyopenssl

  • 6

Atualmente, estou configurando uma plataforma AWX hospedada no cluster K8s para obter recursos de UI + adequados para fins multiusuários.

Contexto:
criei uma imagem EE enviada em um repositório Nexus que o AWX usa para ter todas as coleções de galáxias ansible que os projetos Ansible precisam (nutanix.ncp, community.hashi_vault, community.windows e ansible.windows) + módulos pip (ansible -pylibssh, hvac, paramiko, pexpect, pykerberos, pywinrm, criptografia, pyopenssl).

A criação de imagens EE e push/pull estão ok. Se necessário, posso compartilhar os arquivos requisitos.yml e requisitos.txt.

Aqui está o execução-environment.yml para referência:

---
version: 1

build_arg_defaults:
  EE_BASE_IMAGE: 'quay.io/ansible/awx-ee:latest'

dependencies:
  galaxy: requirements.yml
  python: requirements.txt

additional_build_steps:
  prepend: |
    RUN python3 -m pip install --upgrade pip
    RUN pip3 install --upgrade pip setuptools
    RUN whoami
    RUN cat /etc/os-release

  append:
  - RUN ls -la /etc

Então, quando configuro um projeto no AWX usando esta imagem EE, ele falha no erro X509_V_FLAG_CB_ISSUER_CHECK:

{
  "module_stdout": "",
  "module_stderr": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.nutanix.ncp.plugins.modules.ntnx_subnets_info', init_globals=dict(_module_fqn='ansible_collections.nutanix.ncp.plugins.modules.ntnx_subnets_info', _modlib_path=modlib_path),\n  File \"/usr/lib64/python3.8/runpy.py\", line 207, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.8/runpy.py\", line 97, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.8/runpy.py\", line 87, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/modules/ntnx_subnets_info.py\", line 188, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/subnets.py\", line 9, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/clusters.py\", line 7, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/prism.py\", line 5, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/entity.py\", line 13, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible/module_utils/urls.py\", line 115, in <module>\n  File \"/usr/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py\", line 46, in <module>\n    import OpenSSL.SSL\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/__init__.py\", line 8, in <module>\n    from OpenSSL import crypto, SSL\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/crypto.py\", line 1517, in <module>\n    class X509StoreFlags(object):\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/crypto.py\", line 1537, in X509StoreFlags\n    CB_ISSUER_CHECK = _lib.X509_V_FLAG_CB_ISSUER_CHECK\nAttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'\n",
  "exception": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 107, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 99, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-tmp-1694504214.889407-61-240849331705059/AnsiballZ_ntnx_subnets_info.py\", line 47, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.nutanix.ncp.plugins.modules.ntnx_subnets_info', init_globals=dict(_module_fqn='ansible_collections.nutanix.ncp.plugins.modules.ntnx_subnets_info', _modlib_path=modlib_path),\n  File \"/usr/lib64/python3.8/runpy.py\", line 207, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.8/runpy.py\", line 97, in _run_module_code\n    _run_code(code, mod_globals, init_globals,\n  File \"/usr/lib64/python3.8/runpy.py\", line 87, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/modules/ntnx_subnets_info.py\", line 188, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/subnets.py\", line 9, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/clusters.py\", line 7, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/prism/prism.py\", line 5, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible_collections/nutanix/ncp/plugins/module_utils/entity.py\", line 13, in <module>\n  File \"<frozen importlib._bootstrap>\", line 991, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 975, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 655, in _load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 618, in _load_backward_compatible\n  File \"<frozen zipimport>\", line 259, in load_module\n  File \"/tmp/ansible_ntnx_subnets_info_payload_mpaf5bgi/ansible_ntnx_subnets_info_payload.zip/ansible/module_utils/urls.py\", line 115, in <module>\n  File \"/usr/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py\", line 46, in <module>\n    import OpenSSL.SSL\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/__init__.py\", line 8, in <module>\n    from OpenSSL import crypto, SSL\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/crypto.py\", line 1517, in <module>\n    class X509StoreFlags(object):\n  File \"/usr/local/lib/python3.8/site-packages/OpenSSL/crypto.py\", line 1537, in X509StoreFlags\n    CB_ISSUER_CHECK = _lib.X509_V_FLAG_CB_ISSUER_CHECK\nAttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'\n",
  "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
  "rc": 1,
  "_ansible_no_log": false,
  "changed": false
}

Testes: Tentei os seguintes testes para tentar resolver:

  • obtenha a versão mais recente de criptografia e pyopenssl
  • faça downgrade da criptografia para 36.0.2/37.0.0 e da versão pyopenssl para 22.0.0, conforme visto em algumas postagens do stackoverflow
  • EXECUTAR atualização pip3 no bloco adicional_build_steps > prepend na criação da imagem

Além disso, há algo que não entendo:
vi que o log de erros menciona o arquivo.\"/usr/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py Mas quando executo um shell, a imagem do docker não há pasta /usr/lib/python3.8, mas python3.9.

Perguntas: Quando faço login nos pods AWX, descobri que apenas o pod awx-operator-controller-manager que obteve esse caminho python3.8. Então, qual é a relação entre pods AWX/imagem EE ao tentar executar um projeto?

Sobre o pyopenssl, que outros testes/soluções posso testar?

Obrigado !

ansible
  • 1 respostas
  • 29 Views
Martin Hope
motorbass
Asked: 2023-06-29 23:40:06 +0800 CST

Atualizar JSON Payload usando Powershell e Nutanix API

  • 6

No momento, estou escrevendo um script que permite atualizar as categorias de VM do Nutanix. O formato das categorias é chave:valor e uma VM pode não ter categorias, 1 ou múltiplas.

O processo para fazer isso é bastante simples: primeiro eu crio uma solicitação para obter informações de uma VM existente (GET) (depois recupero seu UUID).

Em uma segunda vez, crio outra solicitação para atualizar uma VM existente (PUT) usando o UUID recuperado anteriormente e alterando o que preciso alterar (atualizar categoria, mas deve adicionar discos, nic etc ...)

No momento, a solicitação para obter a VM é simples e funciona sem problemas, mas tive um problema enquanto precisava usar a segunda solicitação para atualizar a VM. Aqui estamos :

A carga útil usada para esta solicitação se parece com isso em JSON

{
  "spec": {
    "cluster_reference": {
      "kind": "cluster",
      "name": "my_cluster",
      "uuid": "0004f63d-6664-35ce-0126-88e9a456d3fc"
    },
    "name": "test-vm",
    "resources": {
      "num_threads_per_core": 1,
      "vnuma_config": {
        "num_vnuma_nodes": 0
      },
      "serial_port_list": [],
      "nic_list": [
        {
          "nic_type": "NORMAL_NIC",
          "uuid": "334e302a-db6a-48fb-b138-c3e3b2f1d8f6",
          "ip_endpoint_list": [
            {
              "ip": "10.230.172.84",
              "type": "ASSIGNED"
            }
          ],
          "vlan_mode": "ACCESS",
          "mac_address": "50:6b:8d:c5:6c:f0",
          "subnet_reference": {
            "kind": "subnet",
            "name": "vlanXXX",
            "uuid": "6de66666-05ec-46ac-6666-aea60e8e831f"
          },
          "is_connected": true,
          "trunked_vlan_list": []
        }
      ],
      "num_vcpus_per_socket": 1,
      "num_sockets": 1,
      "gpu_list": [],
      "is_agent_vm": false,
      "memory_size_mib": 4096,
      "boot_config": {
        "boot_device_order_list": [
          "CDROM",
          "DISK",
          "NETWORK"
        ],
        "boot_type": "LEGACY"
      },
      "hardware_clock_timezone": "UTC",
      "power_state_mechanism": {
        "guest_transition_config": {
          "should_fail_on_script_failure": false,
          "enable_script_exec": false
        },
        "mechanism": "HARD"
      },
      "power_state": "ON",
      "machine_type": "PC",
      "vga_console_enabled": true,
      "memory_overcommit_enabled": false,
      "disk_list": [
        {
          "uuid": "6f6ad0ba-5b81-487d-8c7b-6c5249a51f4b",
          "disk_size_bytes": 48318382080,
          "storage_config": {
            "storage_container_reference": {
              "kind": "storage_container",
              "uuid": "13611573-1364-4065-a03d-67a7da51c14d",
              "name": "SelfServiceContainer"
            }
          },
          "device_properties": {
            "disk_address": {
              "device_index": 0,
              "adapter_type": "SCSI"
            },
            "device_type": "DISK"
          },
          "data_source_reference": {
            "kind": "image",
            "uuid": "50a186ef-2538-43f3-9d6c-9150dd464ad7"
          },
          "disk_size_mib": 46080
        }
      ]
    },
    "description": "test sync categorie"
  },
  "api_version": "3.1",
  "metadata": {
    "last_update_time": "2023-06-29T14:25:48Z",
    "kind": "vm",
    "uuid": "6e1b8781-8a2a-4830-a15a-0af30daccf89",
    "project_reference": {
      "kind": "project",
      "name": "_internal",
      "uuid": "706f34c2-98be-4034-92e2-859be84040f3"
    },
    "creation_time": "2023-06-29T14:25:48Z",
    "spec_version": 3,
    "categories_mapping": {
      "AppType": [
        "Exchange"
      ],
      "AppTier": [
        "Default"
      ]
    },
    "entity_version": "2",
    "owner_reference": {
      "kind": "user",
      "name": "OWNER",
      "uuid": "6caba9b0-00a9-57ea-8ba0-10162c0b1dd4"
    },
    "categories": {
      "AppType": "Exchange",
      "AppTier": "Default"
    }
  }
}

E fique assim depois de convertido no Powershell (Nota: estamos interessados ​​apenas nos metadados, você verá o porquê)

PS C:\Users\XXX> $payload.metadata

last_update_time   : 29/06/2023 14:25:48
kind               : vm
uuid               : 6e1b8781-8a2a-4830-a15a-0af30daccf89
project_reference  : @{kind=project; name=_internal; uuid=706f34c2-98be-4034-92e2-859be84040f3}
creation_time      : 29/06/2023 14:25:48
spec_version       : 3
categories_mapping : @{AppType=System.Object[]; AppTier=System.Object[]}
entity_version     : 2
owner_reference    : @{kind=user; name=owner; uuid=6caba9b0-00a9-57ea-8ba0-10162c0b1dd4}
categories         : @{AppType=Exchange; AppTier=Default}


PS C:\Users\XXX> $payload.metadata.categories

AppType  AppTier
-------  -------
Exchange Default

Como você pode ver de uma perspectiva PS, $payloade suas propriedades são PSCustomObject, então não posso usar métodos como .Add(), .Remove()etc...+=

No momento, posso atualizar uma VM manualmente usando a carga útil JSON original, adicionar categoria manualmente no formato JSON e testá-la por meio do Postman. Funciona muito bem.

O problema é que, como você deve ter entendido, tenho que manter toda a carga útil original do método GET> conseguir adicionar uma nova categoria> enviar uma solicitação PUT para atualizá-la totalmente sem erros.

Minha pergunta é: do ponto de vista do PS, como posso criar e adicionar facilmente um novo objeto chave:valor e adicioná-lo adequadamente nas categorias, mantendo o existente? (= como inserir um novo valor dentro de "categories": { "AppType": "Exchange", "AppTier": "Default" } )

PS: para referências, aqui está o Web Request que uso para GET/PUT dentro do PS. A solicitação PUT está funcionando, mas não faz nada, exceto PUT o mesmo valor do original:

#### -- HEADER
$Header_Prism = @{
    'Accept' = 'application/json'
    'Content-Type' = 'application/json'
    'Authorization' = $basicAuthValue
}

#### --- GET VM
$get_vm = Invoke-RestMethod -Uri "https://mynutanix.net/vms/6e1b8781-6666-4830-a15a-0af30daccf89"  `
-Method GET `
-Headers $Header_Prism


### --- PUT VM
$payload = $get_vm | select spec,api_version,metadata | convertTo-Json -depth 100


$put_vm = Invoke-RestMethod -Uri "https://mynutanix.net/vms/6e1b8781-6666-4830-a15a-0af30daccf89"  `
-Method PUT `
-Headers $Header_Prism `
-Body $payload

powershell
  • 1 respostas
  • 28 Views
Martin Hope
motorbass
Asked: 2023-06-01 21:41:15 +0800 CST

Diferenças entre sfdisk e fdisk na extensão de disco LVM

  • 6

Para semi-automatizar partições LVM estendidas em clones de VMs Debian 11 a partir de um modelo, sinto-me um pouco travado quando tento fazer o script em comparação sfdiskcom arquivos fdisk.

  1. Aqui está o particionamento original
root# sudo fdisk /dev/sda

Commande (m pour l'aide) : p
Disque /dev/sda : 45 GiB, 48318382080 octets, 94371840 secteurs
Modèle de disque : VDISK
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 1048576 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x919d40af

Périphérique Amorçage    Début      Fin Secteurs Taille Id Type
/dev/sda1    *            2048  2000895  1998848   976M 83 Linux
/dev/sda2              2000896 86962175 84961280  40,5G 8e LVM Linux
/dev/sda3             86964222 94369791  7405570   3,5G  5 Étendue
/dev/sda5             86964224 94369791  7405568   3,5G 83 Linux
  1. Realizo as seguintes tarefas através do fdisk para estender os VGs do LVM: Nota: sda3 e sda5 não são usados, é por isso que os excluo.
  • excluir partição 5: "d", 5
  • excluir partição 3: "d", 3
  • excluir partição 2: "d", 2
  • crie uma nova parte estendida 2 com setores de início/fim padrão e o tipo é LVM: "n", "e", "2", "t", "lvm"

o resultado é :

Commande (m pour l'aide) : p
Disque /dev/sda : 45 GiB, 48318382080 octets, 94371840 secteurs
Modèle de disque : VDISK
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 1048576 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x919d40af

Périphérique Amorçage   Début      Fin Secteurs Taille Id Type
/dev/sda1    *           2048  2000895  1998848   976M 83 Linux
/dev/sda2             2000896 94371839 92370944    44G 8e LVM Linux

Em seguida, depois que um disco VM crescer de 45 => 60 GB, posso atualizar sda2 comsudo pvresize /dev/sda2

Em seguida, estenda os VGs do meu LVM comsudo lvextend -L +5G /dev/vg/my_vg_name

Finalmente, redimensione o sistema de arquivos com sudo resize2fs /dev/vg/my_vg_name e reinicie com sucesso.

  1. Eu quero fazer o script dessas ações (com requisitos de validação humana, com certeza), então minha primeira ideia foi ir com sfdisk. Antes de colocar o comando em um script, eu os testo manualmente, então farei:
  • excluir partição 5:sudo sfdisk /dev/sda 5 --delete --force --lock;
  • excluir partição 3:sudo sfdisk /dev/sda 3 --delete --force --lock;
  • excluir partição 2:sudo sfdisk /dev/sda 2 --delete --force --lock;
  • crie uma nova parte estendida 2 com setores de início/fim padrão e o tipo é LVM:
sudo sfdisk /dev/sda 2 --force --lock << EOF
,,V
write
EOF  

O resultado parece bom, o tamanho do sda2 aumentou de 45 para ~ 60 GB:

Disque /dev/sda : 60 GiB, 64424509440 octets, 125829120 secteurs
Modèle de disque : VDISK
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 4096 octets
taille d'E/S (minimale / optimale) : 4096 octets / 1048576 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x919d40af

Périphérique Amorçage   Début       Fin  Secteurs Taille Id Type
/dev/sda1    *           2048   2000895   1998848   976M 83 Linux
/dev/sda2             2000896 125829119 123828224    59G 8e LVM Linux

Agora vamos atualizar o sda2 e estender um VG e ele fica ruim:

root# sudo pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

root# sudo lvextend -L +5G /dev/vg/var
  Insufficient free space: 1280 extents needed, but only 0 available

Parece que a tabela de partição não está atualizada com o sfdisk, enquanto está com o fdisk.

É um comportamento "normal" do sfdisk ou perdi alguma coisa lá?

Além disso, se você tiver ideias mais fáceis ou algum conselho, sinta-se à vontade para dizer se for construtivo.

debian
  • 1 respostas
  • 35 Views
Martin Hope
motorbass
Asked: 2023-04-04 19:43:03 +0800 CST

Como analisar e filtrar valores dict no Ansible?

  • 7

Atualmente, estou trabalhando em um manual para criar um cluster K8s no Nutanix Prism Central. Tudo funciona sem problemas, mas enfrento um problema enquanto existe uma VLAN em um ou mais clusters.

No meu caso, uma VLAN é representada por seu nome, mas também por seu UUID (este pode ser recuperado em metadados em todos os índices dentro de entidades[]).

Como uma VLAN pode existir muitas vezes (porque está configurada em clusters diferentes), isso significa que o valor UUID pode diferir nos metadados {}, mas nunca no nome. Abaixo segue o resultado que obtive:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "error": null,
        "failed": false,
        "response": {
            "api_version": "3.1",
            "entities": [
                {
                    "metadata": {
                        "categories": {},
                        "categories_mapping": {},
                        "creation_time": "2023-03-08T10:11:44Z",
                        "kind": "subnet",
                        "last_update_time": "2023-03-08T10:11:44Z",
                        "spec_hash": "00000000000000000000000000000000000000000000000000",
                        "spec_version": 0,
                        "uuid": "aaaa-bbbb-cccc-dddddd"
                    },
                    "spec": {
                        "cluster_reference": {
                            "kind": "cluster",
                            "name": "Cluster02",
                            "uuid": "123123-123123-123123"
                        },
                        "name": "MY-VLAN",
                        "resources": {
                            "subnet_type": "VLAN",
                            "virtual_switch_uuid": "321-321-321-321-321",
                            "vlan_id": 66,
                            "vswitch_name": "br0"
                        }
                    },
                    "status": {
                        "cluster_reference": {
                            "kind": "cluster",
                            "name": "Cluster02",
                            "uuid": "123123-123123-123123"
                        },
                        "name": "MY-VLAN",
                        "resources": {
                            "ip_usage_stats": {
                                "num_macs": 0
                            },
                            "subnet_type": "VLAN",
                            "virtual_switch_uuid": "321-321-321-321-321",
                            "vlan_id": 66,
                            "vswitch_name": "br0"
                        },
                        "state": "COMPLETE"
                    }
                },
                {
                    "metadata": {
                        "categories": {},
                        "categories_mapping": {},
                        "creation_time": "2023-03-08T10:11:42Z",
                        "kind": "subnet",
                        "last_update_time": "2023-03-08T10:11:42Z",
                        "spec_hash": "00000000000000000000000000000000000000000000000000",
                        "spec_version": 0,
                        "uuid": "999-999-999-999-999"
                    },
                    "spec": {
                        "cluster_reference": {
                            "kind": "cluster",
                            "name": "Cluster01",
                            "uuid": "0005f64b-e395-8cc2-16af-88e9a456e31a"
                        },
                        "name": "MY-VLAN",
                        "resources": {
                            "subnet_type": "VLAN",
                            "virtual_switch_uuid": "d4f9ed4f-72c3-4ad0-8223-070fba6a9aea",
                            "vlan_id": 66,
                            "vswitch_name": "br0"
                        }
                    },
                    "status": {
                        "cluster_reference": {
                            "kind": "cluster",
                            "name": "Cluster01",
                            "uuid": "0005f64b-e395-8cc2-16af-88e9a456e31a"
                        },
                        "name": "MY-VLAN",
                        "resources": {
                            "ip_usage_stats": {
                                "num_macs": 0
                            },
                            "subnet_type": "VLAN",
                            "virtual_switch_uuid": "d4f9ed4f-72c3-4ad0-8223-070fba6a9aea",
                            "vlan_id": 66,
                            "vswitch_name": "br0"
                        },
                        "state": "COMPLETE"
                    }
                }
        }
    }
}

No momento, sei como recuperar manualmente o UUID se souber o número do índice com uma tarefa como:

  - name: Get Network
    ntnx_subnets_info:
      filter:
        #subnet_type: "VLAN"
        name: "MY-VLAN"
      kind: subnet
    register: result
    ignore_errors: True

  - name: output of identified network
    debug:
      msg: '{{ result.response.entities[0].metadata.uuid }}'

Mas atualmente não consigo obter o UUID em um cluster dedicado. Por exemplo, se eu precisar recuperar vlan uuid de Cluster01 , devo selecionar '{{ result.response.entities[1].metadata.uuid }}'

Alguém sabe se é possível recuperar um valor dinamicamente, com base em uma propriedade aninhada (no meu caso spec.cluster_reference.name)?

Muito obrigado !

ansible
  • 1 respostas
  • 70 Views
Martin Hope
motorbass
Asked: 2022-12-30 08:04:56 +0800 CST

Conselhos para automatizar a instalação do Debian 11

  • 5

No momento, estou tentando automatizar a criação do modelo Debian 11 por meio do ambiente Packer for Nutanix e preciso de alguns conselhos sobre como pré-configurar/automatizar a instalação do Debian.

Em primeiro lugar, depois de ler esta bíblia https://www.debian.org/releases/stable/amd64/apbs02.fr.html , comecei a usar o arquivo preseed.cfg. Comecei com o arquivo preseed.cfg fornecido pelo Debian e depois adaptei algumas coisas para atender às minhas necessidades. Por fim, valido a sintaxe usando debconf-set-selections -c preseed.cfgcomando => está tudo bem.

Agora, vi que existem 3 maneiras diferentes de usar o preseed.cfg :

  • através do initrd: parece bastante difícil para mim e não encontrei um tutorial/documentação fácil
  • pela rede: não é uma opção neste momento devido a alguma restrição de firewall
  • através do arquivo : parece a opção mais fácil e melhor no momento

Quando o Packer inicia a criação da VM, ele carrega o debian ISO como um CD-ROM na 1ª posição e um disco virtual vazio na segunda posição. Eu digo ao empacotador para carregar meus scripts preseed.cfg como um cd-rom, portanto, do ponto de vista do hipervisor, uma segunda unidade de cd-rom é montada na 3ª posição.

MAS, neste caso, a VM inicializa em ISO (cd-rom 1ª posição), ela não monta o segundo drive de cd-rom que contém o arquivo preseed.cfg e não consigo acessá-lo a menos que vá ao console debian em seguida, monte a segunda unidade.

Eu vi um fórum sobre como carregar preseed.cfg na minha pasta debian.iso original e modificar o arquivo /isolinux/txt.cfg assim (e então recriar o iso com OSCDIMG):

label install
    menu label ^Install
    kernel /install.amd/vmlinuz
    append vga=788 initrd=/install.amd/initrd.gz preseed/file=/cdrom/preseed/preseed.cfg --- quiet

Minha pergunta é: é justo agir assim? há algo que eu perdi ou algo mais fácil para fazê-lo funcionar facilmente?

EDIT: tentei o método initrd, a única coisa que resta é que tenho que selecionar manualmente a instalação automatizada. Como se livrar dessa ação?

EDIT2: 02-01-2023

  • eu tentei mais 2 coisas diferentes, 1º tendo esta linha em isolinux/txt.cfg append auto=true priority=critical vga=788 initrd=/install.amd/initrd.gz preseed/file=/cdrom/preseed.cfg --- quiet=> NOK, ele ainda inicializa no menu de inicialização (mas ok se eu selecionar a instalação automatizada manualmente, significa que preseed.cfg funciona muito bem)
  • e 2º, teste com prompt 1 timeout 1em isolinux.cfg => vai direto para selecionar o idioma manualmente...

EDIT3: 03-01-2023 aqui está o preseed.cfg que eu uso:

# SETUP AUTO MODE
d-i auto-install/enable boolean true
d-i debconf/priority select critical
# LANGUAGE & KEYMAP
d-i debian-installer/locale string fr_FR
d-i keyboard-configuration/xkb-keymap select fr(latin9)
# NETWORK
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string template-debian-11-x64
d-i netcfg/get_domain string my_domain.net
d-i netcfg/hostname string template-debian-11-x64
# MIRRORS
d-i mirror/http/hostname string  http://deb.debian.org/debian/ 
d-i mirror/http/hostname string http://security.debian.org/debian-security 
# ACCOUNTS
d-i passwd/root-password password mypassword!
d-i passwd/root-password-again password mypassword!
d-i passwd/user-fullname string user
d-i passwd/username string user
d-i passwd/user-password password mypassword!
d-i passwd/user-password-again password mypassword!
d-i passwd/user-uid string 1010
d-i passwd/user-default-groups string si audio cdrom video
# LVM PART
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string 95%
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select multi
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
#APT
d-i apt-setup/cdrom/set-first boolean false
tasksel tasksel/first multiselect standard, ssh-server
# GRUB
d-i grub-installer/bootdev string /dev/sda
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
#FINAL
d-i finish-install/reboot_in_progress note

Muito obrigado

Gael

debian
  • 2 respostas
  • 112 Views
Martin Hope
inframan
Asked: 2022-10-07 22:58:09 +0800 CST

Ansible tendo uma exceção não tratada ocorreu durante a modelagem com a função de pesquisa

  • 0

Atualmente estou construindo um playbook para testar se alguns arquivos conf existem e, em seguida, verificar o conteúdo. Os arquivos são os seguintes

  • /etc/resolv.conf - verifique se os servidores de nomes estão bem configurados
  • /etc/systemd/timesyncd.conf - verifica se algo foi configurado
  • /etc/ntp.conf - verifique também se algo foi configurado

O código .yml é o seguinte, como você pode ver, a tarefa é a mesma para todas as verificações, apenas reconfigurando o caminho do arquivo e a parte regex, se necessário.

  tasks:
    # RESOLV.CONF
    - name: Check if resolv.conf exist
      stat:
        path: /etc/resolv.conf
      register: resolv_conf

    - name: Retrieve nameservers
      debug:
        msg: "{{ contents }}"
      vars:
        contents: "{{ lookup('file', '/etc/resolv.conf') | regex_findall('\\s*nameserver\\s*(.*)') }}"
      when: resolv_conf.stat.exists == True

    # NTP.CONF
    - name: check if ntp.conf exists
      stat:
        path: /etc/ntp.conf
      register: ntp_conf

    - name: retrieve ntp conf server content
      debug:
        msg: "{{ contents }}"
      vars:
        contents: "{{ lookup('file', '/etc/ntp.conf') | regex_search('^server.*') }}"
      when: ntp_conf.stat.exists == True

    # TIMESYNC.CONF
    - name: check if timesyncd
      stat:
        path: /etc/systemd/timesyncd.conf 
      register: timesyncd_conf 

    - name: Affiche le contenu de timesyncd.conf s'il est configure
      debug:
        msg: "{{ contents }}"
      vars:
        contents: "{{ lookup('file', '/etc/systemd/timesyncd.conf') | regex_search('^NTP=.*') }}"
      when: timesyncd_conf.stat.exists == True

As tarefas estão funcionando bem, exceto aquela sobre a verificação de NTP.CONF que falha com o seguinte:

vendredi 07 octobre 2022  08:28:07 +0200 (0:00:00.509)       0:00:05.115 ******
[WARNING]: Unable to find '/etc/ntp.conf' in expected paths (use -vvvvv to see paths)
fatal: [my_server]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ lookup('file', '/etc/ntp.conf') | regex_search('^server.*') }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, original message: could not locate file in lookup: /etc/ntp.conf. could not locate file in lookup: /etc/ntp.conf"}

Eu não entendo por que ele falha, pois uso a mesma função, usuários e arquivos com os mesmos direitos são alguns outros em /etc/. Além disso, tentei rapidamente fazer o mesmo com "cat" e funciona:

 - name: check ntp.conf content  
      command: "cat /etc/ntp.conf"
      register: ntp_conf_contenu
    - debug:
        msg:
        - " {{ ntp_conf_contenu  | regex_findall ('server') }}"

Você tem alguma idéia de por que ele falha?

Muito obrigado !

ansible
  • 1 respostas
  • 51 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve