Skip to main content
Glama
infra-mdsystems

ansible-mcp-server

README.md
# Ansible NLP MCP

Servidor MCP local para permitir que o Codex interaja com este repositório Ansible por linguagem natural, usando ferramentas seguras em vez de expor um shell genérico.

## Ferramentas

- `health`: mostra raiz, timeout e se execução mutável está habilitada.
- `list_playbooks`: lista playbooks e workflows executáveis.
- `inspect_playbook`: resume plays, hosts, `vars_files`, tasks iniciais e variáveis obrigatórias comuns.
- `suggest_playbooks`: ranqueia playbooks a partir de um pedido em linguagem natural.
- `inventory_graph`: executa `ansible-inventory --graph`.
- `inventory_summary`: resume grupos e hosts do inventário.
- `syntax_check`: executa `ansible-playbook --syntax-check`.
- `check_playbook`: executa `ansible-playbook --check`.
- `run_playbook`: executa playbook real, bloqueado por padrão.
- `ping_hosts`: executa `ansible -m ping` ou `ansible.windows.win_ping`.
- `list_logs` e `tail_log`: consulta logs dentro de `logs/`.

## Instalação

```bash
cd /root/ansible
python3 -m venv .venv-mcp
. .venv-mcp/bin/activate
pip install -r ansible_mcp/requirements.txt
```

## Teste local

```bash
cd /root/ansible
. .venv-mcp/bin/activate
python -m ansible_mcp.server
```

Esse comando inicia um servidor MCP por stdio e fica aguardando um cliente MCP.

## Configuração no Codex

Exemplo para `.codex/config.toml` no projeto, ou para `~/.codex/config.toml` se quiser habilitar globalmente:

```toml
[mcp_servers.ansible]
command = "/root/ansible/.venv-mcp/bin/python"
args = ["/root/ansible/ansible_mcp/server.py"]
cwd = "/root/ansible"
enabled = true
startup_timeout_sec = 10
tool_timeout_sec = 900
env = { ANSIBLE_MCP_ROOT = "/root/ansible", ANSIBLE_MCP_ALLOW_RUN = "0" }
```

Com `ANSIBLE_MCP_ALLOW_RUN = "0"`, o MCP permite inspeção, inventário, ping, syntax-check e check-mode, mas bloqueia execução real de playbooks.

Para permitir execução mutável:

```toml
[mcp_servers.ansible]
command = "/root/ansible/.venv-mcp/bin/python"
args = ["/root/ansible/ansible_mcp/server.py"]
cwd = "/root/ansible"
enabled = true
startup_timeout_sec = 10
tool_timeout_sec = 900
env = { ANSIBLE_MCP_ROOT = "/root/ansible", ANSIBLE_MCP_ALLOW_RUN = "1" }
```

Mesmo habilitado, `run_playbook` ainda exige `confirm = "RUN"` na chamada da ferramenta.

## Exemplos de intenção NLP

- "Qual playbook eu uso para atualizar Windows do wuday1?"
- "Faça syntax-check do playbook de Windows Update com `day=wuday1`."
- "Rode em check mode a atualização Linux só no grupo rocky."
- "Mostre os últimos logs do Citrix Day."
- "Liste os grupos de inventário e quantos hosts existem em cada um."