├── .gitignore ├── README.MD ├── ansible ├── ConfigureRemotingForAnsible.ps1 └── README.MD ├── aprendendo-devops-cover.png ├── bash └── README.MD ├── docker └── README.MD ├── git └── README.MD ├── infra ├── images │ ├── ansible.png │ ├── anydesk.png │ ├── barrier.jpg │ ├── docker.png │ ├── flameshot.png │ ├── git.png │ ├── gparted.png │ ├── gparted_gui.png │ ├── remmina.svg │ ├── teamviewer.png │ ├── terminator.png │ ├── vim.png │ ├── vim_terminal.png │ └── xca.png └── readme.md ├── intro-a-redes ├── httpweb.png ├── readme.md └── subrede.png ├── kubernetes ├── ips-metallb.yaml ├── mani-ingress.yaml └── readme.md ├── linux └── README.MD ├── mysql └── readme.md ├── terraform ├── README.MD ├── ec2.tf ├── laboratorio-01 │ └── lab-01 │ │ ├── ec2.tf │ │ ├── main.tf │ │ ├── output.tf │ │ └── webserver-laboratorio.sh ├── main.tf ├── output.tf └── ssh.tf └── vagrant_labs ├── README.MD ├── Vagrantfile ├── html ├── LICENSE ├── README.md ├── css │ ├── landing-page.css │ └── landing-page.min.css ├── gulpfile.js ├── img │ ├── bg-masthead.jpg │ ├── bg-showcase-1.jpg │ ├── bg-showcase-2.jpg │ ├── bg-showcase-3.jpg │ ├── testimonials-1.jpg │ ├── testimonials-2.jpg │ └── testimonials-3.jpg ├── index.html ├── package-lock.json ├── package.json ├── scss │ ├── _call-to-action.scss │ ├── _footer.scss │ ├── _global.scss │ ├── _icons.scss │ ├── _masthead.scss │ ├── _mixins.scss │ ├── _showcase.scss │ ├── _testimonials.scss │ ├── _variables.scss │ └── landing-page.scss └── vendor │ ├── bootstrap │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── js │ │ ├── bootstrap.bundle.js │ │ ├── bootstrap.bundle.js.map │ │ ├── bootstrap.bundle.min.js │ │ ├── bootstrap.bundle.min.js.map │ │ ├── bootstrap.js │ │ ├── bootstrap.js.map │ │ ├── bootstrap.min.js │ │ └── bootstrap.min.js.map │ ├── fontawesome-free │ ├── css │ │ ├── all.css │ │ ├── all.min.css │ │ ├── brands.css │ │ ├── brands.min.css │ │ ├── fontawesome.css │ │ ├── fontawesome.min.css │ │ ├── regular.css │ │ ├── regular.min.css │ │ ├── solid.css │ │ ├── solid.min.css │ │ ├── svg-with-js.css │ │ ├── svg-with-js.min.css │ │ ├── v4-shims.css │ │ └── v4-shims.min.css │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ ├── jquery │ ├── jquery.js │ ├── jquery.min.js │ ├── jquery.min.map │ ├── jquery.slim.js │ ├── jquery.slim.min.js │ └── jquery.slim.min.map │ └── simple-line-icons │ ├── css │ └── simple-line-icons.css │ └── fonts │ ├── Simple-Line-Icons.eot │ ├── Simple-Line-Icons.svg │ ├── Simple-Line-Icons.ttf │ ├── Simple-Line-Icons.woff │ └── Simple-Line-Icons.woff2 └── provision.sh /.gitignore: -------------------------------------------------------------------------------- 1 | *.deb 2 | devenv 3 | /vagrant_labs/.vagrant/ 4 | /webserver_ssl 5 | /.vscode/ 6 | /docker/rascunho 7 | /docker/vhosts/ 8 | /docker/public-html/vhosts/ 9 | /docker/vendor 10 | /docker/composer.* 11 | /docker/*.php 12 | /*.php 13 | /monitoramento -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Esse repositório foi criado com o intuito ajudar você a utilizar algumas ferramentas para facilitar sua vida no trabalho, seja você desenvolvedor, sysadmin, etc e por que não também de resolver problemas! 5 | 6 | Meu nome é Ulisses Gomes Ribeiro, aka 'Ulisses Stark', e assim como você que veio até aqui também estou aprendendo a cultura DevOps e suas ferramentas. Atualmente sou Administrador de Redes, buscando sempre aprender o NOVO, você pode me conhecer mais aqui ! 7 | 8 |
9 | 10 | 11 | 16 | 17 | 23 | 29 | 35 | 41 | 47 | 53 | 54 | 55 | 61 | 67 | 73 | 91 | 92 |
18 | 19 |

20 | Linux 21 |

22 |
24 | 25 |

26 | Bash 27 |

28 |
30 | 31 |

32 | Git 33 |

34 |
36 | 37 |

38 | Vagrant 39 |

40 |
42 | 43 |

44 | Terraform 45 |

46 |
48 | 49 |

50 | Ansible 51 |

52 |
56 | 57 |

58 | Docker 59 |

60 |
62 | 63 |

64 | MySQL 65 |

66 |
68 | 69 |

70 | Introdução a redes 71 |

72 |
93 | 94 |
95 | 96 | 97 | 98 | 99 | 100 | 101 | Dentro de cada repositório tem um README, explicando como funciona basicamente cada ferramenta, assim como você, também estou aprendendo a utilizar. -------------------------------------------------------------------------------- /ansible/ConfigureRemotingForAnsible.ps1: -------------------------------------------------------------------------------- 1 | #Requires -Version 3.0 2 | 3 | # Configure a Windows host for remote management with Ansible 4 | # ----------------------------------------------------------- 5 | # 6 | # This script checks the current WinRM (PS Remoting) configuration and makes 7 | # the necessary changes to allow Ansible to connect, authenticate and 8 | # execute PowerShell commands. 9 | # 10 | # IMPORTANT: This script uses self-signed certificates and authentication mechanisms 11 | # that are intended for development environments and evaluation purposes only. 12 | # Production environments and deployments that are exposed on the network should 13 | # use CA-signed certificates and secure authentication mechanisms such as Kerberos. 14 | # 15 | # To run this script in Powershell: 16 | # 17 | # [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 18 | # $url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1" 19 | # $file = "$env:temp\ConfigureRemotingForAnsible.ps1" 20 | # 21 | # (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) 22 | # 23 | # powershell.exe -ExecutionPolicy ByPass -File $file 24 | # 25 | # All events are logged to the Windows EventLog, useful for unattended runs. 26 | # 27 | # Use option -Verbose in order to see the verbose output messages. 28 | # 29 | # Use option -CertValidityDays to specify how long this certificate is valid 30 | # starting from today. So you would specify -CertValidityDays 3650 to get 31 | # a 10-year valid certificate. 32 | # 33 | # Use option -ForceNewSSLCert if the system has been SysPreped and a new 34 | # SSL Certificate must be forced on the WinRM Listener when re-running this 35 | # script. This is necessary when a new SID and CN name is created. 36 | # 37 | # Use option -EnableCredSSP to enable CredSSP as an authentication option. 38 | # 39 | # Use option -DisableBasicAuth to disable basic authentication. 40 | # 41 | # Use option -SkipNetworkProfileCheck to skip the network profile check. 42 | # Without specifying this the script will only run if the device's interfaces 43 | # are in DOMAIN or PRIVATE zones. Provide this switch if you want to enable 44 | # WinRM on a device with an interface in PUBLIC zone. 45 | # 46 | # Use option -SubjectName to specify the CN name of the certificate. This 47 | # defaults to the system's hostname and generally should not be specified. 48 | 49 | # Written by Trond Hindenes 50 | # Updated by Chris Church 51 | # Updated by Michael Crilly 52 | # Updated by Anton Ouzounov 53 | # Updated by Nicolas Simond 54 | # Updated by Dag Wieërs 55 | # Updated by Jordan Borean 56 | # Updated by Erwan Quélin 57 | # Updated by David Norman 58 | # 59 | # Version 1.0 - 2014-07-06 60 | # Version 1.1 - 2014-11-11 61 | # Version 1.2 - 2015-05-15 62 | # Version 1.3 - 2016-04-04 63 | # Version 1.4 - 2017-01-05 64 | # Version 1.5 - 2017-02-09 65 | # Version 1.6 - 2017-04-18 66 | # Version 1.7 - 2017-11-23 67 | # Version 1.8 - 2018-02-23 68 | # Version 1.9 - 2018-09-21 69 | 70 | # Support -Verbose option 71 | [CmdletBinding()] 72 | 73 | Param ( 74 | [string]$SubjectName = $env:COMPUTERNAME, 75 | [int]$CertValidityDays = 1095, 76 | [switch]$SkipNetworkProfileCheck, 77 | $CreateSelfSignedCert = $true, 78 | [switch]$ForceNewSSLCert, 79 | [switch]$GlobalHttpFirewallAccess, 80 | [switch]$DisableBasicAuth = $false, 81 | [switch]$EnableCredSSP 82 | ) 83 | 84 | Function Write-ProgressLog { 85 | $Message = $args[0] 86 | Write-EventLog -LogName Application -Source $EventSource -EntryType Information -EventId 1 -Message $Message 87 | } 88 | 89 | Function Write-VerboseLog { 90 | $Message = $args[0] 91 | Write-Verbose $Message 92 | Write-ProgressLog $Message 93 | } 94 | 95 | Function Write-HostLog { 96 | $Message = $args[0] 97 | Write-Output $Message 98 | Write-ProgressLog $Message 99 | } 100 | 101 | Function New-LegacySelfSignedCert { 102 | Param ( 103 | [string]$SubjectName, 104 | [int]$ValidDays = 1095 105 | ) 106 | 107 | $hostnonFQDN = $env:computerName 108 | $hostFQDN = [System.Net.Dns]::GetHostByName(($env:computerName)).Hostname 109 | $SignatureAlgorithm = "SHA256" 110 | 111 | $name = New-Object -COM "X509Enrollment.CX500DistinguishedName.1" 112 | $name.Encode("CN=$SubjectName", 0) 113 | 114 | $key = New-Object -COM "X509Enrollment.CX509PrivateKey.1" 115 | $key.ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider" 116 | $key.KeySpec = 1 117 | $key.Length = 4096 118 | $key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)" 119 | $key.MachineContext = 1 120 | $key.Create() 121 | 122 | $serverauthoid = New-Object -COM "X509Enrollment.CObjectId.1" 123 | $serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1") 124 | $ekuoids = New-Object -COM "X509Enrollment.CObjectIds.1" 125 | $ekuoids.Add($serverauthoid) 126 | $ekuext = New-Object -COM "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1" 127 | $ekuext.InitializeEncode($ekuoids) 128 | 129 | $cert = New-Object -COM "X509Enrollment.CX509CertificateRequestCertificate.1" 130 | $cert.InitializeFromPrivateKey(2, $key, "") 131 | $cert.Subject = $name 132 | $cert.Issuer = $cert.Subject 133 | $cert.NotBefore = (Get-Date).AddDays(-1) 134 | $cert.NotAfter = $cert.NotBefore.AddDays($ValidDays) 135 | 136 | $SigOID = New-Object -ComObject X509Enrollment.CObjectId 137 | $SigOID.InitializeFromValue(([Security.Cryptography.Oid]$SignatureAlgorithm).Value) 138 | 139 | [string[]] $AlternativeName += $hostnonFQDN 140 | $AlternativeName += $hostFQDN 141 | $IAlternativeNames = New-Object -ComObject X509Enrollment.CAlternativeNames 142 | 143 | foreach ($AN in $AlternativeName) { 144 | $AltName = New-Object -ComObject X509Enrollment.CAlternativeName 145 | $AltName.InitializeFromString(0x3, $AN) 146 | $IAlternativeNames.Add($AltName) 147 | } 148 | 149 | $SubjectAlternativeName = New-Object -ComObject X509Enrollment.CX509ExtensionAlternativeNames 150 | $SubjectAlternativeName.InitializeEncode($IAlternativeNames) 151 | 152 | [String[]]$KeyUsage = ("DigitalSignature", "KeyEncipherment") 153 | $KeyUsageObj = New-Object -ComObject X509Enrollment.CX509ExtensionKeyUsage 154 | $KeyUsageObj.InitializeEncode([int][Security.Cryptography.X509Certificates.X509KeyUsageFlags]($KeyUsage)) 155 | $KeyUsageObj.Critical = $true 156 | 157 | $cert.X509Extensions.Add($KeyUsageObj) 158 | $cert.X509Extensions.Add($ekuext) 159 | $cert.SignatureInformation.HashAlgorithm = $SigOID 160 | $CERT.X509Extensions.Add($SubjectAlternativeName) 161 | $cert.Encode() 162 | 163 | $enrollment = New-Object -COM "X509Enrollment.CX509Enrollment.1" 164 | $enrollment.InitializeFromRequest($cert) 165 | $certdata = $enrollment.CreateRequest(0) 166 | $enrollment.InstallResponse(2, $certdata, 0, "") 167 | 168 | # extract/return the thumbprint from the generated cert 169 | $parsed_cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 170 | $parsed_cert.Import([System.Text.Encoding]::UTF8.GetBytes($certdata)) 171 | 172 | return $parsed_cert.Thumbprint 173 | } 174 | 175 | Function Enable-GlobalHttpFirewallAccess { 176 | Write-Verbose "Forcing global HTTP firewall access" 177 | # this is a fairly naive implementation; could be more sophisticated about rule matching/collapsing 178 | $fw = New-Object -ComObject HNetCfg.FWPolicy2 179 | 180 | # try to find/enable the default rule first 181 | $add_rule = $false 182 | $matching_rules = $fw.Rules | Where-Object { $_.Name -eq "Windows Remote Management (HTTP-In)" } 183 | $rule = $null 184 | If ($matching_rules) { 185 | If ($matching_rules -isnot [Array]) { 186 | Write-Verbose "Editing existing single HTTP firewall rule" 187 | $rule = $matching_rules 188 | } 189 | Else { 190 | # try to find one with the All or Public profile first 191 | Write-Verbose "Found multiple existing HTTP firewall rules..." 192 | $rule = $matching_rules | ForEach-Object { $_.Profiles -band 4 }[0] 193 | 194 | If (-not $rule -or $rule -is [Array]) { 195 | Write-Verbose "Editing an arbitrary single HTTP firewall rule (multiple existed)" 196 | # oh well, just pick the first one 197 | $rule = $matching_rules[0] 198 | } 199 | } 200 | } 201 | 202 | If (-not $rule) { 203 | Write-Verbose "Creating a new HTTP firewall rule" 204 | $rule = New-Object -ComObject HNetCfg.FWRule 205 | $rule.Name = "Windows Remote Management (HTTP-In)" 206 | $rule.Description = "Inbound rule for Windows Remote Management via WS-Management. [TCP 5985]" 207 | $add_rule = $true 208 | } 209 | 210 | $rule.Profiles = 0x7FFFFFFF 211 | $rule.Protocol = 6 212 | $rule.LocalPorts = 5985 213 | $rule.RemotePorts = "*" 214 | $rule.LocalAddresses = "*" 215 | $rule.RemoteAddresses = "*" 216 | $rule.Enabled = $true 217 | $rule.Direction = 1 218 | $rule.Action = 1 219 | $rule.Grouping = "Windows Remote Management" 220 | 221 | If ($add_rule) { 222 | $fw.Rules.Add($rule) 223 | } 224 | 225 | Write-Verbose "HTTP firewall rule $($rule.Name) updated" 226 | } 227 | 228 | # Setup error handling. 229 | Trap { 230 | $_ 231 | Exit 1 232 | } 233 | $ErrorActionPreference = "Stop" 234 | 235 | # Get the ID and security principal of the current user account 236 | $myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent() 237 | $myWindowsPrincipal = new-object System.Security.Principal.WindowsPrincipal($myWindowsID) 238 | 239 | # Get the security principal for the Administrator role 240 | $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator 241 | 242 | # Check to see if we are currently running "as Administrator" 243 | if (-Not $myWindowsPrincipal.IsInRole($adminRole)) { 244 | Write-Output "ERROR: You need elevated Administrator privileges in order to run this script." 245 | Write-Output " Start Windows PowerShell by using the Run as Administrator option." 246 | Exit 2 247 | } 248 | 249 | $EventSource = $MyInvocation.MyCommand.Name 250 | If (-Not $EventSource) { 251 | $EventSource = "Powershell CLI" 252 | } 253 | 254 | If ([System.Diagnostics.EventLog]::Exists('Application') -eq $False -or [System.Diagnostics.EventLog]::SourceExists($EventSource) -eq $False) { 255 | New-EventLog -LogName Application -Source $EventSource 256 | } 257 | 258 | # Detect PowerShell version. 259 | If ($PSVersionTable.PSVersion.Major -lt 3) { 260 | Write-ProgressLog "PowerShell version 3 or higher is required." 261 | Throw "PowerShell version 3 or higher is required." 262 | } 263 | 264 | # Find and start the WinRM service. 265 | Write-Verbose "Verifying WinRM service." 266 | If (!(Get-Service "WinRM")) { 267 | Write-ProgressLog "Unable to find the WinRM service." 268 | Throw "Unable to find the WinRM service." 269 | } 270 | ElseIf ((Get-Service "WinRM").Status -ne "Running") { 271 | Write-Verbose "Setting WinRM service to start automatically on boot." 272 | Set-Service -Name "WinRM" -StartupType Automatic 273 | Write-ProgressLog "Set WinRM service to start automatically on boot." 274 | Write-Verbose "Starting WinRM service." 275 | Start-Service -Name "WinRM" -ErrorAction Stop 276 | Write-ProgressLog "Started WinRM service." 277 | 278 | } 279 | 280 | # WinRM should be running; check that we have a PS session config. 281 | If (!(Get-PSSessionConfiguration -Verbose:$false) -or (!(Get-ChildItem WSMan:\localhost\Listener))) { 282 | If ($SkipNetworkProfileCheck) { 283 | Write-Verbose "Enabling PS Remoting without checking Network profile." 284 | Enable-PSRemoting -SkipNetworkProfileCheck -Force -ErrorAction Stop 285 | Write-ProgressLog "Enabled PS Remoting without checking Network profile." 286 | } 287 | Else { 288 | Write-Verbose "Enabling PS Remoting." 289 | Enable-PSRemoting -Force -ErrorAction Stop 290 | Write-ProgressLog "Enabled PS Remoting." 291 | } 292 | } 293 | Else { 294 | Write-Verbose "PS Remoting is already enabled." 295 | } 296 | 297 | # Ensure LocalAccountTokenFilterPolicy is set to 1 298 | # https://github.com/ansible/ansible/issues/42978 299 | $token_path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" 300 | $token_prop_name = "LocalAccountTokenFilterPolicy" 301 | $token_key = Get-Item -Path $token_path 302 | $token_value = $token_key.GetValue($token_prop_name, $null) 303 | if ($token_value -ne 1) { 304 | Write-Verbose "Setting LocalAccountTOkenFilterPolicy to 1" 305 | if ($null -ne $token_value) { 306 | Remove-ItemProperty -Path $token_path -Name $token_prop_name 307 | } 308 | New-ItemProperty -Path $token_path -Name $token_prop_name -Value 1 -PropertyType DWORD > $null 309 | } 310 | 311 | # Make sure there is a SSL listener. 312 | $listeners = Get-ChildItem WSMan:\localhost\Listener 313 | If (!($listeners | Where-Object { $_.Keys -like "TRANSPORT=HTTPS" })) { 314 | # We cannot use New-SelfSignedCertificate on 2012R2 and earlier 315 | $thumbprint = New-LegacySelfSignedCert -SubjectName $SubjectName -ValidDays $CertValidityDays 316 | Write-HostLog "Self-signed SSL certificate generated; thumbprint: $thumbprint" 317 | 318 | # Create the hashtables of settings to be used. 319 | $valueset = @{ 320 | Hostname = $SubjectName 321 | CertificateThumbprint = $thumbprint 322 | } 323 | 324 | $selectorset = @{ 325 | Transport = "HTTPS" 326 | Address = "*" 327 | } 328 | 329 | Write-Verbose "Enabling SSL listener." 330 | New-WSManInstance -ResourceURI 'winrm/config/Listener' -SelectorSet $selectorset -ValueSet $valueset 331 | Write-ProgressLog "Enabled SSL listener." 332 | } 333 | Else { 334 | Write-Verbose "SSL listener is already active." 335 | 336 | # Force a new SSL cert on Listener if the $ForceNewSSLCert 337 | If ($ForceNewSSLCert) { 338 | 339 | # We cannot use New-SelfSignedCertificate on 2012R2 and earlier 340 | $thumbprint = New-LegacySelfSignedCert -SubjectName $SubjectName -ValidDays $CertValidityDays 341 | Write-HostLog "Self-signed SSL certificate generated; thumbprint: $thumbprint" 342 | 343 | $valueset = @{ 344 | CertificateThumbprint = $thumbprint 345 | Hostname = $SubjectName 346 | } 347 | 348 | # Delete the listener for SSL 349 | $selectorset = @{ 350 | Address = "*" 351 | Transport = "HTTPS" 352 | } 353 | Remove-WSManInstance -ResourceURI 'winrm/config/Listener' -SelectorSet $selectorset 354 | 355 | # Add new Listener with new SSL cert 356 | New-WSManInstance -ResourceURI 'winrm/config/Listener' -SelectorSet $selectorset -ValueSet $valueset 357 | } 358 | } 359 | 360 | # Check for basic authentication. 361 | $basicAuthSetting = Get-ChildItem WSMan:\localhost\Service\Auth | Where-Object { $_.Name -eq "Basic" } 362 | 363 | If ($DisableBasicAuth) { 364 | If (($basicAuthSetting.Value) -eq $true) { 365 | Write-Verbose "Disabling basic auth support." 366 | Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" -Value $false 367 | Write-ProgressLog "Disabled basic auth support." 368 | } 369 | Else { 370 | Write-Verbose "Basic auth is already disabled." 371 | } 372 | } 373 | Else { 374 | If (($basicAuthSetting.Value) -eq $false) { 375 | Write-Verbose "Enabling basic auth support." 376 | Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" -Value $true 377 | Write-ProgressLog "Enabled basic auth support." 378 | } 379 | Else { 380 | Write-Verbose "Basic auth is already enabled." 381 | } 382 | } 383 | 384 | # If EnableCredSSP if set to true 385 | If ($EnableCredSSP) { 386 | # Check for CredSSP authentication 387 | $credsspAuthSetting = Get-ChildItem WSMan:\localhost\Service\Auth | Where-Object { $_.Name -eq "CredSSP" } 388 | If (($credsspAuthSetting.Value) -eq $false) { 389 | Write-Verbose "Enabling CredSSP auth support." 390 | Enable-WSManCredSSP -role server -Force 391 | Write-ProgressLog "Enabled CredSSP auth support." 392 | } 393 | } 394 | 395 | If ($GlobalHttpFirewallAccess) { 396 | Enable-GlobalHttpFirewallAccess 397 | } 398 | 399 | # Configure firewall to allow WinRM HTTPS connections. 400 | $fwtest1 = netsh advfirewall firewall show rule name="Allow WinRM HTTPS" 401 | $fwtest2 = netsh advfirewall firewall show rule name="Allow WinRM HTTPS" profile=any 402 | If ($fwtest1.count -lt 5) { 403 | Write-Verbose "Adding firewall rule to allow WinRM HTTPS." 404 | netsh advfirewall firewall add rule profile=any name="Allow WinRM HTTPS" dir=in localport=5986 protocol=TCP action=allow 405 | Write-ProgressLog "Added firewall rule to allow WinRM HTTPS." 406 | } 407 | ElseIf (($fwtest1.count -ge 5) -and ($fwtest2.count -lt 5)) { 408 | Write-Verbose "Updating firewall rule to allow WinRM HTTPS for any profile." 409 | netsh advfirewall firewall set rule name="Allow WinRM HTTPS" new profile=any 410 | Write-ProgressLog "Updated firewall rule to allow WinRM HTTPS for any profile." 411 | } 412 | Else { 413 | Write-Verbose "Firewall rule already exists to allow WinRM HTTPS." 414 | } 415 | 416 | # Test a remoting connection to localhost, which should work. 417 | $httpResult = Invoke-Command -ComputerName "localhost" -ScriptBlock { $using:env:COMPUTERNAME } -ErrorVariable httpError -ErrorAction SilentlyContinue 418 | $httpsOptions = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck 419 | 420 | $httpsResult = New-PSSession -UseSSL -ComputerName "localhost" -SessionOption $httpsOptions -ErrorVariable httpsError -ErrorAction SilentlyContinue 421 | 422 | If ($httpResult -and $httpsResult) { 423 | Write-Verbose "HTTP: Enabled | HTTPS: Enabled" 424 | } 425 | ElseIf ($httpsResult -and !$httpResult) { 426 | Write-Verbose "HTTP: Disabled | HTTPS: Enabled" 427 | } 428 | ElseIf ($httpResult -and !$httpsResult) { 429 | Write-Verbose "HTTP: Enabled | HTTPS: Disabled" 430 | } 431 | Else { 432 | Write-ProgressLog "Unable to establish an HTTP or HTTPS remoting session." 433 | Throw "Unable to establish an HTTP or HTTPS remoting session." 434 | } 435 | Write-VerboseLog "PS Remoting has been successfully configured for Ansible." -------------------------------------------------------------------------------- /ansible/README.MD: -------------------------------------------------------------------------------- 1 | ## indice 2 | - [O que é o Ansible?](#o-que-é-o-ansible) 3 | - [Como instalar](#como-instalar) 4 | - [Arquitetura](#arquitetura) 5 | - [Inventario](#inventario) 6 | - [Testando a conexão](#testando-a-conexão) 7 | - [Conectando em host windows](#conectando-em-host-windows) 8 | - [Documentação util](#documentação) 9 | - [Contribuindo](#contribuindo) 10 | 11 | ## O que é o Ansible? 12 | 13 | O Ansible é uma ferramenta de automação de TI que ajuda a gerenciar e configurar servidores, aplicativos e infraestrutura de forma simples e eficiente. Pense nele como um "controlador remoto inteligente" que usa arquivos de texto (Playbooks) para descrever o que você quer que ele faça, como instalar pacotes, configurar serviços ou implementar atualizações. 14 | 15 | #### Características práticas: 16 | - Sem agentes: Você não precisa instalar nada nas máquinas que quer gerenciar. O Ansible se conecta via SSH. 17 | - Simplicidade: Os Playbooks são escritos em YAML, um formato legível e fácil de aprender. 18 | - Escalável: Pode gerenciar de um único servidor até milhares de máquinas. 19 | - Repetibilidade: Garante que o mesmo script funcione sempre da mesma forma, eliminando inconsistências. 20 | 21 | #### Exemplo prático: Imagine que você precisa instalar o Apache em 10 servidores. Com o Ansible, você escreve um Playbook assim: 22 | 23 | 24 | - name: Instalar e iniciar Apache 25 | hosts: servidores_web 26 | tasks: 27 | - name: Instalar pacote Apache 28 | apt: 29 | name: apache2 30 | state: present 31 | 32 | - name: Garantir que o Apache está rodando 33 | service: 34 | name: apache2 35 | state: started 36 | 37 | 38 | Com apenas um comando, o Ansible faz isso em todos os servidores, sem que você tenha que acessá-los manualmente. 39 | 40 | Resumindo: o Ansible é como um assistente que automatiza tarefas repetitivas e complexas, poupando tempo e reduzindo erros. 41 | 42 | ## Como instalar 43 |

Para instalar o Ansible, basta seguir o passo a passo baseado na documentação oficial, meu sistema de uso é o Ubuntu, segue então os comandos : 44 | 45 | $ sudo apt update 46 | $ sudo apt install software-properties-common 47 | $ sudo add-apt-repository --yes --update ppa:ansible/ansible 48 | $ sudo apt install ansible 49 |

50 | 51 | ## Arquitetura 52 | 53 | A arquitetura digamos assim do Ansible é composta por : 54 | 55 | - Control Node : a maquina que terá o Ansible instalado para gerenciar os hosts. 56 | 57 | - Managed Node : são os hosts gerenciados pelo Control Node. 58 | 59 | - Inventory : seu inventário/hosts 60 | 61 | 62 | O Ansible, trabalha sem a necessidade de ter um client instalado na maquina host, usando apenas a porta SSH da maquina, aconselhado que seu ambiente tenha authorized_keys, para um melhor aproveitamento da ferramenta. Sendo ele então control-node, que vai rodar os comandos para as maquinas hosts, chamadas de Managed Node, e o ideal é ter o arquivo de inventários dos hosts, que fica localizado em /etc/ansible/hosts , dentro dele passamos como queremos nos comunicar com os managed nodes, podendo ser por grupos ou individual, segue um exemplo :
63 | 64 | [myvirtualmachines] 65 | 192.0.2.50 66 | 192.0.2.51 67 | 192.0.2.52 68 | 69 |

Dessa forma dentro de [ ] temos um grupo de maquinas, ao rodar algum comando no Ansible apontando para esse grupo, todos os hosts devem responder.

70 | 71 | ## Inventario 72 | 73 | O inventario/hosts, é o que vai fazer o Ansible se comunicar de uma forma que ele identifique na rede quem é quem na fila do pão! Podemos adicionar os hosts de forma livre apenas listando os IPs, ou de forma organizada informando os Grupos dentro de [ ] 74 | 75 | [DEMO-HOMO] 76 | DEMO001 ansible_host=192.168.0.2 77 | HOMO001 ansible_host=192.168.0.3 78 | 79 | [PROD] 80 | PROD001 ansible_host=192.168.0.4 81 | PROD002 ansible_host=192.168.0.5 82 | PROD003 ansible_host=192.168.0.6 83 | 84 | ## Testando a conexão 85 | 86 | Para verificar se deu certo, você pode rodar o comando : 87 | 88 | ansible myvirtualachines -m ping 89 | 90 | Obs.: Só vai funcionar dessa forma do comando se tiver authorizedkeys, do contrário informe -k para solicitar a senha, por padrão é usado usuário root, caso queira passar outro usuário use : -u nome_do_usuario 91 | 92 | Tendo como retorno: 93 | 94 | 192.0.2.50 | SUCCESS => { 95 | "ansible_facts": { 96 | "discovered_interpreter_python": "/usr/bin/python3" 97 | }, 98 | "changed": false, 99 | "ping": "pong" 100 | } 101 | 192.0.2.51 | SUCCESS => { 102 | "ansible_facts": { 103 | "discovered_interpreter_python": "/usr/bin/python3" 104 | }, 105 | "changed": false, 106 | "ping": "pong" 107 | } 108 | 192.0.2.52 | SUCCESS => { 109 | "ansible_facts": { 110 | "discovered_interpreter_python": "/usr/bin/python3" 111 | }, 112 | "changed": false, 113 | "ping": "pong" 114 | } 115 | 116 | ## Conectando em host windows 117 | 118 | Não lembro de ter visto em tutoriais de texto ou video, ensinando como conectar em hosts Windows usando WinRM, então vou ensinar aqui como fazer : 119 | 120 | - Requisitos: 121 | - Powershell 5.1.19041.1237 122 | - .NET 123 | - Client 4.8.04084 124 | - Full 4.8.04084 125 | - Client 4.0.0.0 126 | - Verificar se o WinRM está configurado : 127 | - winrm get winrm/config/Service 128 | 129 | - Configurando e ativando o WinRM : 130 | - Baixe o script disponibilizado aqui no repositório ConfigureRemotingForAnsible.ps1, é oficial da documentação do Ansible, execute ele com o powershell a nivel de administrador. 131 | - Ao terminar verifique se deu certo, rode : 132 | - winrm get winrm/config/Service 133 | - Crie um usuário a nível administrador,esse usuário e senha vão ser usados na configuração do ansible. 134 | 135 | - Configurando hosts 136 | - crie um arquivo .ini ou utilize o /etc/ansible/hosts, fica a seu critério, para facilitar vamos no /etc/ansible/hosts : 137 | 138 | [windows] 139 | 192.168.3.5 140 | 141 | - Nos tutorias mostram para passar as credenciais no proprio arquivo de hosts, não recomendo, segue abaixo como fazer de forma criptografada usando o ansible vault: 142 | 143 | - No terminal rode o comando : 144 | - ansible-vault create credentials.yml 145 | - será solicitado que crie um senha para acessar esse .yml 146 | - ao abrir o vim, passe as variáveis : 147 | 148 | 149 | user=usuario 150 | password=senha 151 | 152 | - salve o arquivo, e agora no playbook ficara da seguinte forma: 153 | 154 | 155 | --- 156 | - name: Manager windows - winRM 157 | hosts: WINDOWS 158 | 159 | vars_files: 160 | - credentials.yaml 161 | 162 | vars: 163 | ansible_user: "{{ user }}" 164 | ansible_password: "{{ password }}" 165 | ansible_port: 5986 166 | ansible_connection: winrm 167 | ansible_winrm_transport: basic 168 | ansible_winrm_server_cert_validation: ignore 169 | 170 | become: false 171 | gather_facts: false 172 | 173 | tasks: 174 | - name: Test connection 175 | win_ping: 176 | register: ping 177 | 178 | - debug: 179 | msg: "Status ping {{ ping }}" 180 | 181 | 182 | - Agora execute : 183 | - ansible-playbook -i win.ini win_ping.yml --ask-vault-pass 184 | - informe a senha que você criou para o vault 185 | 186 | ### Dicas ansible-vault 187 | - Comandos : 188 | - ansible-vault create : para criar um arquivo criptografado 189 | - ansible-vault edit : para poder editar o arquivo 190 | - ansible-vault view : para apenas visualizar as informações 191 | 192 | 193 | ## Módulos 194 | 195 | Conheço duas formas de usar o Ansible via CLI, usando os módulos : 196 | - command 197 | - shell 198 | 199 | O módulo command é usado para executar comandos diretamente no shell do sistema operacional no host remoto. Ele é útil para executar comandos simples e diretos, sem a necessidade de interação ou recursos avançados de shell. O comando é executado exatamente como você o especifica, sem passar por um processo de shell intermediário. 200 | 201 | ansible HOSTS -m command -a 'ls -lha' 202 | 203 | 204 | O módulo shell permite executar comandos em um shell no host remoto, como bash ou sh. Ele oferece recursos avançados do shell, como redirecionamento de entrada/saída, tubulações, substituição de comandos e variáveis de ambiente. 205 | 206 | ansible HOSTS -m shell -a 'ls -lha |grep arquivo.txt' 207 | 208 | ## Playbooks 209 | 210 | No Ansible, um playbook é um arquivo YAML que define uma sequência de tarefas a serem executadas em um conjunto de hosts. É a unidade básica de configuração e automação no Ansible. Um playbook descreve o estado desejado do sistema e as ações necessárias para alcançá-lo. 211 | 212 | Segue alguns exemplos de playbooks: 213 | 214 | 215 | 216 | - Playbook básico para instalar pacotes em servidores: 217 | 218 | --- 219 | - name: Instalar pacotes 220 | hosts: servidores 221 | tasks: 222 | - name: Atualizar cache de pacotes 223 | apt: 224 | update_cache: yes 225 | become: true 226 | 227 | - name: Instalar pacotes 228 | apt: 229 | name: 230 | - pacote1 231 | - pacote2 232 | state: present 233 | become: true 234 | 235 | - Playbook para copiar um arquivo para os servidores: 236 | 237 | --- 238 | - name: Copiar arquivo 239 | hosts: servidores 240 | tasks: 241 | - name: Copiar arquivo 242 | copy: 243 | src: /path/to/source/file 244 | dest: /path/to/destination/file 245 | become: true 246 | 247 | 248 | - Playbook para reiniciar um serviço em servidores: 249 | 250 | --- 251 | - name: Reiniciar serviço 252 | hosts: servidores 253 | tasks: 254 | - name: Reiniciar serviço 255 | service: 256 | name: nome_do_servico 257 | state: restarted 258 | become: true 259 | 260 | - Playbook para gerenciar usuários e grupos: 261 | 262 | 263 | --- 264 | - name: Gerenciar usuários e grupos 265 | hosts: servidores 266 | tasks: 267 | - name: Criar grupo 268 | group: 269 | name: nome_do_grupo 270 | state: present 271 | become: true 272 | 273 | - name: Criar usuário 274 | user: 275 | name: nome_do_usuario 276 | groups: nome_do_grupo 277 | password: senha_criptografada 278 | state: present 279 | become: true 280 | 281 | ## Executando um playbook 282 | 283 | Para executar um playbook simples : 284 | 285 | ansible-playbook HOST seu-playbook.yml 286 | 287 | Obs.1: Caso tenho atribuído become : true indica que a task precisa ser executada com privilégios altos de sudo, então pode ser necessário adicionar --ask-become-pass para fornecer a senha de root 288 |
289 | Obs.2: Caso use authorizedkeys, não é necessário passar senha 290 | 291 | ## States 292 | 293 | Deve ter visto que no playbook sempre tem um "state", é para referenciar a criação/presente, remoção/ausência, etc, vou deixar aqui uma lista : 294 | 295 | - present: Indica que o recurso deve estar presente ou criado. Se o recurso já existir, não será feita nenhuma alteração. Caso contrário, o recurso será criado. 296 | 297 | - absent: Indica que o recurso deve ser removido ou ausente. Se o recurso existir, será removido. Caso contrário, nenhuma ação será realizada. 298 | 299 | - started: Indica que o recurso deve estar em execução. Se o recurso não estiver em execução, ele será iniciado. Caso contrário, nenhuma ação será realizada. 300 | 301 | - stopped: Indica que o recurso deve ser interrompido ou parado. Se o recurso estiver em execução, ele será interrompido. Caso contrário, nenhuma ação será realizada. 302 | 303 | - restarted: Indica que o recurso deve ser reiniciado. Se o recurso estiver em execução, ele será reiniciado. Caso contrário, o recurso será iniciado. 304 | 305 | - reloaded: Indica que o recurso deve ser recarregado. O comportamento exato depende do módulo e do recurso específico. Em geral, isso significa recarregar as configurações sem interromper ou reiniciar o recurso. 306 | 307 | - enabled: Indica que o recurso deve estar habilitado para ser iniciado automaticamente no boot do sistema. O comportamento exato depende do módulo e do recurso específico. 308 | 309 | - disabled: Indica que o recurso deve estar desabilitado para não ser iniciado automaticamente no boot do sistema. O comportamento exato depende do módulo e do recurso específico. 310 | 311 | ## Documentação 312 | 313 | Toda documentação oficial do Ansible você encontra aqui! 314 | 315 | Favorite 316 | 322 | 323 | ## Contribuindo 324 | 325 | Qualquer contribuição que você fizer será bem vinda, analisada e se viável, atualizada no projeto! 326 | 327 | - 1.Faça um fork do projeto 328 | - 2.Clone o seu fork para sua maquina(git clone url-do-projeto.git) 329 | - 3.Crie um branch para sua modificação/atualização(git checkout -b seu-branch) 330 | - 4.Adicione suas alterações ao git(git add .) 331 | - 5.Confirme suas alterações(git commit -m "texto descritivo do que fez") 332 | - 6.Suba seu branch(git push origin seu-branch) 333 | - 7.Faça uma solicitação de merge request para o branch : updates -------------------------------------------------------------------------------- /aprendendo-devops-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/aprendendo-devops-cover.png -------------------------------------------------------------------------------- /bash/README.MD: -------------------------------------------------------------------------------- 1 | # Bash 2 | 3 | O Bash (Bourne Again Shell) é um interpretador de linha de comando, ou shell, amplamente utilizado em sistemas operacionais baseados em Unix, incluindo o Linux. Ele é uma evolução do shell "sh" original, criado por Stephen Bourne nos primeiros dias do Unix. O Bash é o shell padrão em muitas distribuições Linux e é amplamente preferido por sua riqueza de recursos, flexibilidade e suporte a automação de tarefas. 4 | 5 | Aqui estão alguns dos principais recursos e funcionalidades do Bash: 6 | 7 | - Interface de linha de comando: O Bash fornece uma interface de linha de comando em que os usuários podem interagir com o sistema operacional, digitando comandos e recebendo saídas correspondentes. Ele permite que os usuários realizem várias tarefas, como navegar pelo sistema de arquivos, executar programas, gerenciar processos e muito mais. 8 | 9 | - Variáveis e substituições: O Bash permite definir e usar variáveis para armazenar valores. Além disso, ele suporta substituições, que permitem que os resultados de comandos sejam usados diretamente em outros comandos. 10 | 11 | Exemplo de definição de variável: 12 | 13 | 14 | minha_variavel="Olá, mundo!" 15 | 16 | Exemplo de substituição de comando: 17 | 18 | 19 | data_atual=$(date +%Y-%m-%d) 20 | echo $data_atual 21 | 22 | - Redirecionamento e pipes: O Bash suporta redirecionamento de entrada e saída, permitindo que os resultados dos comandos sejam enviados para arquivos ou lidos de arquivos. Os pipes ("|") permitem encadear comandos para que a saída de um comando seja usada como entrada para outro. 23 | 24 | Exemplo de redirecionamento de saída para um arquivo: 25 | 26 | ls > lista_arquivos.txt 27 | 28 | Exemplo de uso de pipe: 29 | 30 | cat arquivo.txt | grep "palavra" 31 | 32 | - Controle de fluxo: O Bash suporta estruturas de controle de fluxo, como loops e condicionais, que permitem que os scripts automatizem tarefas repetitivas ou tomem decisões com base em condições. 33 | 34 | Exemplo de loop "for": 35 | 36 | for i in {1..5}; do 37 | echo $i 38 | done 39 | 40 | Exemplo de condicional "if": 41 | 42 | idade=20 43 | if [ $idade -ge 18 ]; then 44 | echo "Você é maior de idade." 45 | else 46 | echo "Você é menor de idade." 47 | fi 48 | 49 | - Histórico de comandos: O Bash mantém um histórico de comandos digitados pelo usuário, permitindo que os usuários naveguem pelo histórico e reexecutem comandos anteriores. 50 | 51 | Exemplo de navegação no histórico de comandos: 52 | 53 | 54 | history !! # Executa o último comando novamente 55 | history !5 # Executa o quinto comando no histórico 56 | 57 | - Completion (completar): O Bash oferece suporte a recursos de completar, que permitem ao usuário pressionar a tecla "Tab" para autocompletar nomes de arquivos, diretórios, comandos e opções, economizando tempo e minimizando erros. 58 | 59 | 60 | Esses são apenas alguns dos recursos do Bash. Sua poderosa funcionalidade e extensibilidade tornam-no uma ferramenta valiosa para administradores de sistemas, desenvolvedores e qualquer pessoa que precise interagir com um sistema operacional baseado em Unix de maneira eficiente através da linha de comando. Além disso, o Bash pode ser estendido com scripts, permitindo a criação de rotinas e automação complexas para simplificar tarefas do dia a dia. -------------------------------------------------------------------------------- /docker/README.MD: -------------------------------------------------------------------------------- 1 | # Indice 2 | 3 | - [Docker](#docker) 4 | - [Vantages](#vantagens) 5 | - [Arquitetura](#arquitetura) 6 | - [Instalação](#instalação) 7 | - [Pós-instalação](#pós-instalação) 8 | - [Criando seu primeiro container](#criando-seu-primeiro-container) 9 | - [Comandos](#comandos) 10 | - [Contribuindo](#contribuindo) 11 | 12 | ## Docker 13 | 14 | O Docker é uma plataforma open source que permite criar, empacotar e gerenciar aplicações em containers. Containers são ambientes isolados e padronizados que contêm tudo o que uma aplicação precisa para rodar, como código, bibliotecas e dependências, garantindo que ela funcione de forma consistente em qualquer sistema operacional que suporte Docker. 15 | 16 | ### Principais conceitos: 17 | - Imagens: São templates imutáveis que definem o que um container deve executar. Por exemplo, uma imagem pode conter uma aplicação web com todas as suas dependências. 18 | - Containers: São instâncias em execução das imagens, funcionando como "máquinas virtuais leves", mas que compartilham o kernel do sistema operacional. 19 | - Docker Engine: O serviço que gerencia os containers e imagens no host. 20 | - Docker Hub: Um repositório público onde você pode encontrar e compartilhar imagens Docker. 21 | 22 | ### Benefícios: 23 | - Portabilidade: Containers podem rodar em qualquer ambiente que suporte Docker. 24 | - Leveza: Compartilham o kernel do sistema operacional, consumindo menos recursos que VMs. 25 | - Velocidade: Containers iniciam rapidamente. 26 | - Consistência: Evitam problemas de "funciona na minha máquina". 27 | 28 | Docker é amplamente utilizado em ambientes de desenvolvimento, testes e produção, especialmente em arquiteturas baseadas em microsserviços. 29 | 30 | 31 | ## Arquitetura 32 | 33 | 34 | - Images : É um pacote com um sistema de arquivos com todas as suas dependências,libs de s.o,processos que serão executados,kernel,etc. 35 | 36 | - Container : É o processo que executa uma imagem, a imagem é imutável mesmo após um container se iniciado. 37 | 38 | - Registry : Repositório de imagens : hub docker . 39 | 40 | 41 | ## Instalação 42 | 43 | Para instalar o Docker, é fácil e rápido, se você estiver usando Linux claro... segue o comando no terminal : 44 | 45 | curl -fsSL https://get.docker.com | bash 46 | 47 | Ta usando Windows? Tome 48 | 49 | Ao terminar de instalar, rode o comando : 50 | 51 | docker --version 52 | 53 | Retornou a versão do Docker?Claro é Linux. 54 | 55 | ## Pós-instalação 56 | 57 | Por padrão você só vai conseguir utilizar o Docker como usuário root, então é necessário caso quero rodar com seu usuário, fazer o procedimento abaixo : 58 | 59 | ## Criando o grupo e adicionando seu usuário: 60 | 61 | - 1 - Crie o grupo docker 62 | 63 | sudo groupadd docker 64 | 65 | - 2 - Adicione seu usuário ao grupo docker 66 | 67 | sudo usermod -aG docker $USER 68 | 69 | - 3 - Faça logout da maquia e logue novamente, se estiver usando uma VM, é preciso reiniciar. Você pode também ativar as alterações com o comando : 70 | 71 | newgrp docker 72 | 73 | - 4 - Verifique se você pode executar o docker sem usar o sudo 74 | 75 | docker run hello-world 76 | 77 | ## Criando seu primeiro container 78 | 79 | Eu vou ser pratico e direto na forma de criar um container, passando numa única linha os parâmetros e em seguida explicar. 80 | 81 | docker run -dit --name webserver -h webserver -p 8080:80 -p 8443:443 -v /opa.log:/var/log ubuntu:20.04 82 | 83 | Iniciamos sempre com "docker" e a partir dai os parâmetros : 84 | 85 | - run : para executar/criar o cotainer 86 | - -dit : resumindo,vai rodar em background de forma interativa 87 | - --name : para você dar um nome ao container, caso não passe, o docker vai gerar um nome aleatório 88 | - -h : você pode dar um hostname para o container 89 | - -p : para apontarmos que vamos usar a porta do HOST na porta do CONTAINER 90 | - v : para montarmos volumes no container,no exemplo montamos arquivo de log do path do /var/log; 91 | - ubuntu:20.04 : é a imagem que vamos usar como base. 92 | 93 | 94 | 95 | ## Comandos 96 | 97 | Segue aqui alguns comandos 98 | 99 | #### Gerenciamento de imagens 100 | - docker images: lista todas as imagens disponíveis no sistema. 101 | - docker pull : faz o download de uma imagem do registro do Docker. 102 | - docker build -t : constrói uma imagem com base em um Dockerfile. 103 | - docker tag : :: cria uma nova tag para uma imagem existente. 104 | - docker push : envia uma imagem para o registro do Docker. 105 | 106 | #### Gerenciamento de contêineres 107 | - docker ps: lista todos os contêineres em execução. 108 | - docker ps -a: lista todos os contêineres, incluindo os que estão parados. 109 | - docker start : inicia um contêiner parado. 110 | - docker stop : interrompe um contêiner em execução. 111 | - docker restart : reinicia um contêiner em execução. 112 | - docker rm : remove um contêiner parado. 113 | - docker container prune: remove todos os contêineres parados. 114 | 115 | #### Gerenciamento de redes 116 | - docker network ls: lista todas as redes disponíveis no sistema. 117 | - docker network create : cria uma nova rede. 118 | - docker network connect : conecta um contêiner a uma rede. 119 | - docker network disconnect : desconecta um contêiner de uma rede. 120 | 121 | #### Outros comandos úteis 122 | - docker exec -it : executa um comando dentro de um contêiner em execução. 123 | - docker logs : exibe os logs de um contêiner em execução. 124 | - docker inspect : exibe informações detalhadas sobre um contêiner. 125 | - docker volume ls: lista todos os volumes disponíveis no sistema. 126 | - docker volume create : cria um novo volume. 127 | - docker volume rm : remove um volume. 128 | 129 | Esses são apenas alguns exemplos de comandos úteis do Docker. Consulte a documentação oficial do Docker para obter informações detalhadas sobre todos os comandos disponíveis. 130 | 131 | ## Contribuindo 132 | 133 | Qualquer contribuição que você fizer será bem vinda, analisada e se viável, atualizada no projeto! 134 | 135 | - 1.Faça um fork do projeto 136 | - 2.Clone o seu fork para sua maquina(git clone url-do-projeto.git) 137 | - 3.Crie um branch para sua modificação/atualização(git checkout -b seu-branch) 138 | - 4.Adicione suas alterações ao git(git add .) 139 | - 5.Confirme suas alterações(git commit -m "texto descritivo do que fez") 140 | - 6.Suba seu branch(git push origin seu-branch) 141 | - 7.Faça uma solicitação de merge request para o branch : updates -------------------------------------------------------------------------------- /git/README.MD: -------------------------------------------------------------------------------- 1 | # Indice 2 | 3 | - [Git](#git) 4 | - [Instalação](#instalação) 5 | - [Configurando o Git](#configurando-o-git) 6 | - [Estados do Gir](#estados-do-git) 7 | - [Comandos](#comandos) 8 | - [Extra](#extra) 9 | - [Contribuindo](#contribuindo) 10 | 11 | ## Git 12 | 13 | Git pronuncia-se [git] (ou /ɡɪt/ em inglês britânico[2][3]) é um sistema de controle de versões distribuído, usado principalmente no desenvolvimento de software, mas pode ser usado para registrar o histórico de edições de qualquer tipo de arquivo (Exemplo: alguns livros digitais são disponibilizados no GitHub e escrito aos poucos publicamente). 14 | 15 | Trecho retirado da wiki 16 | 17 | ## Instalação 18 | 19 | Obs.: Estou utilizando Linux Ubuntu 20 | 21 | Para instalar o git no Ubuntu, é simples : apt install git -y 22 |
23 | Rapido e fácil, mais fácil do que tomar sorvete no sol. Ta usando Windows? 24 |
Relaxa o coração : você pode instalar o git para Windows aqui 25 | 26 | ## Configurando o Git 27 | 28 | Seja no Linux, Mac ou Windows, se faz necessário configurar o Git, para que você possa utilizar a ferramenta, então segue abaixo : 29 | 30 | - git config --global user.name “nome_de_usuario” : para adicionar o usuário. 31 | - git config --global user.email “email_do_usuario” : para adicionar o e-mail. 32 | - git config --global core.editor "editor de textos" : para informar o editor de textos que vamos usar. 33 | 34 | 35 | Para iniciar um projeto, dentro da pasta/diretório, use git init , esse comando vai inicializar o seu repositório local para que possa ser visível como um repositório no git. 36 | 37 |

Dentro do repositório, agora boa parte do seu trabalho vai ser via terminal/cli, no caso do Linux e Mac, temos o terminal e no caso do Windows é necessário instalar o GitBash para ter uma experiência melhor, e instalar o Terminal, disponível na loja da Microsoft, bastante util para usuários Windows.

38 | 39 | ## Estados do git 40 | 41 |

Dentro do repositório, temos os estados dos arquivos, sendo eles :

42 | 43 | - untracked - arquivo criado porém ainda não visto pelo git. 44 | 45 | - unmodified - quando o arquivo criado foi adicionado no git mas sem modificação. 46 | 47 | - modified - quando você modifica e está pronto para ser commitado. 48 | 49 | - stage - quando o arquivo vai ficar sinalizado para ser a versão final.(“salvar a versão”) 50 |
51 | 52 | ## Comandos 53 | 54 | 55 | - git add . ou git add all - Para adicionar os arquivos, ficando "visíveis" ao git. 56 | - git commit -m - Para "salvar" seu progresso no projeto, normalmente usado quando já está finalizado, gerando então a "versão" que é de fato, o versionamento. 57 | - git status - Usado para visualizar o estado do seu projeto, obtendo informações, se tem arquivos ainda não monitorados no git, etc. 58 | - git log ou git log --graph - Usado para visualizar o histórico, os commits feitos no projeto! Útil para voltar/resetar o projeto com base nas hash geradas. 59 | - git diff - Usada para visualizar as alterações antes de commitar. 60 | - git push - Para subir o projeto para o repositório remoto. Exemplo: git push origin master. 61 | - git pull - Para atualizar o seu projeto local. Exemplo: git pull origin master. 62 | - git remote -v - Usado para ver em qual repositório remoto o projeto local está vinculado. 63 | - git remote add - Usado para vincular ao repositório remoto. Exemplo: git remote add origin git@github.com:devops/git/aprendendo-devops.git. 64 | - git branch - Usado para visualizar os branches. 65 | - git checkout -b NOME_DO_BRANCH - Usado para criar um novo branch. 66 | - git merge - Usado para mesclar o branch ao seu master. 67 | - git branch -D NOME_DO_BRANCH - Para deletar um branch. 68 | 69 | ## Extra 70 | 71 | Tenho um docs mais detalhado sobre o git aqui 72 | 73 | 74 | ## Contribuindo 75 | 76 | Qualquer contribuição que você fizer será bem vinda, analisada e se viável, atualizada no projeto! 77 | 78 | - 1.Faça um fork do projeto 79 | - 2.Clone o seu fork para sua maquina(git clone url-do-projeto.git) 80 | - 3.Crie um branch para sua modificação/atualização(git checkout -b seu-branch) 81 | - 4.Adicione suas alterações ao git(git add .) 82 | - 5.Confirme suas alterações(git commit -m "texto descritivo do que fez") 83 | - 6.Suba seu branch(git push origin seu-branch) 84 | - 7.Faça uma solicitação de merge request para o branch : updates 85 | -------------------------------------------------------------------------------- /infra/images/ansible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/ansible.png -------------------------------------------------------------------------------- /infra/images/anydesk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/anydesk.png -------------------------------------------------------------------------------- /infra/images/barrier.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/barrier.jpg -------------------------------------------------------------------------------- /infra/images/docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/docker.png -------------------------------------------------------------------------------- /infra/images/flameshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/flameshot.png -------------------------------------------------------------------------------- /infra/images/git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/git.png -------------------------------------------------------------------------------- /infra/images/gparted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/gparted.png -------------------------------------------------------------------------------- /infra/images/gparted_gui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/gparted_gui.png -------------------------------------------------------------------------------- /infra/images/remmina.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /infra/images/teamviewer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/teamviewer.png -------------------------------------------------------------------------------- /infra/images/terminator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/terminator.png -------------------------------------------------------------------------------- /infra/images/vim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/vim.png -------------------------------------------------------------------------------- /infra/images/vim_terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/vim_terminal.png -------------------------------------------------------------------------------- /infra/images/xca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/infra/images/xca.png -------------------------------------------------------------------------------- /infra/readme.md: -------------------------------------------------------------------------------- 1 | # O que instalar no S.O de alguém de infra 2 | 3 |

Vou listar aqui ferramentas que considero importante de ter instalado em meu ambiente de trabalho, atualmente utilizo Linux (Kali e Ubuntu 22). 4 |

5 | 6 | - [Terminator](#terminator) 7 | - [Vim](#vim) 8 | - [Barrier-kvm](#barrier-kvm) 9 | - [XCA](#xca---certificate-and-key-management) 10 | - [Git](#git) 11 | - [GParted](#gparted) 12 | - [CFdisk](#cfdisk) 13 | - [Docker](#docker) 14 | - [Ansible](#ansible) 15 | - [Anydesk e TeamViewer](#anydesk-e-teamviewer) 16 | - [Remmina e xfreerdp](#remmina-e-xfreerdp) 17 | - [Nmap | OpenVAS | Shodan](#nmap--openvas--shodan) 18 | 19 | 20 | ### Terminator 21 | 22 | 23 | 24 | Permite que você ajuste a tela do seu terminal da forma que melhor lhe agradar, sem ter que abrir varios terminais separados.Mais informações aqui . 25 | 26 | apt install terminator -y 27 | 28 | 29 | 30 | 31 | ### Vim 32 | 33 | 34 | 35 | Pra mim o melhor editor de textos para se usar no terminal, depois que você migra pro Vim, não tem como voltar a usar o nano. Mais informações aqui . 36 | 37 | apt install vim -y 38 | 39 | 40 | 41 | ### Barrier-kvm 42 | 43 | 44 | 45 | Uma alternativa gratuita ao Synergy, o Barrier você consegue compartilhar o mesmo teclado e mouse com varios dispositivos na mesma rede, ideal quando trabalhamos com notebook e desktop em paralelo e independente do S.O. Mais informações aqui . 46 | 47 | apt install barrier -y 48 | 49 | ou 50 | 51 | snap install barrier-kvm 52 | 53 | 54 | 55 | Se atente a instalar de preferência a mesma versão nos demais dispositivos 56 | 57 | ### XCA - Certificate and Key management 58 | 59 | 60 | 61 | É uma ferramenta que permite você gerenciar certificados, extrair dados, incluindo até criptografados .pfx , mais informações aqui . 62 | 63 | apt install xca -y 64 | 65 | 66 | 67 | Claro que também podemos fazer isso usando o openssl. 68 | 69 | ### Git 70 | 71 | 72 | 73 | Cara, sempre vai ter alguém que vai apagar aquele arquivo rc.local onde você subia suas gambiarras e você tem que refazer e as vezes pode nem lembrar, então aprenda a usar git e a versionar tudo que for importante no seu ambiente. 74 | 75 | apt install git -y 76 | 77 | 78 | ### GParted 79 | 80 | 81 | 82 | Gosto de usar o GParted quando se trata de mexer com partições de disco, ainda mais em ambientes de produção! Mais informações aqui . 83 | 84 | apt install gparted -y 85 | 86 | 87 | 88 | Também tem a opção o cfdisk para usar via cli ou fdisk 89 | 90 | ### CFdisk 91 | 92 | É que nem que igual ao fdisk, só que melhor! Apenas acho melhor. 93 | 94 | 95 | 96 | 97 | ### Docker 98 | 99 | 100 | 101 | Nos dias de hoje é quase impossivel viver sem um container pra resolver um problema por menor seja, pra evitar de quebrar meu ambiente, prefiro usar container. Mais informações aqui . 102 | 103 | curl -fsSl https://get.docker.com | sh 104 | 105 | 106 | ### Ansible 107 | 108 | 109 | 110 | Eu não sei vocês, mas eu não gosto de ter que ficar entrando em mais de 150 VMs para configurar a mesma coisa em cada uma, sendo que da pra automatizar, é como diz Buda "se ta no jogo é pra usar!". 111 | 112 | ### Anydesk e Teamviewer 113 | 114 | 115 | 116 | Como trabalho com acesso remoto para suporte aos usuários, é sempre bom ter uma ou mais opções de ferramentas para acesso remoto, prefiro o TeamViewer! 117 | 118 | - Anydesk 119 | - TeamViewer 120 | 121 | ### Remmina e xfreerdp 122 | 123 | 124 | 125 | 126 | Agora para acessar usando RDP, uso o Remmina e xfreerdp, a diferença é que o xfreerdp é via terminal. 127 | 128 | - xfreerdp 129 | - Remmina 130 | 131 | ### Nmap | OpenVAS | Shodan 132 | 133 | 134 | 135 | 136 | 137 | 138 | O Nmap é uma ferramenta bastente util no meu dia-a-dia, quando precisamos saber quais IPs temos disponiveis numa faixa de rede, para mapear portas, assim como até descobrir possiveis vulnerabilidades. 139 | 140 | O OpenVAS utilizo quando necessário para varrer um hosts especifico, segue a mesma ideia do nmap. 141 | 142 | Shodan, é meu bichinho de Deus, não deixe seu server com usuario e senha admin/admin . 143 | 144 | - Nmap 145 | 146 | apt install nmap -y 147 | 148 | - OpenVAS 149 | 150 | docker run -d -p 443:443 -e PUBLIC_HOSTNAME=myopenvas.example.org --name openvas mikesplain/openvas 151 | 152 | 153 | - Shodan 154 | 155 | Você pode instalar se quiser, ou usar direto no navegador mesmo! -------------------------------------------------------------------------------- /intro-a-redes/httpweb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/intro-a-redes/httpweb.png -------------------------------------------------------------------------------- /intro-a-redes/subrede.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/intro-a-redes/subrede.png -------------------------------------------------------------------------------- /kubernetes/ips-metallb.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: metallb.io/v1beta1 2 | kind: IPAddressPool 3 | metadata: 4 | name: default-address-pool 5 | namespace: metallb-system 6 | spec: 7 | addresses: 8 | - 192.168.1.240-192.168.1.250 # Substitua este intervalo pelo da sua rede 9 | --- 10 | apiVersion: metallb.io/v1beta1 11 | kind: L2Advertisement 12 | metadata: 13 | name: default 14 | namespace: metallb-system 15 | -------------------------------------------------------------------------------- /kubernetes/mani-ingress.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: networking.k8s.io/v1 2 | kind: Ingress 3 | metadata: 4 | name: app-k8s-ingress 5 | annotations: 6 | nginx.ingress.kubernetes.io/rewrite-target: / 7 | spec: 8 | rules: 9 | - host: app.local 10 | http: 11 | paths: 12 | - path: / 13 | pathType: Prefix 14 | backend: 15 | service: 16 | name: app-k8s-service 17 | port: 18 | number: 3000 19 | -------------------------------------------------------------------------------- /kubernetes/readme.md: -------------------------------------------------------------------------------- 1 | - [O que é o Kubernetes](#o-que-é-o-kubernetes) 2 | - [Arquitetura do k8s](#arquitetura-do-k8s) 3 | - [Conceitos-chave do k8s](#conceitos-chave-do-k8s) 4 | - [Instalando o cluster do k8s](#instalando-o-cluster-k8s) 5 | - [Incializando o cluster](#inicializando-o-cluster) 6 | - [Acessando o ngnix via browser](#acessando-o-nginx-via-browser) 7 | - [Referência](#referência) 8 | 9 | # O que é o Kubernetes? 10 | 11 |

De forma resumida o projeto Kubernetes foi desenvolvido pela Google, em meados de 2014, para atuar como um orquestrador de containers para a empresa. O Kubernetes(K8S), cujo termo signifca "timoneiro", é um projeto open source que conta com design e desenvolvimento baseados no projeto Borg, que também é da Google. Alguns outros produtos disponiveis no mercado,, tais como o Apache Mesos e o Cloud Foundry, também surgiram a partir do projeto Borg.

12 | 13 |

Como Kubernetes é uma palavra dificil de se pronunciar - e de se escrever - a comunidade simplesmente o apelidou de k8s, seguindo o padrão i18n (a letra "k" seguida por oito letras e o "s" no final), pronunciando-se simplesmente "kates".

14 | 15 | 16 | ## Arquitetura do k8s 17 | 18 |

Assim como os demais orquestradores disponiveis, o k8s também segue um modelo >control plane/workers, constituindo assim um cluster, onde para o seu funcionamento é recomendado no minimo três nós: o nó control-plane responsável (por padrão) pelo gerenciamento do cluster, e os demais como workers, executores das aplicações que queremos executar sobre esse cluster.

19 | 20 |

É possivel criar um cluster Kubernetes rodando em apenas um nó, porém é recomendado somente para fins de estudos e nunca executado em ambiente de produtivo. 21 |

22 | 23 |

Caso você queira utilizar o Kubernetes em sua maquina local, em seu desktop, existem diversas soluções que irão criar um cluster Kubernetes, utilizando máquinas virtuals ou o Docker, por exemplo. Com isso você poderá ter um cluster Kubernetes com diversos nós, porém todos eles rodando em sua maquina local, em seu desktop.

24 | 25 | Alguns exemplos são : 26 | 27 | - Kind : Uma ferramenta para execução de containers Docker que simulam o funcionamento de um cluster Kubernetes. É utilizado para fins didaticos, de desenvolvimento e testes. O Kind não deve ser utilizado para produção; 28 | 29 | - Minikube : Ferramenta para implementar um cluster Kubernetes localmente com apenas um nó. Muito utilizado para fins didáticos, de desenvolvimeno e testes. O Minikube não deve ser utilizado em produção; 30 | 31 | 32 | ## Conceitos-chave do k8s 33 | 34 |

É importante saber que a forma como o k8s gerencia os containers é ligeiramente diferente de outros orquestradores como o Docker Swarm, sobretudo devido ao fato de que ele não trata os containers diretamente, mas sim através de pods. Vamos conhecer alguns dos principais conceitos que envolvem o k8s a seguir: 35 | 36 | - Pod ; É o menor objeto do k8s. Como dito anteriormente, o k8s não trabalha com os containers diretamente, mas organiza-os dentro de pods, que são abstrações que dividem os mesmos recursos, como endereços, volumes, ciclos de CPU e memória. Um pod pode possuir varios conatiners; 37 | 38 | - Deployment : É um dos principais controllers utilizados. O deploymente, em conjunto com o ReplicaSet, garante que determinado número de réplicas de um pod esteja em execução nos nós workers do cluster. Além disso, o Deployment também é responsável por gerenciar o ciclo de vida das aplicações, onde caracteristicas associadas a aplicação, tais como imagem, porta, volumes e variaves de ambiente, podem ser especificados em arquivos do tipo yaml ou json para posteriormente serem passados como parametro para o kubectl executar o deployment. Esta ação pode ser executada tanto para criação quanto para atualização e remoção do deployment; 39 | 40 | - ReplicaSet : É um objeto responsável por garantir a quantidade de pods em execução no nó; 41 | 42 | - Services : É um forma de você expor a comunicação através de um ClusterIP, NodePort ou LoadBalancer para distribuir as requisições entre os diversos Pods daquele Deployment. Funciona como um balanceador de carga. 43 | 44 | ## Instalando o cluster k8s 45 | 46 | Aqui iremos focar na instalação utilizando o kubeadm, que é uma das formas mais antigas para a criação de um cluster kubernetes. Mas existem outras formas de instalar, como kubespray que utiliza Ansible para implementar e gerenciar o cluster. 47 | 48 | - Pre-requesitos 49 | - Linux 50 | - 2 GB de RAM ou mais por máquina 51 | - 2 CPUs ou mais 52 | - Conexão de rede entre todos os nodes no cluster 53 | 54 | ### Desativando o uso do swap no sistema 55 | 56 | Primeiro, vamos desativar a utilização de swap no sistema. Isso é necessário porque o Kubernetes não trabalha bem com swap ativado: 57 | 58 | sudo swapoff -a 59 | 60 | ### Carregando os módulos do kernel 61 | 62 | Agora, vamos carregar os módulos do kernel necessários para o funcionamento do Kubernetes: 63 | 64 | cat < 123 | 124 | 125 | Substitua "O IP QUE VAI FALAR COM OS NODES" pelo endereço IP da máquina que está atuando como control plane. 126 | 127 | 128 |

Ao terminar o processo do kubeadm, teremos no final a mensagem abaixo : 129 | 130 | 131 | To start using your cluster, you need to run the following as a regular user: 132 | 133 | mkdir -p $HOME/.kube 134 | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 135 | sudo chown $(id -u):$(id -g) $HOME/.kube/config 136 | 137 | Alternatively, if you are the root user, you can run: 138 | 139 | export KUBECONFIG=/etc/kubernetes/admin.conf 140 | 141 | You should now deploy a pod network to the cluster. 142 | Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: 143 | https://kubernetes.io/docs/concepts/cluster-administration/addons/ 144 | 145 | Then you can join any number of worker nodes by running the following on each as root: 146 | 147 | kubeadm join 172.31.57.89:6443 --token if9hn9.xhxo6s89byj9rsmd \ 148 | --discovery-token-ca-cert-hash sha256:ad583497a4171d1fc7d21e2ca2ea7b32bdc8450a1a4ca4cfa2022748a99fa477 149 |

150 | 151 | Basta seguir os passos informados na mensagem, para fazer com que os workers se juntem ao cluster. Após executar o join em cada worker node, vá até o node que criamos para ser o control plane, e execute: 152 | 153 | kubectl get nodes 154 | 155 | 156 | NAME STATUS ROLES AGE VERSION 157 | k8s-01 NotReady control-plane 4m v1.26.3 158 | k8s-02 NotReady 3m v1.26.3 159 | k8s-03 NotReady 3m v1.26.3 160 | 161 | Agora você já consegue ver que os dois novos nodes foram adicionados ao cluster, porém ainda estão com o status Not Ready, pois ainda não instalamos o nosso plugin de rede para que seja possível a comunicação entre os pods. Vamos resolver isso agora. 162 | 163 | ### Instalando o Weave Net 164 | 165 | Agora que o cluster está inicializado, vamos instalar o Weave Net: 166 | 167 | kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml 168 | 169 | 170 | Aguarde alguns minutos até que todos os componentes do cluster estejam em funcionamento. Você pode verificar o status dos componentes do cluster com o seguinte comando: 171 | 172 | kubectl get pods -n kube-system 173 | 174 | 175 | kubectl get nodes 176 | 177 | 178 | NAME STATUS ROLES AGE VERSION 179 | k8s-01 Ready control-plane 7m v1.26.3 180 | k8s-02 Ready 6m v1.26.3 181 | k8s-03 Ready 6m v1.26.3 182 | 183 | 184 | O Weave Net é um plugin de rede que permite que os pods se comuniquem entre si. Ele também permite que os pods se comuniquem com o mundo externo, como outros clusters ou a Internet. Quando o Kubernetes é instalado, ele resolve vários problemas por si só, porém quando o assunto é a comunicação entre os pods, ele não resolve. Por isso, precisamos instalar um plugin de rede para resolver esse problema. 185 | 186 | ### O que é o CNI? 187 | 188 |

CNI é uma especificação e conjunto de bibliotecas para a configuração de interfaces de rede em containers. A CNI permite que diferentes soluções de rede sejam integradas ao Kubernetes, facilitando a comunicação entre os Pods (grupos de containers) e serviços.

189 | 190 |

Com isso, temos diferentes plugins de redes, que seguem a especificação CNI, e que podem ser utilizados no Kubernetes. O Weave Net é um desses plugins de rede.

191 | 192 |

Pronto, já temos o nosso cluster inicializado e o Weave Net instalado. Agora, vamos criar um Deployment para testar a comunicação entre os Pods.

193 | 194 | kubectl create deployment nginx --image=nginx --replicas 3 195 | 196 | 197 | kubectl get pods -o wide 198 | 199 | 200 | NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 201 | nginx-748c667d99-8brrj 1/1 Running 0 12s 10.32.0.4 k8s-02 202 | nginx-748c667d99-8knx2 1/1 Running 0 12s 10.40.0.2 k8s-03 203 | nginx-748c667d99-l6w7r 1/1 Running 0 12s 10.40.0.1 k8s-03 204 | 205 | 206 | Pronto, nosso cluster está funcionando e os Pods estão em execução em diferentes nós. 207 | 208 | ### Acessando o nginx via browser 209 | 210 |

Para que seja possivel que você acesse a aplicação do ngnix que criamos via browser é necessario que façamos o expose do serviço(de grosso modo, expor a porta 80). Podemos fazer isso de 3 formas diferentes: 211 | 212 | - ClusterIP : 213 | 214 | kubectl expose pod nginx ou kubectl expose pod nginx --type=ClusterIP 215 | 216 | Fará que a comunicação aconteça apenas dentro do cluster, interanmente. 217 | 218 | - NodePort : 219 | 220 | kubectl expose pod nginx --type=NodePort --port=80 221 | 222 | Ao rodarmos kubectl get svc veremos que teremos a porta 80 do pod, que para acessar precisamos ir na porta 32XXX/TCP 223 | 224 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 225 | nginx NodePort 10.96.0.1 80:32xxx/TCP 1m 226 | Acessando http://ip-do-cluster:32XXX 227 | 228 | 229 | - LoadBalancer : Para pode acessar dessa forma, seria necessário que o cluser estivesse numa cloud, porém temos como fazer isso localmente, em ambiente on-premise, utilizando do metalLB 230 | 231 | 232 | kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer 233 | 234 | 235 | kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml 236 | 237 | 238 | 239 | - Crie um arquivo de configuração para o IPAddressPool: 240 | 241 | Você precisa definir o intervalo de IPs que o MetalLB pode usar. Crie um arquivo chamado metallb-config.yaml com o seguinte conteúdo: 242 | 243 | 244 | apiVersion: metallb.io/v1beta1 245 | kind: IPAddressPool 246 | metadata: 247 | name: default-address-pool 248 | namespace: metallb-system 249 | spec: 250 | addresses: 251 | - 192.168.1.240-192.168.1.250 # Substitua este intervalo pelo da sua rede 252 | --- 253 | apiVersion: metallb.io/v1beta1 254 | kind: L2Advertisement 255 | metadata: 256 | name: default 257 | namespace: metallb-system 258 | 259 | 260 | Aqui, estamos configurando um pool de IPs no intervalo de 192.168.1.240 a 192.168.1.250. Substitua esse intervalo de IPs por um disponível na sua rede. 261 | 262 | - Aplique o arquivo de configuração: 263 | 264 | Depois de criar o arquivo metallb-config.yaml, aplique-o ao cluster: 265 | 266 | 267 | kubectl apply -f metallb-config.yaml 268 | 269 | - Verifique se o IPAddressPool foi criado corretamente: 270 | 271 | kubectl get ipaddresspool -n metallb-system 272 | 273 | Rodando kubectl get svc, você vera que na coluna EXTERNAL-IP agora teremos o IP para acessar diretamente a aplicação sem ter que passar a porta. 274 | 275 | ### Instalação do ingress 276 | 277 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml 278 | 279 | kubectl create ingress app-k8s-ingress --rule="app.local/*=app-k8s-service:3000" --dry-run=client -o yaml > ingress.yaml 280 | 281 | 282 | ## K8S com multi-masters 283 | 284 | Procurei bastenta pelo Google uma forma de fazer um cluster k8s com multi-master, multi control-planes, até que finalmaente encontrei um projeto no github que fazia usando HAproxy, pois bem, vou deixar as informações aqui mais resumidas,e no fim do doc deixarei o link da referência. 285 | 286 | ### Instalando e configurando HAproxy 287 | 288 | > apt install haproxy -y 289 | 290 | > vim /etc/haproxy/haproxy.cfg 291 | 292 | #para acessar via web e ver as estatisticas do haproxy 293 | listen stats 294 | bind *:8404 295 | mode http 296 | stats enable 297 | stats uri /stats 298 | stats refresh 10s 299 | stats show-node 300 | stats show-legends 301 | #stats auth admin:senha123 302 | 303 | #o ip que vai receber as requisições 304 | frontend k8s-api 305 | bind *:6443 306 | mode tcp 307 | option tcplog 308 | default_backend k8s-masters 309 | 310 | #os ips onde vai bater 311 | backend k8s-masters 312 | mode tcp 313 | balance roundrobin 314 | option tcp-check 315 | default-server inter 3s fall 3 rise 2 316 | server master1 192.168.231.137:6443 check 317 | server master2 192.168.231.138:6443 check 318 | 319 | Salve e restart o service do haproxy. 320 | 321 | Agora rode o comando abaixa uma unica vez e em apenas um dos nodes control-planr: 322 | 323 | > sudo kubeadm init --control-plane-endpoint "haproxy-ip:6443" --upload-certs 324 | 325 | substitua haproxy-ip pelo ip do seu haproxy, lembre de remover as aspas. 326 | 327 | Ao concluir a criação, rode os comandos que forem exibidos, se atente agora que foi gerado o kubeadm join para worker e para control-plane : 328 | 329 | kubeadm join haproxy-01:6443 --token 42i35p.wgxvowimiy4ub9mp 330 | --discovery-token-ca-cert-hash sha256:20a5adc8095fd25cf2d9a72cc89362818c8dbb7ac37b4461900526ae65ba99e5 331 | --control-plane --certificate-key 018a256e7ff705be89224231e184f6cee8bdf019fec1d72780da8f3d78db2685 332 | 333 | Agora aguarde e verifique no control-plane-01 : 334 | 335 | > kubectl get nodes 336 | 337 | Daqui pra frente, só seguir o que já sabemos. 338 | 339 | # Referências 340 | 341 | - MêsDoKubernets - LinuxTips 342 | - k8s-cluster-ha -------------------------------------------------------------------------------- /linux/README.MD: -------------------------------------------------------------------------------- 1 | # Linux - Básico 2 | 3 | - [Sobre](#sobre) 4 | - [Estrutura de diretórios](#estrutura-de-diretórios) 5 | - [Comandos básicos](#comandos-básicos) 6 | - [Permissões](#permissões) 7 | - [Editores de texto](#editores-de-texto) 8 | - [Compactadores de arquivos](#compactadores-de-arquivos) 9 | - [Gerenciamento de pacotes](#gerenciamento-de-pacotes) 10 | - [Contribuindo](#contribuindo) 11 | 12 | ### Sobre 🐧 13 | 14 | O Linux é um sistema operacional de código aberto baseado no kernel Linux, desenvolvido por Linus Torvalds em 1991. Ele é conhecido pela sua estabilidade, segurança e flexibilidade, sendo amplamente utilizado em servidores, dispositivos embarcados e computadores pessoais. Linus Torvalds, um programador finlandês, iniciou o projeto como um hobby e o transformou em um dos sistemas operacionais mais influentes do mundo. O Linux é distribuído sob a licença GNU General Public License (GPL) e possui uma comunidade global de desenvolvedores contribuindo para seu aprimoramento contínuo. 15 | 16 | 17 | ### Estrutura de diretórios 📁 18 | 19 | No Linux temos uma estrutura de diretórios diferente da que estamos acostumados no Windows, sendo assim segue os diretórios e suas devidas "funções" : 20 | 21 | - 📁 / : o / é o nosso diretório raiz, equivalente o "disco local c:\ . 22 | 23 | - 📁 /bin : aqui temos alguns binários que se assemelham aos .exe do Windows, sendo aqui binários que o usuário consegue executar normalmente. 24 | 25 | - 📁 /sbin : binários do sistema que seria para o superusuário executar. 26 | 27 | - 📁 /etc : aqui ficam os arquivos de configuração do sistema e das aplicações. 28 | 29 | - 📁 /tmp : como o nome sugere, esse path é para arquivos temporários. 30 | 31 | - 📁 /boot : arquivos do sistema ds boot. 32 | 33 | - 📁 /opt : para aplicações não oficiais. 34 | 35 | - 📁 /dev : referente a dispositivos, disco, unidades usb, entre outros. 36 | 37 | - 📁 /usr : binários de usuários comuns de sistema e aplicações. 38 | 39 | - 📁 /home : aqui normalmente são criadas as pastas referente aos usuários quando criados/adicionados com uma pasta no /home. 40 | 41 | - 📁 /var : aqui vão os arquivos de tamanhos variáveis, normalmente arquivos de Log. 42 | 43 | - 📁 /mnt e 📁 /media : são onde normalmente montamos unidades de disco. 44 | 45 | - 📁 /lib : aqui ficam as bibliotecas e módulos do kernel. 46 | 47 | 48 | ### Comandos básicos 49 | 50 | É importante saber alguns comandos ai básicos e essenciais quando você quer entrar na area de T.I, tendo em vista que boa parte dos servidores rodam uma distribuição Linux. 51 | 52 | Primeira coisa a se fazer é abrir o terminal, use o atalho ctrl+alt+t(a não ser que você tenha alterado o atalho de abrir o terminal) , abriu? certo. 53 | Dica : para todos os comandos, você pode usar o --help, obtendo assim informações e variações sobre o comando! 54 | 55 | - ls : Lista os arquivos de um diretório 56 | - Com o ls você consegue listar tudo que tem dentro do diretório corrente ou de um path especifico. 57 | - ls -lha : Você consegue ver arquivos e diretórios ocultos, obtendo também informações sobre as permissões. 58 | 59 | - cd : Muda o diretório atual 60 | - Você pode navegar entra os diretórios usando cd seguindo do path,exemplo : 61 | 62 | cd /home/$USER/Downloads 63 | 64 | - pwd: Mostra o diretório atual 65 | - Ao dar o comando pwd, você consegue ver o path do seu diretório corrente. 66 | 67 | - mkdir : Cria diretórios 68 | - Como o próprio nome diz, você pode criar diretórios 69 | 70 | mkdir novo_diretorio 71 | - Caso queira criar o diretório "pai" seguido do sub-diretório: 72 | 73 | mkdir -p /diretorio/sub-diretorio/ 74 | 75 | - rm e rmdir : 76 | - rm , você usa para remover arquivos de um diretório 77 | - Se o diretório não estiver vazio, você pode passar -r como parametro rm -r /diretorio/ 78 | - Se for um diretório vazio, você pode usar o rmdir 79 | 80 | 81 | ### Permissões 82 | 83 | É importante que arquivos e diretórios tenham permissões e por isso precisamos ter um conhecimento básico sobre permissões. 84 | 85 | Quando você lista um arquivo por exemplo : 86 | - ls -lha /etc/hosts 87 | 88 | você tem retorno de algo assim : 89 | 90 | -rwxr-xr-x hosts 91 | 92 | Onde as permissões se dão por 93 | 94 | - - : ausência de permissão 95 | - r : permissão de leitura 96 | - w : permissão de escrita 97 | - x : permissão de execução 98 | 99 | e elas são representadas de forma octal como : 100 | 101 | - 0 102 | - 4 103 | - 2 104 | - 1 105 | 106 | Exemplo pratico, quando você cria um script, por padrão ele não vai poder ser executado pois ele não tem permissão de execução estando como : 107 | 108 | - rw-rw-rw- 109 | 110 | para que seja possível executar temos que dar permissão com o comando "chmod" : 111 | 112 | chmod 777 script.sh 113 | 114 | o ideal é dar apenas a permissão necessária, evite usar 777. Também podemos usar dessa forma : 115 | 116 | chmod u=7,g=7,o=5 script.sh 117 | 118 | Assim apenas o usuário e o grupo dono podem executar. 119 | 120 | ### Editores de texto 121 | 122 | Vamos considerar que estamos lhe dando com servidores Linux onde não temos interface gráfica e muito menos um mouse, então é importante saber usar os editores via terminal, eu posso sugerir algumas opções : 123 | 124 | - Vi ou Vim : Diria que presente em todas distribuições, um pouco de paciência para aprender a utilizar, mas depois que aprender acho difícil querer voltar pra outro editor. 125 | 126 | - Nano : É uma opção mais "amigável" digamos assim, pois você consegue ver uma "interface" com os atalhos que precisa para salvar, pesquisar,etc. 127 | 128 | Aprenda a usar o Vim! 129 | 130 | Vou facilitar a vida de vocês : 131 | 132 | - vim /etc/hosts 133 | 134 | aqui apenas abrimos o arquivo de hosts, agora segue alguns comandos : 135 | 136 | - i : para que você possa editar o arquivo aperte a tecla "i" note que na parte inferior esquerda vai ficar como -- INSERT -- . 137 | 138 | - esc : para sair do modo insert basta apertar "esc". 139 | 140 | - :q : permite que você saia do arquivo desde que não tenha feito alterações, caso tenho alterado use :q! a "!" força a saída. 141 | 142 | - :w : permite gravar/salvar a alteração , para salvar e sair do arquivo user :w! . 143 | 144 | - yy : copiar linha inteira 145 | 146 | - p : colar linha 147 | 148 | - dd : deletar linha 149 | 150 | - x: Excluir o caractere sob o cursor. 151 | 152 | - dw: Excluir a palavra sob o cursor. 153 | 154 | - use as teclas de seta para mover o cursor. 155 | 156 | - h: Mover para a esquerda. 157 | 158 | - j: Mover para baixo. 159 | 160 | - k: Mover para cima. 161 | 162 | - l: Mover para a direita. 163 | 164 | - gg: Ir para o início do arquivo. 165 | 166 | - G: Ir para o final do arquivo. 167 | 168 | - 0 (zero): Ir para o início da linha. 169 | 170 | - $: Ir para o final da linha. 171 | 172 | - Ctrl + F: Rolar uma página para frente. 173 | 174 | - Ctrl + B: Rolar uma página para trás 175 | 176 | 177 | ### Compactadores de arquivos 178 | 179 | No Linux, compactadores são ferramentas usadas para comprimir arquivos e diretórios, reduzindo seu tamanho para economizar espaço em disco e facilitar o compartilhamento. Abaixo estão alguns dos compactadores mais comuns no ambiente Linux: 180 | 181 | 182 | - #### tar: 183 | O "tar" não é exatamente um compactador, mas uma ferramenta de arquivamento que combina vários arquivos em um único arquivo (geralmente com a extensão ".tar"). No entanto, é frequentemente usado em conjunto com outros programas compactadores, como gzip ou bzip2, para criar arquivos compactados. 184 | 185 | Exemplo de como criar um arquivo tar: 186 | 187 | 188 | tar -cvf arquivo.tar arquivo1 arquivo2 diretorio/ 189 | 190 | - #### gzip: 191 | 192 | É um compactador muito utilizado e rápido, que comprime arquivos individualmente, adicionando a extensão ".gz" ao arquivo compactado. 193 | 194 | Exemplo de como compactar um arquivo usando gzip: 195 | 196 | gzip arquivo.txt 197 | 198 | - #### bzip2: 199 | Oferece uma taxa de compressão mais alta do que o gzip, mas é um pouco mais lento. Gera arquivos com a extensão ".bz2". 200 | 201 | Exemplo de como compactar um arquivo usando bzip2: 202 | 203 | 204 | bzip2 arquivo.txt 205 | 206 | - #### zip: 207 | 208 | Embora seja mais comum em sistemas Windows, também está disponível no Linux. Compacta arquivos e diretórios em um arquivo com a extensão ".zip". 209 | 210 | Exemplo de como compactar um arquivo usando zip: 211 | 212 | zip arquivo.zip arquivo1 arquivo2 diretorio/ 213 | 214 | - #### unzip: 215 | Permite descompactar arquivos compactados no formato zip. 216 | 217 | Exemplo de como descompactar um arquivo zip: 218 | 219 | unzip arquivo.zip 220 | 221 | Essas são algumas das ferramentas de compactação mais comuns no Linux. Cada uma possui suas características, como velocidade e taxa de compressão, portanto, a escolha depende das necessidades específicas. Lembre-se de consultar a documentação de cada comando para obter mais opções e informações detalhadas. 222 | 223 | 224 | ### Gerenciamento de pacotes 225 | 226 | No Linux, o gerenciamento de pacotes facilita a instalação, atualização, configuração e remoção de software de maneira organizada e automatizada. O gerenciador de pacotes é um conjunto de ferramentas e regras que permitem aos usuários e administradores de sistemas gerenciar de forma eficiente os programas e bibliotecas do sistema. 227 | 228 | No Linux, existem várias ferramentas populares de gerenciamento de pacotes, cada uma associada a uma distribuição específica. As duas principais famílias de gerenciadores de pacotes são: 229 | 230 | #### Gerenciadores de pacotes baseados em RPM (Red Hat Package Manager): 231 | 232 | - exemplo: Red Hat Enterprise Linux (RHEL), CentOS, Fedora, openSUSE. 233 | 234 | - Ferramentas: "yum" (RHEL e CentOS versões mais antigas), "dnf" (RHEL e CentOS versões mais recentes, Fedora e openSUSE). 235 | 236 | 237 | #### Gerenciadores de pacotes baseados em DEB (Debian Package): 238 | 239 | - exemplo: Debian, Ubuntu, Linux Mint. 240 | 241 | - Ferramentas: "apt" (Advanced Package Tool), "apt-get", "aptitude". 242 | 243 | Os gerenciadores de pacotes facilitam as seguintes tarefas: 244 | 245 | - Instalação de pacotes: Permite que os usuários instalem novos softwares e suas dependências automaticamente, baixando-os dos repositórios oficiais da distribuição. 246 | 247 | Exemplo de instalação de um pacote usando "apt" (Debian/Ubuntu): 248 | 249 | sudo apt install nome-do-pacote 250 | 251 | Exemplo de instalação de um pacote usando "dnf" (Fedora/RHEL): 252 | 253 | sudo dnf install nome-do-pacote 254 | 255 | - Atualização de pacotes: Mantém os softwares atualizados com as versões mais recentes disponíveis nos repositórios oficiais. 256 | 257 | Exemplo de atualização de pacotes usando "apt" (Debian/Ubuntu): 258 | 259 | sudo apt update 260 | sudo apt upgrade 261 | 262 | Exemplo de atualização de pacotes usando "dnf" (Fedora/RHEL): 263 | 264 | sudo dnf update 265 | 266 | - Remoção de pacotes: Permite que os usuários removam os softwares instalados anteriormente de forma limpa, incluindo suas dependências desnecessárias. 267 | 268 | Exemplo de remoção de um pacote usando "apt" (Debian/Ubuntu): 269 | 270 | sudo apt remove nome-do-pacote 271 | 272 | Exemplo de remoção de um pacote usando "dnf" (Fedora/RHEL): 273 | 274 | 275 | sudo dnf remove nome-do-pacote 276 | 277 | - Pesquisa de pacotes: Permite que os usuários encontrem pacotes específicos disponíveis nos repositórios. 278 | 279 | Exemplo de pesquisa por um pacote usando "apt" (Debian/Ubuntu): 280 | 281 | apt search nome-do-pacote 282 | 283 | Exemplo de pesquisa por um pacote usando "dnf" (Fedora/RHEL): 284 | 285 | 286 | dnf search nome-do-pacote 287 | 288 | Os gerenciadores de pacotes são uma das características distintivas do Linux e tornam a administração do sistema mais eficiente, segura e organizada. Eles ajudam os usuários a manterem seus sistemas atualizados e a instalar rapidamente novos softwares sem a necessidade de buscar e baixar pacotes manualmente. Além disso, garantem a resolução automática de dependências, evitando problemas de compatibilidade e conflitos entre diferentes softwares instalados. 289 | 290 | ## Contribuindo 291 | 292 | Qualquer contribuição que você fizer será bem vinda, analisada e se viável, atualizada no projeto! 293 | 294 | - 1.Faça um fork do projeto 295 | - 2.Clone o seu fork para sua maquina(git clone url-do-projeto.git) 296 | - 3.Crie um branch para sua modificação/atualização(git checkout -b seu-branch) 297 | - 4.Adicione suas alterações ao git(git add .) 298 | - 5.Confirme suas alterações(git commit -m "texto descritivo do que fez") 299 | - 6.Suba seu branch(git push origin seu-branch) 300 | - 7.Faça uma solicitação de merge request para o branch : updates -------------------------------------------------------------------------------- /mysql/readme.md: -------------------------------------------------------------------------------- 1 | # MySQL: Guia Rápido para CRUD e Comandos Essenciais 2 | 3 | ## Introdução 4 | 5 | MySQL é um sistema de gerenciamento de banco de dados relacional de código aberto que é amplamente utilizado para armazenar e gerenciar dados. Este guia fornece uma visão geral básica dos comandos SQL para realizar operações CRUD (Create, Read, Update, Delete) e outros comandos essenciais. 6 | 7 | ## Instalação 8 | 9 | Caso esteja utilizando Linux baseado em Debian : 10 | - apt install mysql-server -y 11 | 12 | Caso esteja em Windows, você pode optar por instalar o XAMPP. 13 | 14 | ### Conectar ao MySQL 15 | 16 | Para começar, é necessário conectar ao servidor MySQL. Utilize o seguinte comando: 17 | 18 | 19 | - mysql -u seu_usuario -p 20 | 21 | Digite a senha quando solicitado. 22 | 23 | ### Criar um Banco de Dados 24 | 25 | Para criar um novo banco de dados, utilize o comando: 26 | 27 | - CREATE DATABASE nome_do_banco; 28 | 29 | ### Selecionar um Banco de Dados 30 | 31 | Selecione um banco de dados específico para trabalhar: 32 | 33 | - USE nome_do_banco; 34 | 35 | ### Criar uma Tabela 36 | 37 | Para criar uma tabela, especifique os nomes das colunas e os tipos de dados: 38 | 39 | CREATE TABLE nome_da_tabela ( 40 | coluna1 tipo1, 41 | coluna2 tipo2, 42 | ..., 43 | PRIMARY KEY (coluna_primaria) 44 | ); 45 | 46 | ### Inserir Dados (Create) 47 | 48 | Adicione registros a uma tabela: 49 | 50 | INSERT INTO nome_da_tabela (coluna1, coluna2, ...) VALUES (valor1, valor2, ...); 51 | 52 | ### Consultar Dados (Read) 53 | 54 | Recupere dados de uma tabela: 55 | 56 | SELECT * FROM nome_da_tabela; 57 | 58 | ### Filtre os resultados com uma condição: 59 | 60 | SELECT * FROM nome_da_tabela WHERE condicao; 61 | 62 | ### Atualizar Dados (Update) 63 | 64 | Modifique registros existentes: 65 | 66 | UPDATE nome_da_tabela SET coluna1 = novo_valor1, coluna2 = novo_valor2 WHERE condicao; 67 | 68 | ### Excluir Dados (Delete) 69 | 70 | Remova registros de uma tabela: 71 | 72 | DELETE FROM nome_da_tabela WHERE condicao; 73 | 74 | ### Outros Comandos Essenciais 75 | 76 | Mostrar Tabelas 77 | 78 | Exiba todas as tabelas em um banco de dados: 79 | 80 | SHOW TABLES; 81 | 82 | 83 | Estes são comandos SQL básicos para realizar operações CRUD e outros comandos essenciais no MySQL. Lembre-se de substituir os valores específicos, como "seu_usuario", "nome_do_banco", etc., pelos seus próprios. Indico que busque por mais informações, comandos, etc aqui . -------------------------------------------------------------------------------- /terraform/README.MD: -------------------------------------------------------------------------------- 1 | # Índice 2 | 3 | - [Sobre](#sobre) 4 | - [O que é cloud](#o-que-é-cloud) 5 | - [Instalação](#instalação) 6 | - [EC2, S3 e IAM](#ec2-s3-e-iam) 7 | - [Como funciona a comunicação com a cloud?](#como-funciona-a-comunicação-com-a-cloud) 8 | - [Instalação](#instalação) 9 | - [Explicando o HCL](#explicando-o-hcl) 10 | - [Iniciando o terraform](#iniciando-o-terraform) 11 | - [Comandos básicos](#comandos-básicos) 12 | - [Criando um instancia EC2](#criando-um-instancia-ec2) 13 | 14 | 15 | ## Sobre 16 | 17 | O Terraform, é uma ferramenta de infraestrutura como código(Infraestructure as Code - IAC), desenvolvida pela HashiCorp. 18 | A ideia é que você descreva a infraestrutura desejada em um arquivo de configuração escrito em formato HCL - HashiCorp Configuration Language, e a partir dai o Terraform cuida da implantação. 19 |
20 | Com o Terraform é possivel provisionar diversos recursos em diversos providers de nuvem, como : 21 | - AWS 22 | - Azure 23 | - Google Cloud Platform 24 | 25 | Além de recursos on-premise(infraestrutura local). 26 | 27 | ## O que é cloud 28 | 29 | Segue um trecho retirado da Wikipédia : 30 | 31 | Computação em nuvem (em inglês, cloud computing) é um termo coloquial para a disponibilidade sob demanda de recursos do sistema de computador, especialmente armazenamento de dados e capacidade de computação, sem o gerenciamento ativo direto do utilizador. O termo geralmente é usado para descrever centros de dados disponíveis para muitos utilizadores pela Internet. Nuvens em grande escala, predominantes hoje em dia, geralmente têm funções distribuídas em vários locais dos servidores centrais. Se a conexão com o utilizador for relativamente próxima, pode ser designado um servidor de borda. 32 |
33 | Ou seja, nada mais é do que uma abstração de serviços. 34 | 35 | ## EC2, S3 e IAM 36 | 37 | É necessário que você tenha uma conta gratuita mesmo na AWS! 38 |
39 | 40 | Antes de irmos diretamente ao terraform, precisamos conhecer esses serviços que vão ser de uso agora nesse momento. 41 | 42 | - EC2 : Na AWS EC2, são as maquinas virtuais, VMs. 43 | - S3 : Na AWS S3, é o serviço de storage/armazenamento. 44 | - IAM : Na AWS IAM , é um serviço de gerenciamento/controle de acessos. 45 | 46 | Nesse momento, você deve criar um S3 e o IAM, abaixo segue o passo-a-passo: 47 | 48 | - S3 Getting started with Amazon S3 - Demo 49 | 50 | - IAM How do I set up an IAM user and sign in to the AWS Management Console using IAM credentials? 51 | 52 | 53 | ## Como funciona a comunicação com a cloud? 54 | 55 | A comunicação com a cloud é feita através de uma API, então quando estamos no console da AWS, clicando, estamos basicamente, enviando nossa requisição para a API e ela manda para cloud, sendo assim, o Terraform faz o mesmo papel da console da AWS. No curso esta sendo usado os serviços da AWS, por ser a cloud mais utilizada, mas os conceitos apresentados aqui podem ser utilizados em qualquer outra cloud. 56 | 57 | ## Instalação : 58 | 59 | Podemos usar o terraform de varias maneiras, seja instalando na sua maquina ou com um container docker, então vou deixar aqui as duas formas : 60 | 61 | ### Instalando na maquina 62 | 63 | wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg 64 | 65 | echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list 66 | 67 | sudo apt update && sudo apt install terraform 68 | 69 | ### Docker 70 | 71 | docker run -dit -v /path:/path -w /path --entrypoint "" hashicorp/terraform:light sh 72 | 73 | - Explicando o docker : 74 | - no path é interessante você passar o seu path de estudos onde estão seus arquivos .tf que vão ser utilizados pelo terraform 75 | - o -w é de workdir, para indicar que o container ao você acessar no bash, já ir para o diretorio de trabalho, no caso o path que você definiu 76 | - o --entrypoint, é por que o container do terraform já vai querer iniciar executando o binário, então para ele não iniciar passamos o entrypoint vazio 77 | 78 | ## Explicando o HCL 79 | 80 | O arquivo HCL, é como um .yml melhorado digamos assim, e se assemelha ao Vagrantfile saca? Então vamos pegar a informação com base na documentação oficial aqui. 81 |
82 | basicamente ele é composto por : 83 | - Blocks 84 | - Arguments 85 | - Identifiers 86 |


87 | 88 | 89 | 90 | provider "aws" { 91 | region = "us-east-1" 92 | version = "~> 2.0" 93 | } 94 | 95 | terraform { 96 | backend "s3" { 97 | # Lembre de trocar o bucket para o seu, não pode ser o mesmo nome 98 | bucket = "nome-do-seu-bucket" 99 | key = "terraform-test.tfstate" 100 | region = "us-east-1" 101 | } 102 | } 103 | 104 | ## Iniciando o terraform 105 | Para iniciar o diretório do terraform, semelhante ao git,vagrant, etc, usamos o comando terraform init, isso vai fazer com que seja criada um diretório .terraform, a partir de agora poderemos usar os demais comandos do terraform... opa, deu erro ai ne? Lembra que falei pra criar(assistir ao video de como criar) o IAM, pois bem, o erro é exatamente referente a falta de credenciais de acesso, para contornar isso use variáveis de ambiente : 106 | 107 | - export AWS_ACCESS_KEY_ID=a-id-gerada-no-iam 108 | - export AWS_SECRET_ACCESS_KEY=a-chave-secreta-gerada 109 | 110 | Rode novamente o terraform init 111 | 112 | ## Comandos básicos 113 | 114 | Aqui veremos os comandos mais utilizados no dia-a-dia! 115 | 116 | - init : para iniciarmos um diretório 117 | - plan : ele serve para fazer um "check" do seu arquivo HCL com o state e o que já tem criado na infra/cloud 118 | - apply : ele vai criar de fato o que foi definido no HCL, se for para criar uma EC2, será então criada nesse comando. 119 | - destroy : como o nome diz, vai destruir o que foi criado com base no HCL. 120 | 121 | É importante lembrar de que ao rodar o plan, execute junto do parâmetro -out:path : 122 | 123 | terraform plan -out ec2 124 | 125 | e quando for dar o apply usar: 126 | 127 | terraform apply ec2 128 | 129 | ## Criando um instancia EC2 130 | 131 | Para criar nossa instancia EC2 a partir do terraform, segue abaixo o nosso código base: 132 | 133 | resource "aws_instance" "web_lab" { 134 | ami = "ami-053b0d53c279acc90" 135 | instance_type = "t2.micro" 136 | 137 | tags = { 138 | Name = "webserver_lab" 139 | } 140 | } 141 | 142 | o recurso(resource) utilizado para provisionar EC2 na AWS, é o "aws_instance", e dentro do bloco passamos a ami da imagem referente a region onde você quer criar, essa é referente a us-east-1, dessa forma vamos criar uma instancia EC2 padrão free. 143 |
144 | Agora quando você rodar : terraform plan -out ec2 , o terraform vai identificar que será criada uma instancia, bastando então você aplicar e aguardar a criação! 145 | 146 | - Quando criamos uma instancia dessa forma, ela não vai ter um par de chaves para acesso SSH, então você pode fazer da seguinte maneira, crie um par de chaves usando : ssh-keygen,e dentro do seu arquivo .tf passe o seguinte bloco : 147 | 148 | 149 | resource "aws_key_pair" "deployer" { 150 | key_name = "sua_chave.pub" 151 | public_key = file("/root/.ssh/sua_chave.pub") 152 | } 153 | e dentro do bloco da instancia, coloque: 154 | 155 | key_name = aws_key_pair.deployer.key_name 156 | 157 | ## Organizando seu ambiente 158 | 159 | - A partir de agora vamos trabalhar de forma mais organizada, para criarmos uma boa pratica na criaçao das nossas instancias EC2 usando o Terraform. 160 | 161 | - Nosso ambiente de trabalho será agora da seguinte forma : 162 | 163 | 📁 app_webserver 164 | - main.tf 165 | 166 | 📁 modules 167 | - security_groups.tf 168 | 169 | 📁 keys_aws 170 | - security_groups.tf -------------------------------------------------------------------------------- /terraform/ec2.tf: -------------------------------------------------------------------------------- 1 | resource "aws_instance" "webserver_lab" { 2 | ami = "ami-053b0d53c279acc90" 3 | instance_type = "t2.micro" 4 | key_name = aws_key_pair.deployer.key_name 5 | vpc_security_group_ids = [aws_security_group.ssh_access.id] 6 | 7 | tags = { 8 | Name = "webserver_lab" 9 | } 10 | } -------------------------------------------------------------------------------- /terraform/laboratorio-01/lab-01/ec2.tf: -------------------------------------------------------------------------------- 1 | resource "aws_instance" "laboratorio-01" { 2 | ami = "ami-053b0d53c279acc90" 3 | instance_type = "t2.micro" 4 | key_name = aws_key_pair.deployer.key_name 5 | #vpc_security_group_ids = [aws_security_group.ssh_access.id] 6 | 7 | user_data = file("apache.sh") 8 | 9 | 10 | tags = { 11 | Name = "laboratorio-01" 12 | } 13 | } -------------------------------------------------------------------------------- /terraform/laboratorio-01/lab-01/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | aws = { 4 | source = "hashicorp/aws" 5 | version = "5.11.0" 6 | } 7 | } 8 | } 9 | 10 | provider "aws" { 11 | version = "~> 5.0" 12 | region = "us-east-1" 13 | } 14 | 15 | resource "aws_key_pair" "deployer" { 16 | key_name = "id_rsa.pub" 17 | public_key = file("/root/.ssh/id_rsa.pub") 18 | } 19 | 20 | terraform { 21 | backend "s3" { 22 | # Lembre de trocar o bucket para o seu, não pode ser o mesmo nome 23 | bucket = "terraform-lab-01" 24 | key = "terraform-test.tfstate" 25 | region = "us-east-1" 26 | } 27 | } -------------------------------------------------------------------------------- /terraform/laboratorio-01/lab-01/output.tf: -------------------------------------------------------------------------------- 1 | output "ip_address" { 2 | value = aws_instance.laboratorio-01.public_ip 3 | } -------------------------------------------------------------------------------- /terraform/laboratorio-01/lab-01/webserver-laboratorio.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Atualizar pacotes 4 | sudo apt-get update 5 | 6 | # Instalar pacotes necessários 7 | sudo apt-get install -y apache2 mysql-server php php-mysql php-gd php-mbstring libapache2-mod-php 8 | 9 | # Configurar o MySQL 10 | sudo mysql -u root < 32 | ServerName cadastro.com 33 | ServerAdmin webmaster@localhost 34 | DocumentRoot /var/www/cadastro 35 | ErrorLog ${APACHE_LOG_DIR}/error.log 36 | CustomLog ${APACHE_LOG_DIR}/access.log combined 37 | 38 | EOF 39 | 40 | sudo tee /etc/apache2/sites-available/mantis.conf < 42 | ServerName mantis-labo.com 43 | ServerAdmin webmaster@localhost 44 | DocumentRoot /var/www/mantis 45 | 46 | AllowOverride All 47 | Require all granted 48 | 49 | ErrorLog ${APACHE_LOG_DIR}/error.log 50 | CustomLog ${APACHE_LOG_DIR}/access.log combined 51 | 52 | EOF 53 | 54 | sudo chown www-data:www-data -R mantis/ 55 | 56 | sudo a2ensite cadastro.conf 57 | sudo a2ensite mantis.conf 58 | sudo a2enmod rewrite 59 | 60 | sudo a2dissite 000-default.conf 61 | 62 | sudo systemctl start apache2 63 | sudo systemctl enable apache2 64 | -------------------------------------------------------------------------------- /terraform/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | aws = { 4 | source = "hashicorp/aws" 5 | version = "5.11.0" 6 | } 7 | } 8 | } 9 | 10 | provider "aws" { 11 | region = "us-east-1" 12 | } 13 | 14 | resource "aws_key_pair" "deployer" { 15 | key_name = "aws_keys.pub" 16 | public_key = file("/root/.ssh/aws_keys.pub") 17 | } 18 | 19 | terraform { 20 | backend "s3" { 21 | # Lembre de trocar o bucket para o seu, não pode ser o mesmo nome 22 | bucket = "descomplicando-terraform-ulisses" 23 | key = "terraform-test.tfstate" 24 | region = "us-east-1" 25 | } 26 | } -------------------------------------------------------------------------------- /terraform/output.tf: -------------------------------------------------------------------------------- 1 | output "ip_address" { 2 | value = aws_instance.webserver_lab.public_ip 3 | } -------------------------------------------------------------------------------- /terraform/ssh.tf: -------------------------------------------------------------------------------- 1 | resource "aws_security_group" "ssh_access" { 2 | name_prefix = "ssh-access-" # Prefixo para o nome do grupo de segurança 3 | 4 | ingress { 5 | description = "SSH Access" 6 | from_port = 22 7 | to_port = 22 8 | protocol = "tcp" 9 | cidr_blocks = ["187.19.176.164/32"] # Substitua "seu_ip_publico" pelo seu IP público 10 | } 11 | 12 | # Pode adicionar outras regras de entrada e saída conforme necessário 13 | } 14 | -------------------------------------------------------------------------------- /vagrant_labs/README.MD: -------------------------------------------------------------------------------- 1 | # Indice 2 | - [Vagrant](#vagrant) 3 | - [Instalação](#instalação) 4 | - [Criando uma VM](#criando-uma-vm) 5 | - [Criando um Vagrantfile](#criando-um-vagrantfile) 6 | - [Comandos uteis](#comandos-uteis) 7 | - [Contribuindo](#contribuindo) 8 | ## Vagrant 9 | 10 | O Vagrant é uma ferramenta que tem como intuito subir maquinas virtuais,de forma mais rapida, do que ter que ir num virtualizador como VirtualBox,VMware,entre outros, por mais que a ferramenta utilize dos plugins desses virtualizadores, mas todo o deploy é feito via arquivo de configuração. 11 | 12 | ## Instalação 13 | 14 | Faça o download clicando aqui, na sequência faça a instalação do Vagrant, de acordo com o seu sistema operacional, uma vez instalado, verifique se a instalação deu certo, rodando o comando : vagrant --version, tendo o retorno da versão, confirmando que foi instalado. 15 | 16 | ## Criando uma VM 17 | 18 | Para criar uma maquina virtal(VM) usando o Vagrant, é importante saber que ela é criada no diretório corrente, ou seja, se você rodar o comando para subir a partir do Vagrantfile dentro do /root, sua VM só vai ser acessada se você estiver dentro desse diretório. 19 | 20 | Sujestão : planeja sua estrutura de diretórios/ambiente de trabalho, exemplo : 21 | 22 | - vms-vagrant 23 | - vm1 24 | - vm2 25 | 26 | Como falei na introdução o Vagrant utiliza plugins de virtualizadores para poder provisionar as maquinas, por padrão é utilizado o VirtualBox, mas também é possivel usar outros virtualizadores, você pode obter informações mais detalhadas aqui . 27 | 28 | ## Criando um Vagrantfile 29 | 30 | O Vagrantfile é escrito usando a sintaxe do Ruby, segue abaixo um exemplo : 31 | 32 | 33 | Obs.: Instale o plugin vagrant-vbguest : vagrant plugin install vagrant-vbguest 34 | 35 | Obs.2: Para definir tamanho de disco, baixe o plugin vagrant-disksize 36 | : vagrant plugin install vagrant-disksize 37 | 38 | Obs.3: É necessário iniciar o repositório com : vagrant init , automaticamente é gerado um Vagrantfile padrão, para você alterar! 39 | 40 | Vagrant.configure("2") do |config| 41 | config.vm.define "nome_da_maquina" 42 | config.vm.hostname = "hostnamemaquina" 43 | config.vm.box = "ubuntu/focal64" 44 | config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" 45 | config.vm.network "private_network", ip: "192.168.56.2" 46 | 47 | config.disksize.size = '80GB' 48 | config.vm.provider "virtualbox" do |vb| 49 | vb.memory = "2048" 50 | vb.cpus = 2 51 | vb.customize ["modifyvm", :id, "--ioapic", "on"] 52 | end 53 | 54 | config.vm.provision "shell", path: "provision.sh" 55 | 56 | end 57 | 58 | 59 | - config.vm.define : define o nome da maquina virtual 60 | - config.vm.hostname : define um hostname para a maquina 61 | - config.vm.box : define a imagem que vai usar [ubuntu,centos,etc] 62 | - config.vm.network : para definir parâmetros de rede, como 63 | - forwarder de portas, criar uma rede privada,etc 64 | - config.disksize.size : você pode definir o tamanho de disco da VM 65 | - config.vm.provider : para definir o virtualizador [VirtualBox,VMware,etc] 66 | - vb.memory : define o tamanho de memoria ram 67 | - vb.cpus : define a quantidade de cores 68 | - config.vm.provision : utilizei um script externo em bash, para fazer as instalações,updates,etc 69 | 70 | Obs.4: aqui você tem mais detalhes como usar o provision. 71 | Obs.5: Você pode obter as images que vai usar aqui 72 | Segue o exemplo do provision.sh : 73 | 74 | #!/bin/bash 75 | echo "Instalando Apache e configurando setup!" 76 | apt install apache2 -y > /dev/null 2>&1 77 | cp -rfv /vagrant/html/ /var/www/ 78 | service apache2 start 79 | 80 | No exemplo,é feito a instalação do Apache2, e copiado arquivos locais para dentro da vm no diretório padrão do apache. Basta agora você acessar o ip da maquina criada no browser apontando a porta! 81 | 82 | ## Comandos uteis 83 | 84 | Segue abaixo alguns comando uteis para utilização do Vagrant: 85 | 86 | 87 | - vagrant ssh: Para entrar na máquina usando SSH de forma automática, sem precisar fornecer o IP ou usuário, já que o Vagrant cria essa configuração automaticamente e aponta a porta padrão 22 para 2200. 88 | 89 | - vagrant halt: Para desligar a máquina. 90 | 91 | - vagrant up: Para ligar a máquina, também pode ser usado para reiniciar a máquina. 92 | 93 | - vagrant destroy: Para destruir a máquina. 94 | 95 | - vagrant suspend: Para suspender o estado da máquina. 96 | 97 | - vagrant resume: Para retomar o estado da máquina. 98 | 99 | - vagrant reload: Caso tenha feito alguma mudança no Vagrantfile e queira aplicar as alterações na VM. 100 | 101 | - vagrant reload --provision: Para forçar a execução do script de provisionamento novamente. Ao executar vagrant up, o script de provisionamento é executado apenas uma vez, mas com essa opção, ele será executado novamente. 102 | 103 | - vagrant package: Para exportar a máquina em um arquivo com a extensão .box. 104 | 105 | - vagrant box add mybox box_path/da/box/.box: Para adicionar uma box exportada/importada à lista de boxes reconhecidas pelo Vagrant. Onde "mybox" é o nome da sua box. 106 | 107 | - vagrant init mybox e vagrant up: Para iniciar a box no diretório atual e ligar a máquina. "mybox" é o nome da sua box. 108 | 109 | ## Contribuindo 110 | 111 | Qualquer contribuição que você fizer será bem vinda, analisada e se viável, atualizada no projeto! 112 | 113 | - 1.Faça um fork do projeto 114 | - 2.Clone o seu fork para sua maquina(git clone url-do-projeto.git) 115 | - 3.Crie um branch para sua modificação/atualização(git checkout -b seu-branch) 116 | - 4.Adicione suas alterações ao git(git add .) 117 | - 5.Confirme suas alterações(git commit -m "texto descritivo do que fez") 118 | - 6.Suba seu branch(git push origin seu-branch) 119 | - 7.Faça uma solicitação de merge request para o branch : updates -------------------------------------------------------------------------------- /vagrant_labs/Vagrantfile: -------------------------------------------------------------------------------- 1 | Vagrant.configure("2") do |config| 2 | #aqui temos um forwarded de porta 3 | #config.vm.network "forwarded_port", guest: 80, host: 8045, host_ip: "127.0.0.1" 4 | 5 | #config.vm.provision "shell", path: "provision.sh" 6 | config.vm.define "voxtec" 7 | config.vm.hostname = "voxtec-pc" 8 | config.vm.box = "ubuntu/focal64" 9 | config.vm.network "private_network", ip: "192.168.56.2" 10 | config.vm.network "forwarded_port",guest: 8080,host: 8080 11 | #config.disksize.size = '40GB' 12 | config.vm.provider "virtualbox" do |vb| 13 | vb.memory = "2048" 14 | #vb.cpus = 2 15 | #vb.customize ["modifyvm", :id, "--ioapic", "on"] 16 | end 17 | #config.vm.provision "shell", path: "provision.sh" 18 | 19 | end 20 | 21 | -------------------------------------------------------------------------------- /vagrant_labs/html/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2019 Blackrock Digital LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /vagrant_labs/html/README.md: -------------------------------------------------------------------------------- 1 | # [Start Bootstrap - Landing Page](https://startbootstrap.com/template-overviews/landing-page/) 2 | 3 | [Landing Page](http://startbootstrap.com/template-overviews/landing-page/) is a multipurpose landing page template for [Bootstrap](http://getbootstrap.com/) created by [Start Bootstrap](http://startbootstrap.com/). 4 | 5 | ## Preview 6 | 7 | [![Landing Page Preview](https://startbootstrap.com/assets/img/screenshots/themes/landing-page.png)](https://blackrockdigital.github.io/startbootstrap-landing-page/) 8 | 9 | **[View Live Preview](https://blackrockdigital.github.io/startbootstrap-landing-page/)** 10 | 11 | ## Status 12 | 13 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/BlackrockDigital/startbootstrap-landing-page/master/LICENSE) 14 | [![npm version](https://img.shields.io/npm/v/startbootstrap-landing-page.svg)](https://www.npmjs.com/package/startbootstrap-landing-page) 15 | [![Build Status](https://travis-ci.org/BlackrockDigital/startbootstrap-landing-page.svg?branch=master)](https://travis-ci.org/BlackrockDigital/startbootstrap-landing-page) 16 | [![dependencies Status](https://david-dm.org/BlackrockDigital/startbootstrap-landing-page/status.svg)](https://david-dm.org/BlackrockDigital/startbootstrap-landing-page) 17 | [![devDependencies Status](https://david-dm.org/BlackrockDigital/startbootstrap-landing-page/dev-status.svg)](https://david-dm.org/BlackrockDigital/startbootstrap-landing-page?type=dev) 18 | 19 | ## Download and Installation 20 | 21 | To begin using this template, choose one of the following options to get started: 22 | * [Download the latest release on Start Bootstrap](https://startbootstrap.com/template-overviews/landing-page/) 23 | * Install via npm: `npm i startbootstrap-landing-page` 24 | * Clone the repo: `git clone https://github.com/BlackrockDigital/startbootstrap-landing-page.git` 25 | * [Fork, Clone, or Download on GitHub](https://github.com/BlackrockDigital/startbootstrap-landing-page) 26 | 27 | ## Usage 28 | 29 | ### Basic Usage 30 | 31 | After downloading, simply edit the HTML and CSS files included with the template in your favorite text editor to make changes. These are the only files you need to worry about, you can ignore everything else! To preview the changes you make to the code, you can open the `index.html` file in your web browser. 32 | 33 | ### Advanced Usage 34 | 35 | After installation, run `npm install` and then run `npm start` which will open up a preview of the template in your default browser, watch for changes to core template files, and live reload the browser when changes are saved. You can view the `gulpfile.js` to see which tasks are included with the dev environment. 36 | 37 | #### Gulp Tasks 38 | 39 | - `gulp` the default task that builds everything 40 | - `gulp watch` browserSync opens the project in your default browser and live reloads when changes are made 41 | - `gulp css` compiles SCSS files into CSS and minifies the compiled CSS 42 | - `gulp js` minifies the themes JS file 43 | - `gulp vendor` copies dependencies from node_modules to the vendor directory 44 | 45 | You must have npm installed globally in order to use this build environment. 46 | 47 | ## Bugs and Issues 48 | 49 | Have a bug or an issue with this template? [Open a new issue](https://github.com/BlackrockDigital/startbootstrap-landing-page/issues) here on GitHub or leave a comment on the [template overview page at Start Bootstrap](http://startbootstrap.com/template-overviews/landing-page/). 50 | 51 | ## About 52 | 53 | Start Bootstrap is an open source library of free Bootstrap templates and themes. All of the free templates and themes on Start Bootstrap are released under the MIT license, which means you can use them for any purpose, even for commercial projects. 54 | 55 | * https://startbootstrap.com 56 | * https://twitter.com/SBootstrap 57 | 58 | Start Bootstrap was created by and is maintained by **[David Miller](http://davidmiller.io/)**, Owner of [Blackrock Digital](http://blackrockdigital.io/). 59 | 60 | * http://davidmiller.io 61 | * https://twitter.com/davidmillerskt 62 | * https://github.com/davidtmiller 63 | 64 | Start Bootstrap is based on the [Bootstrap](http://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat). 65 | 66 | ## Copyright and License 67 | 68 | Copyright 2013-2019 Blackrock Digital LLC. Code released under the [MIT](https://github.com/BlackrockDigital/startbootstrap-landing-page/blob/gh-pages/LICENSE) license. 69 | -------------------------------------------------------------------------------- /vagrant_labs/html/css/landing-page.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Landing Page v5.0.7 (https://startbootstrap.com/template-overviews/landing-page) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-landing-page/blob/master/LICENSE) 5 | */ 6 | 7 | body { 8 | font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 9 | } 10 | 11 | h1, 12 | h2, 13 | h3, 14 | h4, 15 | h5, 16 | h6 { 17 | font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 18 | font-weight: 700; 19 | } 20 | 21 | header.masthead { 22 | position: relative; 23 | background-color: #343a40; 24 | background: url("../img/bg-masthead.jpg") no-repeat center center; 25 | background-size: cover; 26 | padding-top: 8rem; 27 | padding-bottom: 8rem; 28 | } 29 | 30 | header.masthead .overlay { 31 | position: absolute; 32 | background-color: #212529; 33 | height: 100%; 34 | width: 100%; 35 | top: 0; 36 | left: 0; 37 | opacity: 0.3; 38 | } 39 | 40 | header.masthead h1 { 41 | font-size: 2rem; 42 | } 43 | 44 | @media (min-width: 768px) { 45 | header.masthead { 46 | padding-top: 12rem; 47 | padding-bottom: 12rem; 48 | } 49 | header.masthead h1 { 50 | font-size: 3rem; 51 | } 52 | } 53 | 54 | .showcase .showcase-text { 55 | padding: 3rem; 56 | } 57 | 58 | .showcase .showcase-img { 59 | min-height: 30rem; 60 | background-size: cover; 61 | } 62 | 63 | @media (min-width: 768px) { 64 | .showcase .showcase-text { 65 | padding: 7rem; 66 | } 67 | } 68 | 69 | .features-icons { 70 | padding-top: 7rem; 71 | padding-bottom: 7rem; 72 | } 73 | 74 | .features-icons .features-icons-item { 75 | max-width: 20rem; 76 | } 77 | 78 | .features-icons .features-icons-item .features-icons-icon { 79 | height: 7rem; 80 | } 81 | 82 | .features-icons .features-icons-item .features-icons-icon i { 83 | font-size: 4.5rem; 84 | } 85 | 86 | .features-icons .features-icons-item:hover .features-icons-icon i { 87 | font-size: 5rem; 88 | } 89 | 90 | .testimonials { 91 | padding-top: 7rem; 92 | padding-bottom: 7rem; 93 | } 94 | 95 | .testimonials .testimonial-item { 96 | max-width: 18rem; 97 | } 98 | 99 | .testimonials .testimonial-item img { 100 | max-width: 12rem; 101 | box-shadow: 0px 5px 5px 0px #adb5bd; 102 | } 103 | 104 | .call-to-action { 105 | position: relative; 106 | background-color: #343a40; 107 | background: url("../img/bg-masthead.jpg") no-repeat center center; 108 | background-size: cover; 109 | padding-top: 7rem; 110 | padding-bottom: 7rem; 111 | } 112 | 113 | .call-to-action .overlay { 114 | position: absolute; 115 | background-color: #212529; 116 | height: 100%; 117 | width: 100%; 118 | top: 0; 119 | left: 0; 120 | opacity: 0.3; 121 | } 122 | 123 | footer.footer { 124 | padding-top: 4rem; 125 | padding-bottom: 4rem; 126 | } 127 | -------------------------------------------------------------------------------- /vagrant_labs/html/css/landing-page.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Landing Page v5.0.7 (https://startbootstrap.com/template-overviews/landing-page) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-landing-page/blob/master/LICENSE) 5 | */body{font-family:Lato,'Helvetica Neue',Helvetica,Arial,sans-serif}h1,h2,h3,h4,h5,h6{font-family:Lato,'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:700}header.masthead{position:relative;background-color:#343a40;background:url(../img/bg-masthead.jpg) no-repeat center center;background-size:cover;padding-top:8rem;padding-bottom:8rem}header.masthead .overlay{position:absolute;background-color:#212529;height:100%;width:100%;top:0;left:0;opacity:.3}header.masthead h1{font-size:2rem}@media (min-width:768px){header.masthead{padding-top:12rem;padding-bottom:12rem}header.masthead h1{font-size:3rem}}.showcase .showcase-text{padding:3rem}.showcase .showcase-img{min-height:30rem;background-size:cover}@media (min-width:768px){.showcase .showcase-text{padding:7rem}}.features-icons{padding-top:7rem;padding-bottom:7rem}.features-icons .features-icons-item{max-width:20rem}.features-icons .features-icons-item .features-icons-icon{height:7rem}.features-icons .features-icons-item .features-icons-icon i{font-size:4.5rem}.features-icons .features-icons-item:hover .features-icons-icon i{font-size:5rem}.testimonials{padding-top:7rem;padding-bottom:7rem}.testimonials .testimonial-item{max-width:18rem}.testimonials .testimonial-item img{max-width:12rem;box-shadow:0 5px 5px 0 #adb5bd}.call-to-action{position:relative;background-color:#343a40;background:url(../img/bg-masthead.jpg) no-repeat center center;background-size:cover;padding-top:7rem;padding-bottom:7rem}.call-to-action .overlay{position:absolute;background-color:#212529;height:100%;width:100%;top:0;left:0;opacity:.3}footer.footer{padding-top:4rem;padding-bottom:4rem} -------------------------------------------------------------------------------- /vagrant_labs/html/gulpfile.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // Load plugins 4 | const autoprefixer = require("gulp-autoprefixer"); 5 | const browsersync = require("browser-sync").create(); 6 | const cleanCSS = require("gulp-clean-css"); 7 | const del = require("del"); 8 | const gulp = require("gulp"); 9 | const header = require("gulp-header"); 10 | const merge = require("merge-stream"); 11 | const plumber = require("gulp-plumber"); 12 | const rename = require("gulp-rename"); 13 | const sass = require("gulp-sass"); 14 | 15 | // Load package.json for banner 16 | const pkg = require('./package.json'); 17 | 18 | // Set the banner content 19 | const banner = ['/*!\n', 20 | ' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\n', 21 | ' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\n', 22 | ' * Licensed under <%= pkg.license %> (https://github.com/BlackrockDigital/<%= pkg.name %>/blob/master/LICENSE)\n', 23 | ' */\n', 24 | '\n' 25 | ].join(''); 26 | 27 | // BrowserSync 28 | function browserSync(done) { 29 | browsersync.init({ 30 | server: { 31 | baseDir: "./" 32 | }, 33 | port: 3000 34 | }); 35 | done(); 36 | } 37 | 38 | // BrowserSync reload 39 | function browserSyncReload(done) { 40 | browsersync.reload(); 41 | done(); 42 | } 43 | 44 | // Clean vendor 45 | function clean() { 46 | return del(["./vendor/"]); 47 | } 48 | 49 | // Bring third party dependencies from node_modules into vendor directory 50 | function modules() { 51 | // Bootstrap 52 | var bootstrap = gulp.src('./node_modules/bootstrap/dist/**/*') 53 | .pipe(gulp.dest('./vendor/bootstrap')); 54 | // Font Awesome CSS 55 | var fontAwesomeCSS = gulp.src('./node_modules/@fortawesome/fontawesome-free/css/**/*') 56 | .pipe(gulp.dest('./vendor/fontawesome-free/css')); 57 | // Font Awesome Webfonts 58 | var fontAwesomeWebfonts = gulp.src('./node_modules/@fortawesome/fontawesome-free/webfonts/**/*') 59 | .pipe(gulp.dest('./vendor/fontawesome-free/webfonts')); 60 | // jQuery Easing 61 | var jqueryEasing = gulp.src('./node_modules/jquery.easing/*.js') 62 | .pipe(gulp.dest('./vendor/jquery-easing')); 63 | // jQuery 64 | var jquery = gulp.src([ 65 | './node_modules/jquery/dist/*', 66 | '!./node_modules/jquery/dist/core.js' 67 | ]) 68 | .pipe(gulp.dest('./vendor/jquery')); 69 | // Simple Line Icons 70 | var simpleLineIconsFonts = gulp.src('./node_modules/simple-line-icons/fonts/**') 71 | .pipe(gulp.dest('./vendor/simple-line-icons/fonts')); 72 | var simpleLineIconsCSS = gulp.src('./node_modules/simple-line-icons/css/**') 73 | .pipe(gulp.dest('./vendor/simple-line-icons/css')); 74 | return merge(bootstrap, fontAwesomeCSS, fontAwesomeWebfonts, jquery, jqueryEasing, simpleLineIconsFonts, simpleLineIconsCSS); 75 | } 76 | 77 | // CSS task 78 | function css() { 79 | return gulp 80 | .src("./scss/**/*.scss") 81 | .pipe(plumber()) 82 | .pipe(sass({ 83 | outputStyle: "expanded", 84 | includePaths: "./node_modules", 85 | })) 86 | .on("error", sass.logError) 87 | .pipe(autoprefixer({ 88 | cascade: false 89 | })) 90 | .pipe(header(banner, { 91 | pkg: pkg 92 | })) 93 | .pipe(gulp.dest("./css")) 94 | .pipe(rename({ 95 | suffix: ".min" 96 | })) 97 | .pipe(cleanCSS()) 98 | .pipe(gulp.dest("./css")) 99 | .pipe(browsersync.stream()); 100 | } 101 | 102 | // Watch files 103 | function watchFiles() { 104 | gulp.watch("./scss/**/*", css); 105 | gulp.watch("./**/*.html", browserSyncReload); 106 | } 107 | 108 | // Define complex tasks 109 | const vendor = gulp.series(clean, modules); 110 | const build = gulp.series(vendor, css); 111 | const watch = gulp.series(build, gulp.parallel(watchFiles, browserSync)); 112 | 113 | // Export tasks 114 | exports.css = css; 115 | exports.clean = clean; 116 | exports.vendor = vendor; 117 | exports.build = build; 118 | exports.watch = watch; 119 | exports.default = build; 120 | -------------------------------------------------------------------------------- /vagrant_labs/html/img/bg-masthead.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/bg-masthead.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/bg-showcase-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/bg-showcase-1.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/bg-showcase-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/bg-showcase-2.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/bg-showcase-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/bg-showcase-3.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/testimonials-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/testimonials-1.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/testimonials-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/testimonials-2.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/img/testimonials-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/img/testimonials-3.jpg -------------------------------------------------------------------------------- /vagrant_labs/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Landing Page - Start Bootstrap Theme 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 35 | 36 | 37 |
38 |
39 |
40 |
41 |
42 |

Build a landing page for your business or project and generate more leads!

43 |
44 |
45 |
46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 |
64 |
65 |
66 |
67 | 68 |
69 |

Fully Responsive

70 |

This theme will look great on any device, no matter the size!

71 |
72 |
73 |
74 |
75 |
76 | 77 |
78 |

Bootstrap 4 Ready

79 |

Featuring the latest build of the new Bootstrap 4 framework!

80 |
81 |
82 |
83 |
84 |
85 | 86 |
87 |

Easy to Use

88 |

Ready to use with your own content, or customize the source files!

89 |
90 |
91 |
92 |
93 |
94 | 95 | 96 |
97 |
98 |
99 | 100 |
101 |
102 |

Fully Responsive Design

103 |

When you use a theme created by Start Bootstrap, you know that the theme will look great on any device, whether it's a phone, tablet, or desktop the page will behave responsively!

104 |
105 |
106 |
107 |
108 |
109 |

Updated For Bootstrap 4

110 |

Newly improved, and full of great utility classes, Bootstrap 4 is leading the way in mobile responsive web development! All of the themes on Start Bootstrap are now using Bootstrap 4!

111 |
112 |
113 |
114 |
115 |
116 |

Easy to Use & Customize

117 |

Landing Page is just HTML and CSS with a splash of SCSS for users who demand some deeper customization options. Out of the box, just add your content and images, and your new landing page will be ready to go!

118 |
119 |
120 |
121 |
122 | 123 | 124 |
125 |
126 |

What people are saying...

127 |
128 |
129 |
130 | 131 |
Margaret E.
132 |

"This is fantastic! Thanks so much guys!"

133 |
134 |
135 |
136 |
137 | 138 |
Fred S.
139 |

"Bootstrap is amazing. I've been using it to create lots of super nice landing pages."

140 |
141 |
142 |
143 |
144 | 145 |
Sarah W.
146 |

"Thanks so much for making these free resources available to us!"

147 |
148 |
149 |
150 |
151 |
152 | 153 | 154 |
155 |
156 |
157 |
158 |
159 |

Ready to get started? Sign up now!

160 |
161 |
162 |
163 |
164 |
165 | 166 |
167 |
168 | 169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 | 177 | 178 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | -------------------------------------------------------------------------------- /vagrant_labs/html/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Landing Page", 3 | "name": "startbootstrap-landing-page", 4 | "version": "5.0.7", 5 | "scripts": { 6 | "start": "node_modules/.bin/gulp watch" 7 | }, 8 | "description": "An HTML landing page template built with Bootstrap", 9 | "keywords": [ 10 | "css", 11 | "sass", 12 | "html", 13 | "responsive", 14 | "theme", 15 | "template" 16 | ], 17 | "homepage": "https://startbootstrap.com/template-overviews/landing-page", 18 | "bugs": { 19 | "url": "https://github.com/BlackrockDigital/startbootstrap-landing-page/issues", 20 | "email": "feedback@startbootstrap.com" 21 | }, 22 | "license": "MIT", 23 | "author": "Start Bootstrap", 24 | "contributors": [ 25 | "David Miller (http://davidmiller.io/)" 26 | ], 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/BlackrockDigital/startbootstrap-landing-page.git" 30 | }, 31 | "dependencies": { 32 | "@fortawesome/fontawesome-free": "5.10.2", 33 | "bootstrap": "4.3.1", 34 | "jquery": "3.4.1", 35 | "simple-line-icons": "^2.4.1" 36 | }, 37 | "devDependencies": { 38 | "browser-sync": "2.26.7", 39 | "del": "5.1.0", 40 | "gulp": "4.0.2", 41 | "gulp-autoprefixer": "7.0.0", 42 | "gulp-clean-css": "4.2.0", 43 | "gulp-header": "2.0.9", 44 | "gulp-plumber": "^1.2.1", 45 | "gulp-rename": "1.4.0", 46 | "gulp-sass": "4.0.2", 47 | "merge-stream": "2.0.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_call-to-action.scss: -------------------------------------------------------------------------------- 1 | .call-to-action { 2 | position: relative; 3 | background-color: $gray-800; 4 | background: url('../img/bg-masthead.jpg') no-repeat center center; 5 | @include background-cover; 6 | padding-top: 7rem; 7 | padding-bottom: 7rem; 8 | .overlay { 9 | position: absolute; 10 | background-color: $gray-900; 11 | height: 100%; 12 | width: 100%; 13 | top: 0; 14 | left: 0; 15 | opacity: 0.3; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_footer.scss: -------------------------------------------------------------------------------- 1 | footer.footer { 2 | padding-top: 4rem; 3 | padding-bottom: 4rem; 4 | } 5 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_global.scss: -------------------------------------------------------------------------------- 1 | body { 2 | @include body-font; 3 | } 4 | 5 | h1, 6 | h2, 7 | h3, 8 | h4, 9 | h5, 10 | h6 { 11 | @include body-font; 12 | font-weight: 700; 13 | } 14 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | .features-icons { 2 | padding-top: 7rem; 3 | padding-bottom: 7rem; 4 | .features-icons-item { 5 | max-width: 20rem; 6 | .features-icons-icon { 7 | height: 7rem; 8 | i { 9 | font-size: 4.5rem; 10 | } 11 | } 12 | &:hover { 13 | .features-icons-icon { 14 | i { 15 | font-size: 5rem; 16 | } 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_masthead.scss: -------------------------------------------------------------------------------- 1 | header.masthead { 2 | position: relative; 3 | background-color: $gray-800; 4 | background: url('../img/bg-masthead.jpg') no-repeat center center; 5 | @include background-cover; 6 | padding-top: 8rem; 7 | padding-bottom: 8rem; 8 | .overlay { 9 | position: absolute; 10 | background-color: $gray-900; 11 | height: 100%; 12 | width: 100%; 13 | top: 0; 14 | left: 0; 15 | opacity: 0.3; 16 | } 17 | h1 { 18 | font-size: 2rem; 19 | } 20 | @media (min-width: 768px) { 21 | padding-top: 12rem; 22 | padding-bottom: 12rem; 23 | h1 { 24 | font-size: 3rem; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // Background Cover Mixin 3 | @mixin background-cover { 4 | -webkit-background-size: cover; 5 | -moz-background-size: cover; 6 | -o-background-size: cover; 7 | background-size: cover; 8 | } 9 | 10 | // Font Mixins 11 | @mixin body-font { 12 | font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 13 | } 14 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_showcase.scss: -------------------------------------------------------------------------------- 1 | .showcase { 2 | .showcase-text { 3 | padding: 3rem; 4 | } 5 | .showcase-img { 6 | min-height: 30rem; 7 | background-size: cover; 8 | } 9 | @media (min-width: 768px) { 10 | .showcase-text { 11 | padding: 7rem; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_testimonials.scss: -------------------------------------------------------------------------------- 1 | .testimonials { 2 | padding-top: 7rem; 3 | padding-bottom: 7rem; 4 | .testimonial-item { 5 | max-width: 18rem; 6 | img { 7 | max-width: 12rem; 8 | box-shadow: 0px 5px 5px 0px $gray-500; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | // Restated Bootstrap Variables 4 | 5 | $white: #fff !default; 6 | $gray-100: #f8f9fa !default; 7 | $gray-200: #e9ecef !default; 8 | $gray-300: #dee2e6 !default; 9 | $gray-400: #ced4da !default; 10 | $gray-500: #adb5bd !default; 11 | $gray-600: #868e96 !default; 12 | $gray-700: #495057 !default; 13 | $gray-800: #343a40 !default; 14 | $gray-900: #212529 !default; 15 | $black: #000 !default; 16 | 17 | $blue: #007bff !default; 18 | $indigo: #6610f2 !default; 19 | $purple: #6f42c1 !default; 20 | $pink: #e83e8c !default; 21 | $red: #dc3545 !default; 22 | $orange: #fd7e14 !default; 23 | $yellow: #ffc107 !default; 24 | $green: #28a745 !default; 25 | $teal: #20c997 !default; 26 | $cyan: #17a2b8 !default; 27 | 28 | $primary: $blue !default; 29 | $secondary: $gray-600 !default; 30 | $success: $green !default; 31 | $info: $cyan !default; 32 | $warning: $yellow !default; 33 | $danger: $red !default; 34 | $light: $gray-100 !default; 35 | $dark: $gray-800 !default; 36 | -------------------------------------------------------------------------------- /vagrant_labs/html/scss/landing-page.scss: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.scss"; 3 | @import "mixins.scss"; 4 | // Global CSS 5 | @import "global.scss"; 6 | // Components 7 | @import "masthead.scss"; 8 | @import "showcase.scss"; 9 | @import "icons.scss"; 10 | @import "testimonials.scss"; 11 | @import "call-to-action.scss"; 12 | @import "footer.scss"; 13 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 19 | } 20 | 21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 28 | font-size: 1rem; 29 | font-weight: 400; 30 | line-height: 1.5; 31 | color: #212529; 32 | text-align: left; 33 | background-color: #fff; 34 | } 35 | 36 | [tabindex="-1"]:focus { 37 | outline: 0 !important; 38 | } 39 | 40 | hr { 41 | box-sizing: content-box; 42 | height: 0; 43 | overflow: visible; 44 | } 45 | 46 | h1, h2, h3, h4, h5, h6 { 47 | margin-top: 0; 48 | margin-bottom: 0.5rem; 49 | } 50 | 51 | p { 52 | margin-top: 0; 53 | margin-bottom: 1rem; 54 | } 55 | 56 | abbr[title], 57 | abbr[data-original-title] { 58 | text-decoration: underline; 59 | -webkit-text-decoration: underline dotted; 60 | text-decoration: underline dotted; 61 | cursor: help; 62 | border-bottom: 0; 63 | -webkit-text-decoration-skip-ink: none; 64 | text-decoration-skip-ink: none; 65 | } 66 | 67 | address { 68 | margin-bottom: 1rem; 69 | font-style: normal; 70 | line-height: inherit; 71 | } 72 | 73 | ol, 74 | ul, 75 | dl { 76 | margin-top: 0; 77 | margin-bottom: 1rem; 78 | } 79 | 80 | ol ol, 81 | ul ul, 82 | ol ul, 83 | ul ol { 84 | margin-bottom: 0; 85 | } 86 | 87 | dt { 88 | font-weight: 700; 89 | } 90 | 91 | dd { 92 | margin-bottom: .5rem; 93 | margin-left: 0; 94 | } 95 | 96 | blockquote { 97 | margin: 0 0 1rem; 98 | } 99 | 100 | b, 101 | strong { 102 | font-weight: bolder; 103 | } 104 | 105 | small { 106 | font-size: 80%; 107 | } 108 | 109 | sub, 110 | sup { 111 | position: relative; 112 | font-size: 75%; 113 | line-height: 0; 114 | vertical-align: baseline; 115 | } 116 | 117 | sub { 118 | bottom: -.25em; 119 | } 120 | 121 | sup { 122 | top: -.5em; 123 | } 124 | 125 | a { 126 | color: #007bff; 127 | text-decoration: none; 128 | background-color: transparent; 129 | } 130 | 131 | a:hover { 132 | color: #0056b3; 133 | text-decoration: underline; 134 | } 135 | 136 | a:not([href]):not([tabindex]) { 137 | color: inherit; 138 | text-decoration: none; 139 | } 140 | 141 | a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { 142 | color: inherit; 143 | text-decoration: none; 144 | } 145 | 146 | a:not([href]):not([tabindex]):focus { 147 | outline: 0; 148 | } 149 | 150 | pre, 151 | code, 152 | kbd, 153 | samp { 154 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 155 | font-size: 1em; 156 | } 157 | 158 | pre { 159 | margin-top: 0; 160 | margin-bottom: 1rem; 161 | overflow: auto; 162 | } 163 | 164 | figure { 165 | margin: 0 0 1rem; 166 | } 167 | 168 | img { 169 | vertical-align: middle; 170 | border-style: none; 171 | } 172 | 173 | svg { 174 | overflow: hidden; 175 | vertical-align: middle; 176 | } 177 | 178 | table { 179 | border-collapse: collapse; 180 | } 181 | 182 | caption { 183 | padding-top: 0.75rem; 184 | padding-bottom: 0.75rem; 185 | color: #6c757d; 186 | text-align: left; 187 | caption-side: bottom; 188 | } 189 | 190 | th { 191 | text-align: inherit; 192 | } 193 | 194 | label { 195 | display: inline-block; 196 | margin-bottom: 0.5rem; 197 | } 198 | 199 | button { 200 | border-radius: 0; 201 | } 202 | 203 | button:focus { 204 | outline: 1px dotted; 205 | outline: 5px auto -webkit-focus-ring-color; 206 | } 207 | 208 | input, 209 | button, 210 | select, 211 | optgroup, 212 | textarea { 213 | margin: 0; 214 | font-family: inherit; 215 | font-size: inherit; 216 | line-height: inherit; 217 | } 218 | 219 | button, 220 | input { 221 | overflow: visible; 222 | } 223 | 224 | button, 225 | select { 226 | text-transform: none; 227 | } 228 | 229 | select { 230 | word-wrap: normal; 231 | } 232 | 233 | button, 234 | [type="button"], 235 | [type="reset"], 236 | [type="submit"] { 237 | -webkit-appearance: button; 238 | } 239 | 240 | button:not(:disabled), 241 | [type="button"]:not(:disabled), 242 | [type="reset"]:not(:disabled), 243 | [type="submit"]:not(:disabled) { 244 | cursor: pointer; 245 | } 246 | 247 | button::-moz-focus-inner, 248 | [type="button"]::-moz-focus-inner, 249 | [type="reset"]::-moz-focus-inner, 250 | [type="submit"]::-moz-focus-inner { 251 | padding: 0; 252 | border-style: none; 253 | } 254 | 255 | input[type="radio"], 256 | input[type="checkbox"] { 257 | box-sizing: border-box; 258 | padding: 0; 259 | } 260 | 261 | input[type="date"], 262 | input[type="time"], 263 | input[type="datetime-local"], 264 | input[type="month"] { 265 | -webkit-appearance: listbox; 266 | } 267 | 268 | textarea { 269 | overflow: auto; 270 | resize: vertical; 271 | } 272 | 273 | fieldset { 274 | min-width: 0; 275 | padding: 0; 276 | margin: 0; 277 | border: 0; 278 | } 279 | 280 | legend { 281 | display: block; 282 | width: 100%; 283 | max-width: 100%; 284 | padding: 0; 285 | margin-bottom: .5rem; 286 | font-size: 1.5rem; 287 | line-height: inherit; 288 | color: inherit; 289 | white-space: normal; 290 | } 291 | 292 | progress { 293 | vertical-align: baseline; 294 | } 295 | 296 | [type="number"]::-webkit-inner-spin-button, 297 | [type="number"]::-webkit-outer-spin-button { 298 | height: auto; 299 | } 300 | 301 | [type="search"] { 302 | outline-offset: -2px; 303 | -webkit-appearance: none; 304 | } 305 | 306 | [type="search"]::-webkit-search-decoration { 307 | -webkit-appearance: none; 308 | } 309 | 310 | ::-webkit-file-upload-button { 311 | font: inherit; 312 | -webkit-appearance: button; 313 | } 314 | 315 | output { 316 | display: inline-block; 317 | } 318 | 319 | summary { 320 | display: list-item; 321 | cursor: pointer; 322 | } 323 | 324 | template { 325 | display: none; 326 | } 327 | 328 | [hidden] { 329 | display: none !important; 330 | } 331 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | font-display: auto; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; } 15 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: auto; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: auto; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/svg-with-js.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | svg:not(:root).svg-inline--fa { 6 | overflow: visible; } 7 | 8 | .svg-inline--fa { 9 | display: inline-block; 10 | font-size: inherit; 11 | height: 1em; 12 | overflow: visible; 13 | vertical-align: -.125em; } 14 | .svg-inline--fa.fa-lg { 15 | vertical-align: -.225em; } 16 | .svg-inline--fa.fa-w-1 { 17 | width: 0.0625em; } 18 | .svg-inline--fa.fa-w-2 { 19 | width: 0.125em; } 20 | .svg-inline--fa.fa-w-3 { 21 | width: 0.1875em; } 22 | .svg-inline--fa.fa-w-4 { 23 | width: 0.25em; } 24 | .svg-inline--fa.fa-w-5 { 25 | width: 0.3125em; } 26 | .svg-inline--fa.fa-w-6 { 27 | width: 0.375em; } 28 | .svg-inline--fa.fa-w-7 { 29 | width: 0.4375em; } 30 | .svg-inline--fa.fa-w-8 { 31 | width: 0.5em; } 32 | .svg-inline--fa.fa-w-9 { 33 | width: 0.5625em; } 34 | .svg-inline--fa.fa-w-10 { 35 | width: 0.625em; } 36 | .svg-inline--fa.fa-w-11 { 37 | width: 0.6875em; } 38 | .svg-inline--fa.fa-w-12 { 39 | width: 0.75em; } 40 | .svg-inline--fa.fa-w-13 { 41 | width: 0.8125em; } 42 | .svg-inline--fa.fa-w-14 { 43 | width: 0.875em; } 44 | .svg-inline--fa.fa-w-15 { 45 | width: 0.9375em; } 46 | .svg-inline--fa.fa-w-16 { 47 | width: 1em; } 48 | .svg-inline--fa.fa-w-17 { 49 | width: 1.0625em; } 50 | .svg-inline--fa.fa-w-18 { 51 | width: 1.125em; } 52 | .svg-inline--fa.fa-w-19 { 53 | width: 1.1875em; } 54 | .svg-inline--fa.fa-w-20 { 55 | width: 1.25em; } 56 | .svg-inline--fa.fa-pull-left { 57 | margin-right: .3em; 58 | width: auto; } 59 | .svg-inline--fa.fa-pull-right { 60 | margin-left: .3em; 61 | width: auto; } 62 | .svg-inline--fa.fa-border { 63 | height: 1.5em; } 64 | .svg-inline--fa.fa-li { 65 | width: 2em; } 66 | .svg-inline--fa.fa-fw { 67 | width: 1.25em; } 68 | 69 | .fa-layers svg.svg-inline--fa { 70 | bottom: 0; 71 | left: 0; 72 | margin: auto; 73 | position: absolute; 74 | right: 0; 75 | top: 0; } 76 | 77 | .fa-layers { 78 | display: inline-block; 79 | height: 1em; 80 | position: relative; 81 | text-align: center; 82 | vertical-align: -.125em; 83 | width: 1em; } 84 | .fa-layers svg.svg-inline--fa { 85 | -webkit-transform-origin: center center; 86 | transform-origin: center center; } 87 | 88 | .fa-layers-text, .fa-layers-counter { 89 | display: inline-block; 90 | position: absolute; 91 | text-align: center; } 92 | 93 | .fa-layers-text { 94 | left: 50%; 95 | top: 50%; 96 | -webkit-transform: translate(-50%, -50%); 97 | transform: translate(-50%, -50%); 98 | -webkit-transform-origin: center center; 99 | transform-origin: center center; } 100 | 101 | .fa-layers-counter { 102 | background-color: #ff253a; 103 | border-radius: 1em; 104 | -webkit-box-sizing: border-box; 105 | box-sizing: border-box; 106 | color: #fff; 107 | height: 1.5em; 108 | line-height: 1; 109 | max-width: 5em; 110 | min-width: 1.5em; 111 | overflow: hidden; 112 | padding: .25em; 113 | right: 0; 114 | text-overflow: ellipsis; 115 | top: 0; 116 | -webkit-transform: scale(0.25); 117 | transform: scale(0.25); 118 | -webkit-transform-origin: top right; 119 | transform-origin: top right; } 120 | 121 | .fa-layers-bottom-right { 122 | bottom: 0; 123 | right: 0; 124 | top: auto; 125 | -webkit-transform: scale(0.25); 126 | transform: scale(0.25); 127 | -webkit-transform-origin: bottom right; 128 | transform-origin: bottom right; } 129 | 130 | .fa-layers-bottom-left { 131 | bottom: 0; 132 | left: 0; 133 | right: auto; 134 | top: auto; 135 | -webkit-transform: scale(0.25); 136 | transform: scale(0.25); 137 | -webkit-transform-origin: bottom left; 138 | transform-origin: bottom left; } 139 | 140 | .fa-layers-top-right { 141 | right: 0; 142 | top: 0; 143 | -webkit-transform: scale(0.25); 144 | transform: scale(0.25); 145 | -webkit-transform-origin: top right; 146 | transform-origin: top right; } 147 | 148 | .fa-layers-top-left { 149 | left: 0; 150 | right: auto; 151 | top: 0; 152 | -webkit-transform: scale(0.25); 153 | transform: scale(0.25); 154 | -webkit-transform-origin: top left; 155 | transform-origin: top left; } 156 | 157 | .fa-lg { 158 | font-size: 1.33333em; 159 | line-height: 0.75em; 160 | vertical-align: -.0667em; } 161 | 162 | .fa-xs { 163 | font-size: .75em; } 164 | 165 | .fa-sm { 166 | font-size: .875em; } 167 | 168 | .fa-1x { 169 | font-size: 1em; } 170 | 171 | .fa-2x { 172 | font-size: 2em; } 173 | 174 | .fa-3x { 175 | font-size: 3em; } 176 | 177 | .fa-4x { 178 | font-size: 4em; } 179 | 180 | .fa-5x { 181 | font-size: 5em; } 182 | 183 | .fa-6x { 184 | font-size: 6em; } 185 | 186 | .fa-7x { 187 | font-size: 7em; } 188 | 189 | .fa-8x { 190 | font-size: 8em; } 191 | 192 | .fa-9x { 193 | font-size: 9em; } 194 | 195 | .fa-10x { 196 | font-size: 10em; } 197 | 198 | .fa-fw { 199 | text-align: center; 200 | width: 1.25em; } 201 | 202 | .fa-ul { 203 | list-style-type: none; 204 | margin-left: 2.5em; 205 | padding-left: 0; } 206 | .fa-ul > li { 207 | position: relative; } 208 | 209 | .fa-li { 210 | left: -2em; 211 | position: absolute; 212 | text-align: center; 213 | width: 2em; 214 | line-height: inherit; } 215 | 216 | .fa-border { 217 | border: solid 0.08em #eee; 218 | border-radius: .1em; 219 | padding: .2em .25em .15em; } 220 | 221 | .fa-pull-left { 222 | float: left; } 223 | 224 | .fa-pull-right { 225 | float: right; } 226 | 227 | .fa.fa-pull-left, 228 | .fas.fa-pull-left, 229 | .far.fa-pull-left, 230 | .fal.fa-pull-left, 231 | .fab.fa-pull-left { 232 | margin-right: .3em; } 233 | 234 | .fa.fa-pull-right, 235 | .fas.fa-pull-right, 236 | .far.fa-pull-right, 237 | .fal.fa-pull-right, 238 | .fab.fa-pull-right { 239 | margin-left: .3em; } 240 | 241 | .fa-spin { 242 | -webkit-animation: fa-spin 2s infinite linear; 243 | animation: fa-spin 2s infinite linear; } 244 | 245 | .fa-pulse { 246 | -webkit-animation: fa-spin 1s infinite steps(8); 247 | animation: fa-spin 1s infinite steps(8); } 248 | 249 | @-webkit-keyframes fa-spin { 250 | 0% { 251 | -webkit-transform: rotate(0deg); 252 | transform: rotate(0deg); } 253 | 100% { 254 | -webkit-transform: rotate(360deg); 255 | transform: rotate(360deg); } } 256 | 257 | @keyframes fa-spin { 258 | 0% { 259 | -webkit-transform: rotate(0deg); 260 | transform: rotate(0deg); } 261 | 100% { 262 | -webkit-transform: rotate(360deg); 263 | transform: rotate(360deg); } } 264 | 265 | .fa-rotate-90 { 266 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; 267 | -webkit-transform: rotate(90deg); 268 | transform: rotate(90deg); } 269 | 270 | .fa-rotate-180 { 271 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; 272 | -webkit-transform: rotate(180deg); 273 | transform: rotate(180deg); } 274 | 275 | .fa-rotate-270 { 276 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; 277 | -webkit-transform: rotate(270deg); 278 | transform: rotate(270deg); } 279 | 280 | .fa-flip-horizontal { 281 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; 282 | -webkit-transform: scale(-1, 1); 283 | transform: scale(-1, 1); } 284 | 285 | .fa-flip-vertical { 286 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 287 | -webkit-transform: scale(1, -1); 288 | transform: scale(1, -1); } 289 | 290 | .fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { 291 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 292 | -webkit-transform: scale(-1, -1); 293 | transform: scale(-1, -1); } 294 | 295 | :root .fa-rotate-90, 296 | :root .fa-rotate-180, 297 | :root .fa-rotate-270, 298 | :root .fa-flip-horizontal, 299 | :root .fa-flip-vertical, 300 | :root .fa-flip-both { 301 | -webkit-filter: none; 302 | filter: none; } 303 | 304 | .fa-stack { 305 | display: inline-block; 306 | height: 2em; 307 | position: relative; 308 | width: 2.5em; } 309 | 310 | .fa-stack-1x, 311 | .fa-stack-2x { 312 | bottom: 0; 313 | left: 0; 314 | margin: auto; 315 | position: absolute; 316 | right: 0; 317 | top: 0; } 318 | 319 | .svg-inline--fa.fa-stack-1x { 320 | height: 1em; 321 | width: 1.25em; } 322 | 323 | .svg-inline--fa.fa-stack-2x { 324 | height: 2em; 325 | width: 2.5em; } 326 | 327 | .fa-inverse { 328 | color: #fff; } 329 | 330 | .sr-only { 331 | border: 0; 332 | clip: rect(0, 0, 0, 0); 333 | height: 1px; 334 | margin: -1px; 335 | overflow: hidden; 336 | padding: 0; 337 | position: absolute; 338 | width: 1px; } 339 | 340 | .sr-only-focusable:active, .sr-only-focusable:focus { 341 | clip: auto; 342 | height: auto; 343 | margin: 0; 344 | overflow: visible; 345 | position: static; 346 | width: auto; } 347 | 348 | .svg-inline--fa .fa-primary { 349 | fill: var(--fa-primary-color, currentColor); 350 | opacity: 1; 351 | opacity: var(--fa-primary-opacity, 1); } 352 | 353 | .svg-inline--fa .fa-secondary { 354 | fill: var(--fa-secondary-color, currentColor); 355 | opacity: 0.4; 356 | opacity: var(--fa-secondary-opacity, 0.4); } 357 | 358 | .svg-inline--fa.fa-swap-opacity .fa-primary { 359 | opacity: 0.4; 360 | opacity: var(--fa-secondary-opacity, 0.4); } 361 | 362 | .svg-inline--fa.fa-swap-opacity .fa-secondary { 363 | opacity: 1; 364 | opacity: var(--fa-primary-opacity, 1); } 365 | 366 | .svg-inline--fa mask .fa-primary, 367 | .svg-inline--fa mask .fa-secondary { 368 | fill: black; } 369 | 370 | .fad.fa-inverse { 371 | color: #fff; } 372 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/css/svg-with-js.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | .svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fad.fa-inverse{color:#fff} -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/fontawesome-free/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/simple-line-icons/css/simple-line-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'simple-line-icons'; 3 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0'); 4 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'), url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('woff2'), url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'), url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('woff'), url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg'); 5 | font-weight: normal; 6 | font-style: normal; 7 | } 8 | /* 9 | Use the following CSS code if you want to have a class per icon. 10 | Instead of a list of all class selectors, you can use the generic [class*="icon-"] selector, but it's slower: 11 | */ 12 | .icon-user, 13 | .icon-people, 14 | .icon-user-female, 15 | .icon-user-follow, 16 | .icon-user-following, 17 | .icon-user-unfollow, 18 | .icon-login, 19 | .icon-logout, 20 | .icon-emotsmile, 21 | .icon-phone, 22 | .icon-call-end, 23 | .icon-call-in, 24 | .icon-call-out, 25 | .icon-map, 26 | .icon-location-pin, 27 | .icon-direction, 28 | .icon-directions, 29 | .icon-compass, 30 | .icon-layers, 31 | .icon-menu, 32 | .icon-list, 33 | .icon-options-vertical, 34 | .icon-options, 35 | .icon-arrow-down, 36 | .icon-arrow-left, 37 | .icon-arrow-right, 38 | .icon-arrow-up, 39 | .icon-arrow-up-circle, 40 | .icon-arrow-left-circle, 41 | .icon-arrow-right-circle, 42 | .icon-arrow-down-circle, 43 | .icon-check, 44 | .icon-clock, 45 | .icon-plus, 46 | .icon-minus, 47 | .icon-close, 48 | .icon-event, 49 | .icon-exclamation, 50 | .icon-organization, 51 | .icon-trophy, 52 | .icon-screen-smartphone, 53 | .icon-screen-desktop, 54 | .icon-plane, 55 | .icon-notebook, 56 | .icon-mustache, 57 | .icon-mouse, 58 | .icon-magnet, 59 | .icon-energy, 60 | .icon-disc, 61 | .icon-cursor, 62 | .icon-cursor-move, 63 | .icon-crop, 64 | .icon-chemistry, 65 | .icon-speedometer, 66 | .icon-shield, 67 | .icon-screen-tablet, 68 | .icon-magic-wand, 69 | .icon-hourglass, 70 | .icon-graduation, 71 | .icon-ghost, 72 | .icon-game-controller, 73 | .icon-fire, 74 | .icon-eyeglass, 75 | .icon-envelope-open, 76 | .icon-envelope-letter, 77 | .icon-bell, 78 | .icon-badge, 79 | .icon-anchor, 80 | .icon-wallet, 81 | .icon-vector, 82 | .icon-speech, 83 | .icon-puzzle, 84 | .icon-printer, 85 | .icon-present, 86 | .icon-playlist, 87 | .icon-pin, 88 | .icon-picture, 89 | .icon-handbag, 90 | .icon-globe-alt, 91 | .icon-globe, 92 | .icon-folder-alt, 93 | .icon-folder, 94 | .icon-film, 95 | .icon-feed, 96 | .icon-drop, 97 | .icon-drawer, 98 | .icon-docs, 99 | .icon-doc, 100 | .icon-diamond, 101 | .icon-cup, 102 | .icon-calculator, 103 | .icon-bubbles, 104 | .icon-briefcase, 105 | .icon-book-open, 106 | .icon-basket-loaded, 107 | .icon-basket, 108 | .icon-bag, 109 | .icon-action-undo, 110 | .icon-action-redo, 111 | .icon-wrench, 112 | .icon-umbrella, 113 | .icon-trash, 114 | .icon-tag, 115 | .icon-support, 116 | .icon-frame, 117 | .icon-size-fullscreen, 118 | .icon-size-actual, 119 | .icon-shuffle, 120 | .icon-share-alt, 121 | .icon-share, 122 | .icon-rocket, 123 | .icon-question, 124 | .icon-pie-chart, 125 | .icon-pencil, 126 | .icon-note, 127 | .icon-loop, 128 | .icon-home, 129 | .icon-grid, 130 | .icon-graph, 131 | .icon-microphone, 132 | .icon-music-tone-alt, 133 | .icon-music-tone, 134 | .icon-earphones-alt, 135 | .icon-earphones, 136 | .icon-equalizer, 137 | .icon-like, 138 | .icon-dislike, 139 | .icon-control-start, 140 | .icon-control-rewind, 141 | .icon-control-play, 142 | .icon-control-pause, 143 | .icon-control-forward, 144 | .icon-control-end, 145 | .icon-volume-1, 146 | .icon-volume-2, 147 | .icon-volume-off, 148 | .icon-calendar, 149 | .icon-bulb, 150 | .icon-chart, 151 | .icon-ban, 152 | .icon-bubble, 153 | .icon-camrecorder, 154 | .icon-camera, 155 | .icon-cloud-download, 156 | .icon-cloud-upload, 157 | .icon-envelope, 158 | .icon-eye, 159 | .icon-flag, 160 | .icon-heart, 161 | .icon-info, 162 | .icon-key, 163 | .icon-link, 164 | .icon-lock, 165 | .icon-lock-open, 166 | .icon-magnifier, 167 | .icon-magnifier-add, 168 | .icon-magnifier-remove, 169 | .icon-paper-clip, 170 | .icon-paper-plane, 171 | .icon-power, 172 | .icon-refresh, 173 | .icon-reload, 174 | .icon-settings, 175 | .icon-star, 176 | .icon-symbol-female, 177 | .icon-symbol-male, 178 | .icon-target, 179 | .icon-credit-card, 180 | .icon-paypal, 181 | .icon-social-tumblr, 182 | .icon-social-twitter, 183 | .icon-social-facebook, 184 | .icon-social-instagram, 185 | .icon-social-linkedin, 186 | .icon-social-pinterest, 187 | .icon-social-github, 188 | .icon-social-google, 189 | .icon-social-reddit, 190 | .icon-social-skype, 191 | .icon-social-dribbble, 192 | .icon-social-behance, 193 | .icon-social-foursqare, 194 | .icon-social-soundcloud, 195 | .icon-social-spotify, 196 | .icon-social-stumbleupon, 197 | .icon-social-youtube, 198 | .icon-social-dropbox, 199 | .icon-social-vkontakte, 200 | .icon-social-steam { 201 | font-family: 'simple-line-icons'; 202 | speak: none; 203 | font-style: normal; 204 | font-weight: normal; 205 | font-variant: normal; 206 | text-transform: none; 207 | line-height: 1; 208 | /* Better Font Rendering =========== */ 209 | -webkit-font-smoothing: antialiased; 210 | -moz-osx-font-smoothing: grayscale; 211 | } 212 | .icon-user:before { 213 | content: "\e005"; 214 | } 215 | .icon-people:before { 216 | content: "\e001"; 217 | } 218 | .icon-user-female:before { 219 | content: "\e000"; 220 | } 221 | .icon-user-follow:before { 222 | content: "\e002"; 223 | } 224 | .icon-user-following:before { 225 | content: "\e003"; 226 | } 227 | .icon-user-unfollow:before { 228 | content: "\e004"; 229 | } 230 | .icon-login:before { 231 | content: "\e066"; 232 | } 233 | .icon-logout:before { 234 | content: "\e065"; 235 | } 236 | .icon-emotsmile:before { 237 | content: "\e021"; 238 | } 239 | .icon-phone:before { 240 | content: "\e600"; 241 | } 242 | .icon-call-end:before { 243 | content: "\e048"; 244 | } 245 | .icon-call-in:before { 246 | content: "\e047"; 247 | } 248 | .icon-call-out:before { 249 | content: "\e046"; 250 | } 251 | .icon-map:before { 252 | content: "\e033"; 253 | } 254 | .icon-location-pin:before { 255 | content: "\e096"; 256 | } 257 | .icon-direction:before { 258 | content: "\e042"; 259 | } 260 | .icon-directions:before { 261 | content: "\e041"; 262 | } 263 | .icon-compass:before { 264 | content: "\e045"; 265 | } 266 | .icon-layers:before { 267 | content: "\e034"; 268 | } 269 | .icon-menu:before { 270 | content: "\e601"; 271 | } 272 | .icon-list:before { 273 | content: "\e067"; 274 | } 275 | .icon-options-vertical:before { 276 | content: "\e602"; 277 | } 278 | .icon-options:before { 279 | content: "\e603"; 280 | } 281 | .icon-arrow-down:before { 282 | content: "\e604"; 283 | } 284 | .icon-arrow-left:before { 285 | content: "\e605"; 286 | } 287 | .icon-arrow-right:before { 288 | content: "\e606"; 289 | } 290 | .icon-arrow-up:before { 291 | content: "\e607"; 292 | } 293 | .icon-arrow-up-circle:before { 294 | content: "\e078"; 295 | } 296 | .icon-arrow-left-circle:before { 297 | content: "\e07a"; 298 | } 299 | .icon-arrow-right-circle:before { 300 | content: "\e079"; 301 | } 302 | .icon-arrow-down-circle:before { 303 | content: "\e07b"; 304 | } 305 | .icon-check:before { 306 | content: "\e080"; 307 | } 308 | .icon-clock:before { 309 | content: "\e081"; 310 | } 311 | .icon-plus:before { 312 | content: "\e095"; 313 | } 314 | .icon-minus:before { 315 | content: "\e615"; 316 | } 317 | .icon-close:before { 318 | content: "\e082"; 319 | } 320 | .icon-event:before { 321 | content: "\e619"; 322 | } 323 | .icon-exclamation:before { 324 | content: "\e617"; 325 | } 326 | .icon-organization:before { 327 | content: "\e616"; 328 | } 329 | .icon-trophy:before { 330 | content: "\e006"; 331 | } 332 | .icon-screen-smartphone:before { 333 | content: "\e010"; 334 | } 335 | .icon-screen-desktop:before { 336 | content: "\e011"; 337 | } 338 | .icon-plane:before { 339 | content: "\e012"; 340 | } 341 | .icon-notebook:before { 342 | content: "\e013"; 343 | } 344 | .icon-mustache:before { 345 | content: "\e014"; 346 | } 347 | .icon-mouse:before { 348 | content: "\e015"; 349 | } 350 | .icon-magnet:before { 351 | content: "\e016"; 352 | } 353 | .icon-energy:before { 354 | content: "\e020"; 355 | } 356 | .icon-disc:before { 357 | content: "\e022"; 358 | } 359 | .icon-cursor:before { 360 | content: "\e06e"; 361 | } 362 | .icon-cursor-move:before { 363 | content: "\e023"; 364 | } 365 | .icon-crop:before { 366 | content: "\e024"; 367 | } 368 | .icon-chemistry:before { 369 | content: "\e026"; 370 | } 371 | .icon-speedometer:before { 372 | content: "\e007"; 373 | } 374 | .icon-shield:before { 375 | content: "\e00e"; 376 | } 377 | .icon-screen-tablet:before { 378 | content: "\e00f"; 379 | } 380 | .icon-magic-wand:before { 381 | content: "\e017"; 382 | } 383 | .icon-hourglass:before { 384 | content: "\e018"; 385 | } 386 | .icon-graduation:before { 387 | content: "\e019"; 388 | } 389 | .icon-ghost:before { 390 | content: "\e01a"; 391 | } 392 | .icon-game-controller:before { 393 | content: "\e01b"; 394 | } 395 | .icon-fire:before { 396 | content: "\e01c"; 397 | } 398 | .icon-eyeglass:before { 399 | content: "\e01d"; 400 | } 401 | .icon-envelope-open:before { 402 | content: "\e01e"; 403 | } 404 | .icon-envelope-letter:before { 405 | content: "\e01f"; 406 | } 407 | .icon-bell:before { 408 | content: "\e027"; 409 | } 410 | .icon-badge:before { 411 | content: "\e028"; 412 | } 413 | .icon-anchor:before { 414 | content: "\e029"; 415 | } 416 | .icon-wallet:before { 417 | content: "\e02a"; 418 | } 419 | .icon-vector:before { 420 | content: "\e02b"; 421 | } 422 | .icon-speech:before { 423 | content: "\e02c"; 424 | } 425 | .icon-puzzle:before { 426 | content: "\e02d"; 427 | } 428 | .icon-printer:before { 429 | content: "\e02e"; 430 | } 431 | .icon-present:before { 432 | content: "\e02f"; 433 | } 434 | .icon-playlist:before { 435 | content: "\e030"; 436 | } 437 | .icon-pin:before { 438 | content: "\e031"; 439 | } 440 | .icon-picture:before { 441 | content: "\e032"; 442 | } 443 | .icon-handbag:before { 444 | content: "\e035"; 445 | } 446 | .icon-globe-alt:before { 447 | content: "\e036"; 448 | } 449 | .icon-globe:before { 450 | content: "\e037"; 451 | } 452 | .icon-folder-alt:before { 453 | content: "\e039"; 454 | } 455 | .icon-folder:before { 456 | content: "\e089"; 457 | } 458 | .icon-film:before { 459 | content: "\e03a"; 460 | } 461 | .icon-feed:before { 462 | content: "\e03b"; 463 | } 464 | .icon-drop:before { 465 | content: "\e03e"; 466 | } 467 | .icon-drawer:before { 468 | content: "\e03f"; 469 | } 470 | .icon-docs:before { 471 | content: "\e040"; 472 | } 473 | .icon-doc:before { 474 | content: "\e085"; 475 | } 476 | .icon-diamond:before { 477 | content: "\e043"; 478 | } 479 | .icon-cup:before { 480 | content: "\e044"; 481 | } 482 | .icon-calculator:before { 483 | content: "\e049"; 484 | } 485 | .icon-bubbles:before { 486 | content: "\e04a"; 487 | } 488 | .icon-briefcase:before { 489 | content: "\e04b"; 490 | } 491 | .icon-book-open:before { 492 | content: "\e04c"; 493 | } 494 | .icon-basket-loaded:before { 495 | content: "\e04d"; 496 | } 497 | .icon-basket:before { 498 | content: "\e04e"; 499 | } 500 | .icon-bag:before { 501 | content: "\e04f"; 502 | } 503 | .icon-action-undo:before { 504 | content: "\e050"; 505 | } 506 | .icon-action-redo:before { 507 | content: "\e051"; 508 | } 509 | .icon-wrench:before { 510 | content: "\e052"; 511 | } 512 | .icon-umbrella:before { 513 | content: "\e053"; 514 | } 515 | .icon-trash:before { 516 | content: "\e054"; 517 | } 518 | .icon-tag:before { 519 | content: "\e055"; 520 | } 521 | .icon-support:before { 522 | content: "\e056"; 523 | } 524 | .icon-frame:before { 525 | content: "\e038"; 526 | } 527 | .icon-size-fullscreen:before { 528 | content: "\e057"; 529 | } 530 | .icon-size-actual:before { 531 | content: "\e058"; 532 | } 533 | .icon-shuffle:before { 534 | content: "\e059"; 535 | } 536 | .icon-share-alt:before { 537 | content: "\e05a"; 538 | } 539 | .icon-share:before { 540 | content: "\e05b"; 541 | } 542 | .icon-rocket:before { 543 | content: "\e05c"; 544 | } 545 | .icon-question:before { 546 | content: "\e05d"; 547 | } 548 | .icon-pie-chart:before { 549 | content: "\e05e"; 550 | } 551 | .icon-pencil:before { 552 | content: "\e05f"; 553 | } 554 | .icon-note:before { 555 | content: "\e060"; 556 | } 557 | .icon-loop:before { 558 | content: "\e064"; 559 | } 560 | .icon-home:before { 561 | content: "\e069"; 562 | } 563 | .icon-grid:before { 564 | content: "\e06a"; 565 | } 566 | .icon-graph:before { 567 | content: "\e06b"; 568 | } 569 | .icon-microphone:before { 570 | content: "\e063"; 571 | } 572 | .icon-music-tone-alt:before { 573 | content: "\e061"; 574 | } 575 | .icon-music-tone:before { 576 | content: "\e062"; 577 | } 578 | .icon-earphones-alt:before { 579 | content: "\e03c"; 580 | } 581 | .icon-earphones:before { 582 | content: "\e03d"; 583 | } 584 | .icon-equalizer:before { 585 | content: "\e06c"; 586 | } 587 | .icon-like:before { 588 | content: "\e068"; 589 | } 590 | .icon-dislike:before { 591 | content: "\e06d"; 592 | } 593 | .icon-control-start:before { 594 | content: "\e06f"; 595 | } 596 | .icon-control-rewind:before { 597 | content: "\e070"; 598 | } 599 | .icon-control-play:before { 600 | content: "\e071"; 601 | } 602 | .icon-control-pause:before { 603 | content: "\e072"; 604 | } 605 | .icon-control-forward:before { 606 | content: "\e073"; 607 | } 608 | .icon-control-end:before { 609 | content: "\e074"; 610 | } 611 | .icon-volume-1:before { 612 | content: "\e09f"; 613 | } 614 | .icon-volume-2:before { 615 | content: "\e0a0"; 616 | } 617 | .icon-volume-off:before { 618 | content: "\e0a1"; 619 | } 620 | .icon-calendar:before { 621 | content: "\e075"; 622 | } 623 | .icon-bulb:before { 624 | content: "\e076"; 625 | } 626 | .icon-chart:before { 627 | content: "\e077"; 628 | } 629 | .icon-ban:before { 630 | content: "\e07c"; 631 | } 632 | .icon-bubble:before { 633 | content: "\e07d"; 634 | } 635 | .icon-camrecorder:before { 636 | content: "\e07e"; 637 | } 638 | .icon-camera:before { 639 | content: "\e07f"; 640 | } 641 | .icon-cloud-download:before { 642 | content: "\e083"; 643 | } 644 | .icon-cloud-upload:before { 645 | content: "\e084"; 646 | } 647 | .icon-envelope:before { 648 | content: "\e086"; 649 | } 650 | .icon-eye:before { 651 | content: "\e087"; 652 | } 653 | .icon-flag:before { 654 | content: "\e088"; 655 | } 656 | .icon-heart:before { 657 | content: "\e08a"; 658 | } 659 | .icon-info:before { 660 | content: "\e08b"; 661 | } 662 | .icon-key:before { 663 | content: "\e08c"; 664 | } 665 | .icon-link:before { 666 | content: "\e08d"; 667 | } 668 | .icon-lock:before { 669 | content: "\e08e"; 670 | } 671 | .icon-lock-open:before { 672 | content: "\e08f"; 673 | } 674 | .icon-magnifier:before { 675 | content: "\e090"; 676 | } 677 | .icon-magnifier-add:before { 678 | content: "\e091"; 679 | } 680 | .icon-magnifier-remove:before { 681 | content: "\e092"; 682 | } 683 | .icon-paper-clip:before { 684 | content: "\e093"; 685 | } 686 | .icon-paper-plane:before { 687 | content: "\e094"; 688 | } 689 | .icon-power:before { 690 | content: "\e097"; 691 | } 692 | .icon-refresh:before { 693 | content: "\e098"; 694 | } 695 | .icon-reload:before { 696 | content: "\e099"; 697 | } 698 | .icon-settings:before { 699 | content: "\e09a"; 700 | } 701 | .icon-star:before { 702 | content: "\e09b"; 703 | } 704 | .icon-symbol-female:before { 705 | content: "\e09c"; 706 | } 707 | .icon-symbol-male:before { 708 | content: "\e09d"; 709 | } 710 | .icon-target:before { 711 | content: "\e09e"; 712 | } 713 | .icon-credit-card:before { 714 | content: "\e025"; 715 | } 716 | .icon-paypal:before { 717 | content: "\e608"; 718 | } 719 | .icon-social-tumblr:before { 720 | content: "\e00a"; 721 | } 722 | .icon-social-twitter:before { 723 | content: "\e009"; 724 | } 725 | .icon-social-facebook:before { 726 | content: "\e00b"; 727 | } 728 | .icon-social-instagram:before { 729 | content: "\e609"; 730 | } 731 | .icon-social-linkedin:before { 732 | content: "\e60a"; 733 | } 734 | .icon-social-pinterest:before { 735 | content: "\e60b"; 736 | } 737 | .icon-social-github:before { 738 | content: "\e60c"; 739 | } 740 | .icon-social-google:before { 741 | content: "\e60d"; 742 | } 743 | .icon-social-reddit:before { 744 | content: "\e60e"; 745 | } 746 | .icon-social-skype:before { 747 | content: "\e60f"; 748 | } 749 | .icon-social-dribbble:before { 750 | content: "\e00d"; 751 | } 752 | .icon-social-behance:before { 753 | content: "\e610"; 754 | } 755 | .icon-social-foursqare:before { 756 | content: "\e611"; 757 | } 758 | .icon-social-soundcloud:before { 759 | content: "\e612"; 760 | } 761 | .icon-social-spotify:before { 762 | content: "\e613"; 763 | } 764 | .icon-social-stumbleupon:before { 765 | content: "\e614"; 766 | } 767 | .icon-social-youtube:before { 768 | content: "\e008"; 769 | } 770 | .icon-social-dropbox:before { 771 | content: "\e00c"; 772 | } 773 | .icon-social-vkontakte:before { 774 | content: "\e618"; 775 | } 776 | .icon-social-steam:before { 777 | content: "\e620"; 778 | } 779 | -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlissesRibeiro/aprendendo-devops/1f9a37de544e6f308f645f1b5473439ed9fd758b/vagrant_labs/html/vendor/simple-line-icons/fonts/Simple-Line-Icons.woff2 -------------------------------------------------------------------------------- /vagrant_labs/provision.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Instalando Apache e configurando setup!" 3 | apt install apache2 -y > /dev/null 2>&1 4 | cp -rfv /vagrant/html/ /var/www/ 5 | service apache2 start --------------------------------------------------------------------------------