Vimos como o Steampipe pode unificar o acesso a APIs, conduzir metapesquisa, aplicar KPIs como código e detectar desvios de configuração. Os plug-ins de ativação estavam, até recentemente, fortemente vinculados ao binário Steampipe e à instância do Postgres que o Steampipe inicia e controla. Isso levou os membros da comunidade de código aberto do Steampipe a perguntar: “Podemos usar os plug-ins em nossos próprios bancos de dados Postgres?” Agora a resposta é sim – e muito mais. Mas vamos nos concentrar primeiro no Postgres.

Usando um plugin Steampipe como wrapper de dados externos do Postgres

Visite os downloads do Steampipe para encontrar o instalador para o seu sistema operacional e execute-o para adquirir a distribuição Postgres Foreign Data Wrapper (FDW) de um plug-in – neste caso, o plug-in GitHub.

$ sudo /bin/sh -c "$(curl -fsSL https://steampipe.io/install/postgres.sh)"
Enter the plugin name: github
Enter the version (latest): 

Discovered:
- PostgreSQL version:   14
- PostgreSQL location:  /usr/lib/postgresql/14
- Operating system:     Linux
- System architecture:  x86_64

Based on the above, steampipe_postgres_github.pg14.linux_amd64.tar.gz will be downloaded, extracted and installed at: /usr/lib/postgresql/14

Proceed with installing Steampipe PostgreSQL FDW for version 14 at /usr/lib/postgresql/14?
- Press 'y' to continue with the current version.
- Press 'n' to customize your PostgreSQL installation directory and select a different version. (Y/n): 

Downloading steampipe_postgres_github.pg14.linux_amd64.tar.gz...
########################################################################################### 100.0%
steampipe_postgres_github.pg14.linux_amd64/
steampipe_postgres_github.pg14.linux_amd64/steampipe_postgres_github.so
steampipe_postgres_github.pg14.linux_amd64/steampipe_postgres_github.control
steampipe_postgres_github.pg14.linux_amd64/steampipe_postgres_github--1.0.sql
steampipe_postgres_github.pg14.linux_amd64/install.sh
steampipe_postgres_github.pg14.linux_amd64/README.md

Download and extraction completed.

Installing steampipe_postgres_github in /usr/lib/postgresql/14...

Successfully installed steampipe_postgres_github extension!

Files have been copied to:
- Library directory: /usr/lib/postgresql/14/lib
- Extension directory: /usr/share/postgresql/14/extension/  

Agora conecte-se ao seu servidor normalmente, usando psql ou outro cliente, normalmente como o postgres do utilizador. Em seguida, execute estes comandos que são típicos de qualquer wrapper de dados externos do Postgres. Tal como acontece com todas as extensões do Postgres, você começa assim:

CREATE EXTENSION steampipe_postgres_fdw_github;

Para usar um wrapper de dados externo, primeiro crie um servidor:

CREATE SERVER steampipe_github FOREIGN DATA WRAPPER steampipe_postgres_github OPTIONS (config 'token="ghp_..."');

Use OPTIONS para configurar a extensão para usar seu token de acesso GitHub. (Como alternativa, as variáveis ​​de ambiente padrão usadas para configurar um plugin Steampipe — são apenas GITHUB_TOKEN neste caso, funcionará se você defini-los antes de iniciar sua instância do Postgres.)

As tabelas fornecidas pela extensão residirão em um esquema, então defina um:

CREATE SCHEMA github;

Agora importe o esquema definido pelo servidor externo para o esquema local que você acabou de criar:

IMPORT FOREIGN SCHEMA github FROM SERVER steampipe_github INTO github;

Agora execute uma consulta!

As tabelas estrangeiras fornecidas pela extensão residem no github schemaentão, por padrão, você se referirá a tabelas como github.github_my_repository. Se você set search_path="github"porém, o esquema se torna opcional e você pode escrever consultas usando nomes de tabelas não qualificados.

select
  count(*)
from
  github_my_repository;

 count
-------
   468

Se você tiver muitos repositórios, a primeira execução dessa consulta levará alguns segundos. A segunda execução retornará resultados instantaneamente, porque a extensão inclui um cache poderoso e sofisticado.

E isso é tudo! Cada plugin Steampipe agora também é um wrapper de dados externo que funciona exatamente como este. Você pode carregar várias extensões para ingressar em APIs. É claro que você pode unir qualquer uma dessas tabelas estrangeiras de origem API com suas próprias tabelas Postgres. E para salvar os resultados de qualquer consulta, você pode acrescentar create table NAME as ou create materialized view NAME as a uma consulta para persistir os resultados como uma tabela ou visualização.

Usando um plugin Steampipe como extensão SQLite que fornece tabelas virtuais

Visite os downloads do Steampipe para encontrar o instalador do seu sistema operacional e execute-o para adquirir a distribuição SQLite do mesmo plugin.

$ sudo /bin/sh -c "$(curl -fsSL https://steampipe.io/install/sqlite.sh)"
Enter the plugin name: github
Enter version (latest): 
Enter location (current directory): 

Downloading steampipe_sqlite_github.linux_amd64.tar.gz...
############################################################################ 100.0%
steampipe_sqlite_github.so

steampipe_sqlite_github.linux_amd64.tar.gz downloaded and extracted successfully at /home/jon/steampipe-sqlite.

Aqui está a configuração. Você pode colocar esse código em ~/.sqliterc se você quiser executá-lo toda vez que iniciar sqlite.

.load /home/jon/steampipe-sqlite/steampipe_sqlite_github.so

