O Garden of Eden é um projeto Shell Script para provisionamento básico de um ambiente de desenvolvimento para uma distribuição Ubuntu Desktop, podendo ser ampliado para distribuições Fedora, openSUSE, Arch Linux, Red Hat Enterprise Linux e as demais distribuição disponíveis.
O Garden of Eden provisiona os seguentes recursos:
- Gerar chave SSH
- Instala o Git
- Instala o JDK
- Instala o .NET Core SDK
- Instala o Pyenv (Python Version Manager)
- Instala o NVM (Node Version Manager)
- Instala o Node.js usando NVM
- Instala o RVM (Ruby Version Manager)
- Instala o Ruby usando RVM
- Instala o Go
- Instala o Ansible
- Instala o Docker
- Instala o Docker Compose
- Instala o Docker Machine
- Instala o VirtualBox
- Instala o Vagrant
- Instala o Packer
- Instala o Terraform
- Instala o VS Code
- Instala o GitKraken
- Instala o StarUML
- Instala o NetBeans
- Instala o Postman
- Instala o Insomnia Core
- Instala o Chrome
- Instala o Hyper
Nota:
1) Este projeto foi TESTADO no Ubuntu 17.10 (Artful Aardvark), Ubuntu 18.10 (Cosmic Cuttlefish), Ubuntu 19.04 (Disco Dingo) e Ubuntu 20.04 LTS (Focal Fossa) e o provisionamento levou aproximadamente 33 minutos por conta da internet discada da "NET...".
2) O intuito do projeto Garden of Eden é acadêmico, ou seja, para fins de conhecimento prático, não sou um profissional linux, qualquer opinião, sugestão, será bem vinda.
3) A maior parte do conhecimento obtido para se desenvolver esse projeto foi a traveis do canal do YouTube "Bóson Treinamentos - Shell Scripting - Programação no Linux", fico inteiramente grato por todas as informações obtida por esse canal.
A estrutura base do projeto consiste em um arquivo "settings-*.json", esse arquivo json defini os modulos de scripts shell a ser executados, a distribuição linux a ser usada, e entre outras definições. Um exemplo do arquivo "settings-you-file.json":
{
"settings": [
{
"module": "example",
"description": "Executar um exemplo de como usar um script no padrão do (Garden Of Eden)",
"active": true,
"logsPath": "./logs/dist-ubuntu/personalize",
"scriptsPath": "./shell-script/dist-ubuntu/personalize",
"scripts": [
{ "script": "script-example.sh", "action": "print-version", "execute": true,
"param": { "version": "3.6.66" }
}
...mais scripts...
]
},
...outros modulos de scripts...
]
}
Logo abaixo o arquivo json a ser usado como padrão do ambiente de desenvolvimento do Garden of Eden
Nota:
Lembre-se de alterar os valores correspondente aos parâmetros dos scripts, para a sua realidade.
Arquivo principal do ambiente padrão: settings-environment.json
{
"settings": [
{
"module": "environment-default",
"description": "Provisionar ambiente básico de desenvolvimento do (Garden Of Eden)",
"active": true,
"logsPath": "./logs/dist-ubuntu/environment",
"scriptsPath": "./shell-script/dist-ubuntu/environment",
"scripts": [
{ "script": "script-keyssh.sh", "action": "recreate", "execute": true,
"param": {
"comment": "Que reinaste o anjo caído!",
"nameKey": "id_rsa",
"pathKey": "/home/SeuUsuario/.ssh",
"passwordKey": ""
}
},
{ "script": "script-git.sh", "action": "install", "execute": true,
"param": { "name": "SeuUsuario", "email": "SeuUsuario@mail.com" }
},
{ "script": "script-open-jdk.sh", "action": "install", "execute": true,
"param": { "version": "11" }
},
{ "script": "script-dotnet-sdk.sh", "action": "install", "execute": true,
"param": { "version": "3.1" }
},
{ "script": "script-pyenv.sh", "action": "install", "execute": false,
"param": null
},
{ "script": "script-python2.sh", "action": "install", "execute": true,
"param": null
},
{ "script": "script-nvm.sh", "action": "install", "execute": true,
"param": { "version": "0.35.3" }
},
{ "script": "script-nodejs.sh", "action": "install-by-nvm", "execute": true,
"param": { "version": "12.16.2" }
},
{ "script": "script-rvm.sh", "action": "install", "execute": false,
"param": null
},
{ "script": "script-ruby.sh", "action": "install-by-rvm", "execute": false,
"param": { "version": "2.5.5" }
},
{ "script": "script-golang.sh", "action": "install", "execute": true,
"param": { "version": "1.14.2" }
},
{ "script": "script-cfssl.sh", "action": "install", "execute": true,
"param": { "version": "1.4.1" }
},
{ "script": "script-ansible.sh", "action": "install", "execute": true,
"param": null
},
{ "script": "script-virtualbox.sh", "action": "install", "execute": true,
"param": { "version": "5.2.40", "tagVersion": "5.2.40-137108" }
},
{ "script": "script-docker.sh", "action": "install", "execute": true,
"param": { "version": "19.03.8" }
},
{ "script": "script-docker-compose.sh", "action": "install", "execute": true,
"param": { "version": "1.25.5" }
},
{ "script": "script-docker-machine.sh", "action": "install", "execute": true,
"param": { "version": "0.16.2" },
"warning": "Contains dependency on VirtualBox"
},
{ "script": "script-vagrant.sh", "action": "install", "execute": true,
"param": { "version": "2.2.7" },
"warning": "Contains dependency on VirtualBox"
},
{ "script": "script-packer.sh", "action": "install", "execute": true,
"param": { "version": "1.5.5" }
},
{ "script": "script-terraform.sh", "action": "install", "execute": true,
"param": { "version": "0.12.24" }
},
{ "script": "script-vscode.sh", "action": "install", "execute": true,
"param": null
},
{ "script": "script-gitkraken.sh", "action": "install", "execute": false,
"param": null
},
{ "script": "script-staruml.sh", "action": "install", "execute": true,
"param": { "version": "3.2.2" }
},
{ "script": "script-netbeans.sh", "action": "install", "execute": false,
"param": null
},
{ "script": "script-postman.sh", "action": "install", "execute": true,
"param": null
},
{ "script": "script-insomnia-core.sh", "action": "install", "execute": true,
"param": { "version": "7.1.1" }
},
{ "script": "script-chrome.sh", "action": "install", "execute": true,
"param": null
},
{ "script": "script-hyper.sh", "action": "install", "execute": true,
"param": { "version": "3.0.2" }
}
]
}
]
}
No arquivo padrão do Garden of Eden "settings-environment.json" consiste de 6 parâmetros básicos (module, description, active, logsPath, scriptsPath, scripts) como mostra o exemplo acima:
- "module": define a nome/tipo do modulo a ser executado.
- "description": define a descrição do modulo.
- "active": define se o modulo vai ser executado, (true ou false), se for true esse modulo será executado.
- "logsPath": destina-se ao diretório onde vai ser gerado os logs do modulo.
- "scriptsPath": destina-se ao diretório base, de onde vai ser chamados os shell scripts a serem executados.
- "scripts": define uma lista de scripts para ser executados em ordem, cada item dessa lista contem 4 parâmetros padrão, que são(script, action, execute, param).
Os parâmetros do "scripts": [{...}, ...] do ultimo item citado acima, consiste em:
- "script": define o nome do Shell Script a ser executado.
- "action" define o tipo da ação que queira executar no Shell Script, essa ação é de acordo com Shell Script especificado.
- "execute": define se o script vai ser executado, (true ou false), se for true esse script será executado caso contrario ele não é executado.
- "param": define um json de (chave e valor), esse json será repassado para o Shell Script especifico para ser consumido na execução.
Abra terminal no seu linux e execute os comandos abaixo:
Terminal:
$ wget "https://github.com/alisonbuss/garden-of-eden/archive/master.zip" -O ~/Downloads/garden-of-eden-master.zip
$ unzip ~/Downloads/garden-of-eden-master.zip -d ~/Downloads/
$ cd ~/Downloads/garden-of-eden-master
$ ls -a
Pronto agora você pode executar o "Garden of Eden":
Através do arquivo:
- start-divine-creation.sh em modo CLI.
Nota: Antes de executar o Garden of Eden, certifique-se de ter ajustado os parâmetros do arquivo settings.json para sua realidade.
Terminal:
$ bash start-divine-creation.sh --help
Nota: Caso não seja passado o --setting-file='...' jundo com o parâmetro --list o Garden Of Eden ira setar o caminho padrão para './settings-environment.json'.
Terminal:
$ bash start-divine-creation.sh --list
Ou:
$ bash start-divine-creation.sh -l
Ou, setando o caminho padrão: --setting-file='./settings.json':
$ bash start-divine-creation.sh --setting-file='./settings-environment.json' --list
Ou, setando o caminho padrão: --setting-file='./settings.json' reduzido:
$ bash start-divine-creation.sh -s='./settings-environment.json' -l
Nota: Caso não seja passado o --setting-file='...' jundo com o parâmetro --run o Garden Of Eden ira setar o caminho padrão para './settings.json'.
Terminal:
$ bash start-divine-creation.sh --run
Ou:
$ bash start-divine-creation.sh -r
Ou, setando o caminho padrão: --setting-file='./settings.json':
$ bash start-divine-creation.sh --setting-file='./settings-environment.json' --run
Ou, setando o caminho padrão: --setting-file='./settings.json' reduzido:
$ bash start-divine-creation.sh -s='./settings-environment.json' -r
Terminal:
$ make help
# OU
$ make version
# OU
$ make list-environment
$ make run-environment
Descrição das pastas e arquivos do projeto:
.
├── binaries.................................'Pasta dos binários e downloads dos scripts executados.'
│ └── jq-linux64-v1.6
├── logs.....................................'Pasta onde se encontra os logs gerados pelo Garden Of Eden.'
│ └── start-divine-creation.sh.log
├── shell-script.............................'Pasta dos scripts a ser executados de uma determinada distribuição linux.'
│ ├── dist-ubuntu
│ │ ├── environment
│ │ │ ├── script-ansible.sh
│ │ | ├── script-cfssl.sh
│ │ │ ├── script-chrome.sh
│ │ │ ├── script-docker-compose.sh
│ │ │ ├── script-docker.sh
│ │ │ ├── script-gitkraken.sh
│ │ │ ├── script-git.sh
│ │ │ ├── script-golang.sh
│ │ │ ├── script-open-jdk.sh
│ │ │ ├── script-oracle-jdk.sh
│ │ │ ├── script-keyssh.sh
│ │ │ ├── script-netbeans.sh
│ │ │ ├── script-nodejs.sh
│ │ │ ├── script-nvm.sh
│ │ │ ├── script-packer.sh
│ │ │ ├── script-pyenv.sh
│ │ │ ├── script-ruby.sh
│ │ │ ├── script-rvm.sh
│ │ │ ├── script-staruml.sh
│ │ │ ├── script-terraform.sh
│ │ │ ├── script-vagrant.sh
│ │ │ ├── script-virtualbox.sh
│ │ │ ├── script-vscode.sh
│ │ │ └── ...
│ │ └── personalize
│ │ ├── script-brasero.sh
│ │ ├── script-example.sh
│ │ ├── script-gnomebaker.sh
│ │ ├── script-multimedia.sh
│ │ ├── script-psensor.sh
│ │ ├── script-repositories-git.sh
│ │ ├── script-themes.sh
│ │ ├── script-tools.sh
│ │ └── ...
│ └── tools
│ └── utility.sh
├── support-files............................'Pasta de apoio, onde se encontra os arquivos variados, como configurações, logo, wallpaper etc.'
│ ├── logo-garden-of-eden.png
| ├── configs
| │ ├── docker
| │ │ ├── containerd.service
| │ │ ├── docker.service
| │ │ └── docker.socket
| │ └── starship
| │ └── starship.toml
│ ├── files
│ │ ├── end-bender.gif
│ │ └── header.txt
│ └── wallpapers
│ ├── wallpaper01.jpg
│ └── ...
├── LICENSE..................................'Licença - MIT.'
├── Makefile.................................'Arquivo para reduzir/facilitar a forma de execução do projeto Garden of Eden via CLI.'
├── README.md................................'Descrição e documentação do projeto Garden of Eden.'
├── README-MY.md.............................'Descrição do meu ambiente personalizado/adicional do Garden of Eden.'
├── settings-environment.json................'Arquivo principal do projeto onde é definido a modularização dos scripts shell a serem executados.'
├── settings-personalize.json................'Arquivo secundário, para um ambiente alternativo a ser executado, baseado no modelo padrão do Garden of Eden.'
└── start-divine-creation.sh.................'Shell Script de inicialização do projeto em modo de CLI.'
Caso tu queiras criar um script de instalação de um programa do seu interesse, no próprio projeto tem um script de exemplo que você pode usar como base inicial, exemplo abaixo:
Diretório: ./shell-script/dist-ubuntu/personalize/script-example.sh
Nota:
Por padrão, os seguintes recursos serão disponibilizados para todos os scripts de shell, através ./start-divine-creation.sh:
1) Duas variáveis de ambientes [LOCAL_DIR, RUN_JQ].
2) Importe de utilitários shell ./shell-script/tools/utility.sh.
Arquivo:
#!/bin/bash
#-----------------------|DOCUMENTATION|-----------------------#
# @descr: Sua Descrição da Instalação na Maquina.
# @fonts: Fontes de referências
# @example:
#
# bash script-example.sh --action='print-version' --param='{"version":"3.6.66"}'
#
#-------------------------------------------------------------#
# @descr: Descrição da Função.
# @fonts: Fontes de referências
# @param:
# action | text: (install, uninstall)
# param | json: '{"version":"..."}'
function ScriptExample {
# @descr: Variavel que define a ação que o script ira realizar.
local ACTION=$(util.getParameterValue "(--action=|-a=)" "$@");
# @descr: Variavel de parametros JSON.
local PARAM_JSON=$(util.getParameterValue "(--param=|-p=)" "$@");
# @descr: Descrição da Variavel.
local version=$(echo "${PARAM_JSON}" | $RUN_JQ -r '.version');
# @descr: Descrição da Função.
# @fonts: Fontes de referências
# @param: Parametros (--aa='aaa', --bb='bbb')
__print_version() {
util.print.out '%s\n' "Iniciando o Teste do Example na maquina...";
util.print.out '%s\n' "--> Print Version: ${version}";
util.print.out '%s\n' "--> Print value: ${version}";
echo "Print value [LOCAL_DIR]: $LOCAL_DIR";
cat ./shell-script/tools/utility.sh;
}
# @descr: Função é chamada qndo a um erro de tipo de ação.
# @param:
# action | text: "..." | Action não encontrado.
__actionError() {
local actionErr=$(util.getParameterValue "(--action=|-a=)" "$@");
util.print.error "Erro: 'action' passado:(${actionErr}) não coincide com [install, uninstall]!";
return 1;
}
# @descr: Função principal "um construtor por exemplo".
__initialize() {
case ${ACTION} in
print-version) {
__print_version;
};;
*) {
__actionError "--action=${ACTION}";
};;
esac
}
# @descr: Chamada da função principal de inicialização do script.
__initialize "$@";
}
# SCRIPT INITIALIZE...
util.try; ( ScriptExample "$@" ); util.catch || {
util.print.error "Erro: Ao executar o script '${0##*/}', Exception Code: ${exception}";
util.throw $exception;
}
exit 0;
Caso tu queiras mudar de distribuição linux, exemplo "dist-fedora", basta copiar a pasta "dist-ubuntu" e renomear para "dist-sua-distribuição" e agora é ajustar os scripts do diretório "dist-sua-distribuição/", para que assim possa rodar os scripts de acordo com a distribuição Linux escolhida.
Exemplo:
.
└── shell-script
└── dist-ubuntu
Para:
.
└── shell-script
└── dist-fedora
E agora é só mudar o parâmetro "scriptsPath" do arquivo settings-environment.json ou settings-personalize.json para ..."scriptsPath": "./dist-sua-distribuição"..., exemplo:
{
"settings": [
{
"module": "environment-default",
"description": "Provisionar ambiente básico de desenvolvimento do (Garden Of Eden)",
"active": true,
"logsPath": "./logs/dist-fedora/environment",
"scriptsPath": "./shell-script/dist-fedora/environment",
"scripts": [
...mais scripts...
]
}
]
}
Pronto!! Agora você tem um ambiente de desenvolvimento básico para as distribuições linux, du karalho né?? rsrsrsrs...
- Canal YouTube Bóson Treinamentos, Fábio dos Reis. Programação no Linux Acessado: 29 de Julho de 2017. Disponível: https://www.youtube.com/playlist?list=PLucm8g_ezqNrYgjXC8_CgbvHbvI7dDfhs.
- Shell Scriptx Blog, Shamam. Trabalhando com funções Shell Acessado: 19 de Setembro de 2017. Disponível: http://shellscriptx.blogspot.com.br/2016/12/trabalhando-com-funcoes.html.
- mhavila, Márcio d'Ávila. Scripts Shell sob Controle Acessado: 19 de Setembro de 2017. Disponível: http://www.mhavila.com.br/topicos/unix/shscript.html.
- Blog pantuza, Gustavo Pantuza. COMO FUNCIONA O MAKEFILE Acessado: 13 de Setembro de 2018. Disponível: https://blog.pantuza.com/tutoriais/como-funciona-o-makefile/.
- Blog Linux Journal, Mitch Frazier. Pattern Matching In Bash Acessado: 13 de Maio de 2019. Disponível: https://www.linuxjournal.com/content/pattern-matching-bash/.
- Blog dev.to, Niko Heikkila. Don't Use Bash for Scripting (All the Time) Acessado: 13 de Maio de 2019. Disponível: https://dev.to/nikoheikkila/don-t-use-bash-for-scripting-all-the-time-2kci/.