select steampipe_configure_github('
  token="ghp_..."
');

Agora você pode executar a mesma consulta acima.

sqlite> select count(*) from github_my_repository;
count(*)
468  

E quanto às diferenças entre SQL com sabor de Postgres e SQL com sabor de SQLite? O hub Steampipe é seu amigo! Por exemplo, aqui estão variantes de uma consulta que acessa um campo dentro de uma coluna JSON para tabular os idiomas associados aos seus gists.

Aqui também você pode carregar várias extensões para ingressar nas APIs. Você pode unir qualquer uma dessas tabelas estrangeiras de origem API com suas próprias tabelas SQLite. E você pode preceder create table NAME as a uma consulta para persistir os resultados como uma tabela.

Usando um plugin Steampipe como ferramenta de exportação independente

Visite os downloads do Steampipe para encontrar o instalador do seu sistema operacional e execute-o para adquirir a distribuição de exportação de um plugin. Novamente, ilustraremos o uso do plugin GitHub.

$ sudo /bin/sh -c "$(curl -fsSL https://steampipe.io/install/export.sh)"
Enter the plugin name: github
Enter the version (latest): 
Enter location (/usr/local/bin): 
Created temporary directory at /tmp/tmp.48QsUo6CLF.

Downloading steampipe_export_github.linux_amd64.tar.gz...
############################################################################## 100.0%
Deflating downloaded archive
steampipe_export_github
Installing
Applying necessary permissions
Removing downloaded archive
steampipe_export_github was installed successfully to /usr/local/bin
$ steampipe_export_github -h
Export data using the github plugin.

Find detailed usage information including table names, column names, and 
examples at the Steampipe Hub: https://hub.steampipe.io/plugins/turbot/github

Usage:
  steampipe_export_github TABLE_NAME (flags)

Flags:
      --config string       Config file data
  -h, --help                help for steampipe_export_github
      --limit int           Limit data
      --output string       Output format: csv, json or jsonl (default "csv")
      --select strings      Column data to display
      --where stringArray   where clause data

Não há mecanismo SQL na imagem aqui; esta ferramenta é puramente um exportador. Para exportar todos os seus gists para um arquivo JSON:

steampipe_export_github github_my_gist --output json > gists.json

Para selecionar apenas algumas colunas e exportar para um arquivo CSV:

steampipe_export_github github_my_gist --output csv --select "description,created_at,html_url" > gists.csv

Você pode usar --limit para limitar as linhas retornadas e --where para filtrá-los, mas principalmente você usará essa ferramenta para obter dados de maneira rápida e fácil que você massageará em outro lugar, por exemplo, em uma planilha.

Explore o ecossistema de plugins Steampipe

Os plug-ins do Steampipe não são apenas interfaces brutas para APIs subjacentes. Eles usam tabelas para modelar essas APIs de maneiras úteis. Por exemplo, o github_my_repository tabela exemplifica um padrão de design que se aplica consistentemente em todo o conjunto de plug-ins. Na documentação do plugin GitHub:

Você pode possuir repositórios individualmente ou compartilhar a propriedade dos repositórios com outras pessoas em uma organização. O github_my_repository tabela listará repositórios que você possui, nos quais colabora ou que pertencem às suas organizações. Para consultar QUALQUER repositório, incluindo repositórios públicos, use o github_repository mesa.

Outros plugins seguem o mesmo padrão. Por exemplo, o plug-in do Microsoft 365 fornece ambos microsoft_my_mail_message e microsoft_mail_messagee o plug-in do Google Workspace fornece googleworkspace_my_gmail_message e googleworkspace_gmail. Sempre que possível, os plug-ins consolidam as visualizações dos recursos da perspectiva de um usuário autenticado.

Embora os plug-ins normalmente forneçam tabelas com esquemas fixos, nem sempre é esse o caso. Esquemas dinâmicos, implementados pelos plug-ins Airtable, CSV, Kubernetes e Salesforce (entre outros), são outro padrão importante. Aqui está um exemplo de CSV usando um Postgres FDW independente.

IMPORT FOREIGN SCHEMA csv FROM SERVER steampipe_csv INTO csv OPTIONS(config 'paths=("/home/jon/csv")');

Agora todos os .csv arquivos em /home/jon/csv serão automaticamente tabelas estrangeiras do Postgres. Suponha que você acompanhe os proprietários válidos de instâncias do EC2 em um arquivo chamado ec2_owner_tags. Aqui está uma consulta na tabela correspondente.

select * from csv.ec2_owner_tags;
     owner      |            _ctx
----------------+----------------------------
 Pam Beesly     | {"connection_name": "csv"}
 Dwight Schrute | {"connection_name": "csv"}

Você poderia juntar-se a essa tabela com o plugin AWS aws_ec2_instance tabela para relatar tags de proprietário em instâncias EC2 que estão (ou não) listadas no arquivo CSV.

select 
    ec2.owner,
    case 
        when csv.owner is null then 'false'
        else 'true'
    end as is_listed
from 
    (select distinct tags ->> 'owner' as owner from aws.aws_ec2_instance) ec2
left join 
    csv.ec2_owner_tags csv on ec2.owner = csv.owner;
     owner      | is_listed
----------------+-----------
 Dwight Schrute | true
 Michael Scott  | false

Em todo o conjunto de plug-ins, há mais de 2.300 tabelas de esquema fixo predefinidas que você pode usar dessas formas, além de um número ilimitado de tabelas dinâmicas. E novos plugins são constantemente adicionados pelo Turbot e pela comunidade de código aberto do Steampipe. Você pode acessar esse ecossistema usando Steampipe ou Turbot Pipes, de seu próprio banco de dados Postgres ou SQLite ou diretamente da linha de comando.