Académique Documents
Professionnel Documents
Culture Documents
JOSMARACASTILLOCOTN
ndice
Introduccin..........................................................................................................................................3
Caractersticas.......................................................................................................................................3
Casos de uso.........................................................................................................................................5
Instalacin de Terraform.......................................................................................................................9
Instalacin en sistema operativo Linux...........................................................................................9
Instalacin en sistema operativo Windows....................................................................................11
Comandos de Terraform.....................................................................................................................17
Comando apply.........................................................................................................................18
Comando console......................................................................................................................20
Comando destroy......................................................................................................................20
Comando env............................................................................................................................21
Comando fmt.............................................................................................................................21
Comando force-unlock..............................................................................................................22
Comando get.............................................................................................................................22
Comando graph.........................................................................................................................23
Comando import.......................................................................................................................23
Comando init.............................................................................................................................25
Comando output........................................................................................................................25
Comando plan...........................................................................................................................26
Comando push...........................................................................................................................27
Comando refresh.......................................................................................................................29
Comando show..........................................................................................................................30
Comando state...........................................................................................................................30
Comando taint...........................................................................................................................31
Comando validate.....................................................................................................................32
Comando untaint.......................................................................................................................32
Sintaxis de Terraform.........................................................................................................................33
Proveedores de Terraform...................................................................................................................34
Comenzando con Terraform...............................................................................................................35
Creando un fichero Terraform...................................................................................................35
Creando un plan de ejecucin...................................................................................................36
Actualizando el plan de ejecucin.............................................................................................37
Representando el plan de ejecucin grficamente....................................................................38
Administracin de openstack con Terraform......................................................................................39
Conexin a Openstack..............................................................................................................39
Subiendo par de claves..............................................................................................................41
Creando un volumen.................................................................................................................42
Subiendo imgenes...................................................................................................................43
Asignando ip flotantes al proyecto............................................................................................46
Creando un nuevo grupo de seguridad......................................................................................47
Agregando regla de seguridad...................................................................................................48
Creando una red........................................................................................................................49
Creando subred.........................................................................................................................51
Creando un router en la red pblica..........................................................................................52
Creando interfaz de red en un router.........................................................................................53
Creando instancia......................................................................................................................55
Asociando un volumen a la mquina........................................................................................57
Bibliografa.........................................................................................................................................59
JOSMARACASTILLOCOTN
Introduccin
Terraformesunaherramientaparaconstruir,combinaryponerenmarchademanera
segura y eficiente la infraestructura. Desde servidores fsicos a contenedores hasta
productosSaaS(SoftwarecomounServicio),Terraformescapazdecrearycomponer
todosloscomponentesnecesariosparaejecutarcualquierserviciooaplicacin.
Terraformcodificaelconocimientosobresuinfraestructuraadiferenciadecualquierotra
herramienta,yproporcionaelflujodetrabajoyherramientasparacambiaryactualizarla
infraestructuraconseguridad.
Estaherramientalepermitecrear,cambiarymejorardemanerasegurayprevisiblela
infraestructura de produccin. Es de cdigo abierto que codifica APIs en archivos de
configuracin que pueden ser compartidos entre miembros del equipo, tratados como
cdigo,editados,revisadosyversionados.
Caractersticas
InfraestructuracomoCdigo
Lainfraestructurasedescribeutilizandounasintaxisdeconfiguracindealtonivel.Esto
permitequeunmodelodesucentrodedatosseaversionadoytratadocomoloharacon
cualquierotrocdigo.Adems,lainfraestructurapuedesercompartidayreutilizada.
JOSMARACASTILLOCOTN
PlanesdeEjecucin
Terraformtieneunpasode"planificacin"dondegeneraunplandeejecucin.Elplande
ejecucinmuestraloqueharcuandoejecutemosterraformplan.Estolepermiteevitar
sorpresascuandoTerraformmanipulelainfraestructura.
Representacingrficaderecursos
Automatizacindeloscambios
JOSMARACASTILLOCOTN
Casosdeuso
Terraformsepuedeusarparacodificarlaconfiguracinrequeridaparaunaaplicacin,
asegurandoquetodosloscomplementosnecesariosestndisponibles,peropuedeiran
mslejos:configurarunDNSimpleparaconfigurarunCNAMEoconfigurarCloudflare
comoCDNparalaaplicacin.Lomejordetodoesquepuedehacertodoestoenmenos
de30segundossinusarunainterfazweb.
Aplicacionesdevariosniveles
UnpatrnmuycomneslaarquitecturaNtier.Laarquitecturadedosnivelesmscomn
esungrupodeservidoreswebqueutilizanunniveldebasededatos.Seaadenniveles
adicionales para servidores API, servidores de almacenamiento en cach, mallas de
enrutamiento,etc.Estepatrnseutilizaporquelosnivelessepuedenescalardeforma
independienteyproporcionarunaseparacindelosservicios.
ArquitecturaNtier:
Terraformesunaherramientaidealparaconstruirygestionarestasinfraestructuras.Cada
nivelsepuededescribircomounacoleccinderecursosylasdependenciasentrecada
nivelsemanejanautomticamente;Terraformgarantizarqueelniveldebasededatos
estdisponibleantesdequeseinicienlosservidoreswebyquelosequilibradoresde
cargatenganconocimientodelosnodosweb.Cadanivelsepuedeescalarfcilmente
usandoTerraformmodificandounnicovalordeconfiguracindecount.Debidoaquela
creacinyelaprovisionamientodeunrecursoestcodificadoyautomatizado,laescala
elsticaconcargasevuelvetrivial.
JOSMARACASTILLOCOTN
Clstersdeautoservicio
UtilizandoTerraform,elconocimientodecmoconstruiryescalarunserviciopuedeser
codificado en una configuracin. Las configuraciones de Terraform pueden ser
compartidasdentrodeunaorganizacin,permitiendoalosequiposdelosclientesutilizar
la configuracin como una caja negra yutilizar Terraformcomo una herramienta para
administrarsusservicios.
DemosdeSoftware
LosprogramadoresdesoftwarepuedenproporcionarunaconfiguracindeTerraformpara
crear,suministrareiniciarunademostracindeproveedoresenlanubecomoAWS.Esto
permitealosusuariosfinalesprobarfcilmenteelsoftwareensupropiainfraestructurae
incluso permite ajustar parmetros como el tamao de clster para probar ms
rigurosamentelasherramientasacualquierescala.
EntornosdePrueba
EsunaprcticacomntenerunentornodeproduccinoQA(qualityassurance).Estos
entornos son clones ms pequeos del entorno de produccin, pero se utilizan para
probarnuevasaplicacionesantesdeliberarenelentornodeproduccin.Amedidaqueel
entornodeproduccincreceysevuelvemscomplejo,resultacadavezmsdifcilde
manteneractualizado.
JOSMARACASTILLOCOTN
ConTerraform,elentornodeproduccinpuedesercodificadoyluegocompartidocon
QAodev.Estasconfiguracionespuedenutilizarseparahacergirarrpidamentenuevos
entornosparaprobaryluegosereliminadosfcilmente.Estaherramientapuedeayudara
manejarladificultaddemantenerambientesparalelos,yloshaceprcticoparacrearlosy
destruirloselsticamente.
Redesdefinidasporsoftware
Lasredesdefinidasporsoftware(SDN)seestconvirtiendocadavezmsfrecuenteenel
centrodedatos,yaqueproporcionamscontrolalosoperadoresydesarrolladoresy
permitealaredapoyarmejorlasaplicacionesqueseejecutanenlacapasuperior.La
mayora de las implementaciones SDN tienen una capa de control y una capa de
infraestructura.
Terraformsepuedeutilizarparacodificarlaconfiguracinderedesdefinidasporsoftware.
EstaconfiguracinpuedeentoncesserutilizadaporTerraformparaconfigurarymodificar
automticamentelaconfiguracinalinteractuarconlacapadecontrol.Estopermiteque
laconfiguracinseversioneyqueloscambiosseanautomatizados.Comoejemplo,AWS
VirtualPrivateCloud(VPC)esunadelasimplementacionesSDNmsutilizadasypuede
serconfiguradaporTerraform.
Programadoresderecursos
Eninfraestructurasdegranescala,laasignacinestticadeaplicacionesalasmquinas
se vuelve cada vez ms difcil. Para resolver ese problema, hay una serie de
orquestadorescomo Borg,Mesos, YARN y Kubernetes. stos se puedenutilizarpara
programar dinmicamente contenedores Docker, Hadoop, Spark y muchas otras
herramientasdesoftware.
TerraformnoselimitaaproveedoresfsicoscomoAWS(AmazonWebServices).Los
planificadoresderecursospuedensertratadoscomounproveedor,loquepermiteaesta
herramienta solicitar recursos de ellos. Esto permite que se utilice en capas: para
configurar la infraestructura fsica que ejecuta los planificadores as como el
aprovisionamientoenlaredprogramada.
JOSMARACASTILLOCOTN
Implementacindemulticloud
Infraestructuramulticloud:
Realizarimplementacionesmultinubepuedesermuydifcilyaquemuchasherramientas
existentesparalaadministracindeinfraestructurasonespecficasdelanube.Terraform
permitequeunanicaconfiguracinseutiliceparaadministrarmltiplesproveedorese
inclusomanejardependenciasentrenubes.Estosimplificalagestinylaorquestacin,
ayudandoalosoperadoresaconstruirinfraestructurasmulticloudagranescala.
JOSMARACASTILLOCOTN
InstalacindeTerraform
ParainstalarTerraform,descargamoselpaqueteapropiadoparanuestrosistemadesde
lapginaoficialdeTerraform.
SistemasoperativoscompatiblesconTerraform:
Linux:32bit|64bit|Arm
Windows:32bit|64bit
MacOSX:64bit
FreeBSD:32bit|64bit|Arm
OpenBSD:32bit|64bit
Solaris:64bit
encontramoslosbinarios.
JOSMARACASTILLOCOTN
Seleccionamoselsistemaoperativoylaarquitectura,ennuestrocasoelegiremosLinux
64bitpuestoqueloinstalaremosenunamaquinaDebianjessie.
CreamosundirectorioparalosbinariosdeTerraform.
Moveremoselficherodescargadoanteriormentealinteriordelacarpeta.
Nossituamoseneldirectorioterraform.
JOSMARACASTILLOCOTN
DescomprimimoslosbinariosdeTerraformconelcomandounzip.
ExportamoslasvariablesdeentornodeTerraform.
Porltimocomprobamosquesehainstaladobienejecutandoelcomandosiguiente:
encontramoselejecutable.
JOSMARACASTILLOCOTN
Seleccionamos el sistema operativo y la arquitectura, en nuestro caso elegiremos
Windows64bitpuestoqueloinstalaremosenunamaquinaWindows10.
CreamosundirectorioparaelejecutabledeTerraform.
Copiamoselficherodescargadoanteriormentealdirectorioterraform.
JOSMARACASTILLOCOTN
Nossituamoseneldirectorioterraform.
Descomprimimoselejecutableenelinteriordeldirectoriocreadoanteriormente.
AhoraaadimoslavariabledeentornodeTerraformparaelusuario,paraelloenelmen
iniciodeWindowshacemosclicderechoensistema.
JOSMARACASTILLOCOTN
HacemosclicenConfiguracinavanzadadelsistema.
HacemosclicenVariablesdeentorno.
JOSMARACASTILLOCOTN
EnlasiguientepantallapulsamoselbotnNueva.
AsignamosunnombrealavariableyenelbotnExaminararchivobuscamoslarutadel
ejecutabledeTerraform.
JOSMARACASTILLOCOTN
Aceptamosycomprobamosquesehaguardadolavariabledeentorno.
AhoradesdeunaventanadesmbolodesistemacomprobamosqueTerraformfunciona.
JOSMARACASTILLOCOTN
ComandosdeTerraform
Terraformsecontrolaatravsdeunainterfazdelneadecomandosmuyfcildeusar.
Para ver una lista de los comandos disponibles en cualquier momento, simplemente
ejecutamosterraformsinargumentos:
Paraobtenerayudaparacualquiercomandoespecfico,introducimoselparmetroho
help al subcomando correspondiente. Por ejemplo, para ver la ayuda sobre el
subcomandoconsole.
JOSMARACASTILLOCOTN
Comando apply
Elcomandoterraformapplyseutilizaparaaplicarloscambiosnecesariosparaalcanzarel
estadodeseadodelaconfiguracin,oelconjuntopredefinidodeaccionesgeneradopor
unplanejecucin.
terraformapply[options][dirorplan]
Deformapredeterminada,applyexaminaeldirectorioactualdelaconfiguracinyaplica
loscambiosdeformaadecuada.Sinembargo,sepuedeproporcionarunarutaaotra
configuracinounplandeejecucin.Losplanesdeejecucinsepuedenutilizarpara
ejecutarsolamenteunconjuntopredeterminadodeacciones.
JOSMARACASTILLOCOTN
Los indicadores de lnea de comandos son todos opcionales. La lista de parmetros
disponibleses:
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracindevolveraintentarunbloqueodeestado.
input=trueSolicitaentradaparavariablessinoseestablecedirectamente.
nocolorDesactivalasalidaconcolor.
parallelism=nLimitaelnmerodeoperacionesconcurrentescuandoTerraform
recorreelgrfico.
refresh=trueActualizaelestadodecadarecursoantesdeplanificaryaplicar.
Estonotieneefectosiunarchivodelplansedadirectamenteparaaplicar.
stateout=pathRutaparaescribirelarchivodeestadoactualizado.Pordefecto
stateusarlaruta.Seignoracuandoseutilizaelestadoremoto.
JOSMARACASTILLOCOTN
Comando console
Elcomandoterraformconsolecreaunaconsolainteractiva.
terraformconsole[options][dir]
Estoestilparaprobarantesdeusarlasenconfiguraciones,ascomointeractuarconun
estadoexistente.
Sinoexisteunarchivodeestado,laconsolatodavafuncionaysepuedeutilizarpara
experimentarconfuncionescompatibles.
El dir se puede utilizar para abrir una consola para un directorio de configuracin de
Terraform especfico. Esto cargar cualquier estado de ese directorio, as como la
configuracin. El valor predeterminado es el directorio de trabajo actual. El comando
consolenorequierequeelestadodeTerraformolaconfiguracinfuncione.
Lalistadeparmetrosdisponiblees:
PuedecerrarlaconsolaconelcomandoexitomedianteControlCoControlD.
Comando destroy
terraformdestroy[options][dir]
JOSMARACASTILLOCOTN
Siseestableceforce,entonceslaconfirmacindedestruirnosemostrar.
Comando env
terraformenv[nombre]
list:Elcomandomostrartodoslosentornoscreados.
Delete:Elcomandoterraformenvdeleteseutilizaparaeliminarunentorno
existente.
Comando fmt
terraformfmt[options][dir]
JOSMARACASTILLOCOTN
list=trueListadearchivoscuyoformatodifiere(desactivadosiseutilizaSTDIN).
diff=falseMostrardiferenciasdecambiosdeformato.
Comando force-unlock
terraformforceunlock[dir]
Opciones:
forceFuerzalaeliminacindelbloqueodelestadoparalaconfiguracinactual.
Comando get
Elcomandoterraformgetseutilizaparadescargaryactualizarmdulos.
terraformget[options][dir]
Los mdulos se descargan en una carpeta .terraform local. Esta carpeta no debe
asignarse al control de versiones. La carpeta .terraform se crea en relacin con su
directoriodetrabajoactual,independientementedelargumentodirdadoaestecomando.
Opciones:
updateConlaopcinupdatealosmdulosdescargadoscompruebasitienen
actualizacionesyselasdescargasiestadisponible.
JOSMARACASTILLOCOTN
Comando graph
El comando terraform graph se utiliza para generar una representacin visual de una
configuracinoplandeejecucin.
Uso:terraformgraph[options][dir]
EmiteelgrficodedependenciavisualdelosrecursosdeTerraformsegnlosarchivos
deconfiguracinendir(oeldirectorioactualsiseomite).
ElgrficoseemiteenformatoDOT.Elprogramatpicoquepuedeleeresteformatoes
GraphViz,peromuchosservicioswebtambinestndisponiblesparaleeresteformato.
Opciones:
drawcyclesDestaquecualquiercicloenelgrficoconbordescoloreados.Esto
ayudaaldiagnosticarerroresdeciclo.
nocolorSiseespecifica,lasalidanocontendrningncolor.
type=planTipodegrficodesalida.Puedeser:plan,plandestroy,apply,legacy.
Comando import
ElcomandodeterraformimportseutilizaparaimportarrecursosaTerraform.
terraformimport[options]ADDRESSID
LaimportacinbuscarelrecursoexistentedelIDyloimportarenlaADDRESSdada.
ADDRESSdebeserunadireccinderecursovlida.Dadoquecualquierdireccinde
recursosesvlida,elcomandoimportpuedeimportarrecursosenmdulos.
JOSMARACASTILLOCOTN
IDdependedeltipoderecursoimportado.Porejemplo,parainstanciasdeAWSeselIDi
abcd1234 ( iabcd1234 ), pero para las zonas de AWS Route53 es el ID de zona
(Z12ABC4UGMOZ2N).CadaproveedortienesuformatodeID.
Opciones:
input=trueSideseasolicitarinformacinparalaconfiguracindelproveedor.
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracindevolveraintentarunbloqueodeestado.
nocolorSiseespecifica,lasalidanocontendrningncolor.
state=pathLarutadeaccesoparaleeryguardararchivosdeestado(amenos
queseespecifiqueestadoout).
JOSMARACASTILLOCOTN
Comando init
ElcomandoterraforminitseutilizaparainicializarunaconfiguracindeTerraform.Estees
elprimercomandoquesedebeejecutarparacualquierconfiguracindeTerraformnueva
oexistente.
terraforminit[options][SOURCE][PATH]
Opciones:
backend=trueInicializaelbackendparaesteentorno.
get=trueDescarguecualquiermduloparaestaconfiguracin.
input=trueSoliciteinformacininteractivasiesnecesario.Siestoesfalsoyla
entradaesinit,initerror.
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracindevolveraintentarunbloqueodeestado.
nocolorSiseespecifica,lasalidanocontendrningncolor.
forcecopySuprimelasindicacionessobrelacopiadedatosdeestado.Estoes
equivalenteaproporcionarun"s"atodoslosmensajesdeconfirmacin.
Comando output
Elcomandoterraformoutputseutilizaparaextraerelvalordeunavariabledesalidade
unficherodeestado.
terraformoutput[options][name]
JOSMARACASTILLOCOTN
Opciones:
jsonSiseespecifica,lassalidasseformateancomounobjetoJSON,conuna
claveporsalida.Siseespecifica[name],slosedevolverlasalidaespecificada.
Esto se puede canalizar en herramientas tales como jq para el procesamiento
adicional.
module=module_nameLarutadelmduloquehamodule=module_namesalida.
Pordefectoeslarutaraz.Otrosmdulossepuedenespecificarmedianteunalista
separada por perodos. Ejemplo: "foo" hara referencia al mdulo "foo" pero
"foo.bar"harareferenciaalmdulo"bar"enelmdulo"foo".
Comando plan
Elcomandoterraformplanseutilizaparacrearunplandeejecucin.Terraformrealiza
unaactualizacin,amenosquesedeshabiliteexplcitamentey,acontinuacin,determina
quaccionessonnecesariasparalograrelestadodeseadoespecificadoenlosarchivos
deconfiguracin.
terraformplan[options][dirorplan]
Opciones:
detailedexitcodeDevuelveuncdigodesalidadetailedexitcodecuandosaleel
comando.Cuandoseproporciona,esteargumentocambialoscdigosdesaliday
sussignificadosparaproporcionarinformacinmsgranularsobreloqueelplan
resultantecontiene:
0=Sincambios
1=Error
2=Cambiospresentes
input=trueSolicitarentradaparavariablessinoseestablecedirectamente.
JOSMARACASTILLOCOTN
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracindevolveraintentarunbloqueodeestado.
moduledepth=nEspecificalaprofundidaddelosmdulosamostrarenlasalida.
Estonoafectaalplanens,slolasalidamostrada.Deformapredeterminada,
estoes1,loqueampliartodo.
nocolorDesactivalasalidaconcolor.
out=pathLarutaparaguardarelplandeejecucingenerado.Esteplansepuede
utilizarconterraformapplyparaterraformapplydequesoloseaplicanloscambios
quesemuestranenesteplan.Lealaadvertenciasobrelosplanesguardadosa
continuacin.
parallelism=nLimitaelnmerodeoperacionesconcurrentescuandoTerraform
recorreelgrfico.
refresh=trueActualizaelestadoantesdeverificarlasdiferencias.
target=resourceUnatarget=resourcealdestino.Laoperacinselimitaraeste
recursoyasusdependencias.Esteindicadorsepuedeutilizarvariasveces.
Comando push
ElcomandoterraformpushcargasuconfiguracindeTerraformparaqueseagestionada
por Terraform Enterprise. Al cargar su configuracin en Terraform Enterprise, puede
ejecutarTerraformautomticamente,guardartodaslastransicionesdeestado,planesy
mantendrunhistorialdetodaslasejecucionesdeTerraform.
JOSMARACASTILLOCOTN
EstohacequeseamuchomsfcilusarTerraformcomounequipo:losmiembrosdel
equipo modifican las configuraciones de Terraform localmente y continan usando el
controldeversinnormal.CuandolasconfiguracionesdeTerraformestnlistasparaser
ejecutadas, son enviadas a Terraform Enterprise, y cualquier miembro de su equipo
puedeejecutarTerraformconsolopulsarunbotn.
terraformpush[options][path]
Opciones:
atlasaddress=<url>Unadireccinalternativaaunainstancia.
uploadmodules=trueSiestrue(uploadmodules=true),entonceslosmdulos
que se usan estn bloqueados en su comprobacin actual y cargados
completamente.
name=<name>NombredelaconfiguracindelainfraestructuraenTerraform
Enterprise.Elformatodeestees:"nombredeusuario/nombre"paraquepueda
cargarconfiguracionesnosloasucuenta,sinoaotrascuentasyorganizaciones.
nocolorDesactivalasalidaconcolor
varfile=fooEstableceelvalordelasvariablesusandounarchivodevariable.
Esteindicadorsepuedeutilizarvariasveces.
vcs=trueSiestrue(pordefecto),entoncesTerraformdetectarsiunVCSest
enuso,comoGit,ysolosubirarchivosqueestncomprometidosconelcontrolde
versiones. Si no se detecta ningn sistema de control de versiones, Terraform
cargartodoslosarchivosenpath(parmetroalcomando).
JOSMARACASTILLOCOTN
Comando refresh
terraformrefresh[options][dir]
Opciones:
nocolorDesactivalasalidaconcolor
input=trueSolicitarentradaparavariablessinoseestablecedirectamente.
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracindevolveraintentarunbloqueodeestado.
nocolorSiseespecifica,lasalidanocontendrningncolor.
state=pathRutadeaccesoparaleeryescribirelarchivodeestadoen.Elvalor
predeterminado es "terraform.tfstate". Se ignora cuando se utiliza el estado
remoto.
target=resourceUnatarget=resourcealdestino.Laoperacinselimitaraeste
recursoyasusdependencias.Esteindicadorsepuedeutilizarvariasveces.
JOSMARACASTILLOCOTN
Comando show
Elcomandoterraformshowseutilizaparaproporcionarunasalidalegibleparahumanos
desdeunarchivodeestadoodeplan.
terraformshow[options][path]
Opciones:
moduledepth=nEspecificalaprofundidaddelosmdulosamostrarenlasalida.
Deformapredeterminada,estoes1,loqueampliartodo.
nocolorDesactivalasalidaconcolor.
Comando state
Todos los terraform state que modifican el estado escriben archivos de copia de
seguridad.Larutadeaccesodeestosarchivosdecopiadeseguridadsepuedecontrolar
conbackup.
Subcomandosquesondeslolecturanoescribenningnarchivodecopiadeseguridad
yaquenoestnmodificandoelestado.
terraformstate<subcommand>[options][args]
JOSMARACASTILLOCOTN
Subcomandos:
list:EnumeralosrecursosdentrodeunestadodeTerraform.
mv:MueveelementosenunestadodeTerraform.
push:Cargamanualmenteunarchivodeestadolocalenestadoremoto.
rm:EliminaelementosdelestadoTerraform.
show:MuestralosatributosdeunsolorecursoenelestadoTerraform.
Comando taint
Estecomandonomodificarlainfraestructura,sinoquemodificarelarchivodeestado
para marcar un recurso como corrupto. Una vez que un recurso est marcado como
corrupto,elsiguienteplanmostrarqueelrecursoserdestruidoyrecreadoyelsiguiente
implementarestecambio.
terraformtaint[options]name
Elargumentonameeselnombredelrecursoparamarcarcomocorrupto.Elformatode
esteTYPE.NAMEesTYPE.NAME,comoaws_instance.foo
Opciones:
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracinparavolveraintentarunbloqueodeestado.
JOSMARACASTILLOCOTN
module=pathLarutadelmdulodondeexisteelrecursocorrupto.Pordefectoes
larutaraz.
nocolorDesactivalasalidaconcolor
state=pathRutadeaccesoparaleeryescribirelarchivodeestado.Elvalor
predeterminadoes"terraform.tfstate".
Comando validate
El comando terraform validate se utiliza para validar la sintaxis de los ficheros con
extensin.tfdeterraform.Realizaunacomprobacindesintaxisentodoslosarchivos
deldirectorioymostrarunerrorsialgunodelosarchivosnosevalida.
terraformvalidate[dir]
Comando untaint
terraformuntaint[options]name
Opciones:
lock=trueBloqueaelarchivodeestadocuandoseadmiteelbloqueo.
locktimeout=0sDuracinparavolveraintentarunbloqueodeestado.
JOSMARACASTILLOCOTN
module=pathLarutadelmdulodondeexisteelrecursocorrupto.Pordefectoes
larutaraz.
nocolorDesactivalasalidaconcolor
state=pathRutadeaccesoparaleeryescribirelarchivodeestado.Elvalor
predeterminadoes"terraform.tfstate".
SintaxisdeTerraform
El lenguaje de los ficheros de configuracin de Terraform se llama HashiCorp
ConfigurationLanguage(HCL).Losficherossedeberncrearconlaextensin.tf.
EjemplodeficheroTerraform,enelcualnosconectamosalabasededatosMysqly
creamosunabasededatosllamadaterraformbbdd.
# nano /home/usuario/terraform_example/mysql_create.tf
Opcionesbsicas:
Loscomentariosdeunasolalneacomienzancon#
Loscomentariosdevariaslneasseenvuelvencon/*y*/
Los valores se asignan con la sintaxis key = value (el espacio en blanco no
importa).Elvalorpuedesercadena,nmero,booleano,unalistaoundiccionario.
Lascadenasestnencomillasdobles.
Lascadenaspuedentomarotrosvaloresusandolasintaxisenvueltaen${},como
${var.foo}.
Lascadenasdemultilneapuedenusarlasintaxisde"aqudoc",conlacadena
comenzandoconunmarcadorcomo<<EOFyluegolacadenaqueterminacon
JOSMARACASTILLOCOTN
EOFenunalneapropia.Laslneasdelacadenayelmarcadorfinalnodeben
estarsangrados.
Sesuponequelosnmerossonlabase10.Siseprefiereunnmerocon0x,se
tratacomounnmerohexadecimal.
Valoresbooleanos:true,false.
Laslistasdetiposprimitivossepuedenhacerconcorchetes([]).Ejemplo:["foo",
"bar","baz"].
Losdiccionariossepuedenhacerconllaves({})ydospuntos(:):{"foo":"bar",
"bar": "baz" } . Las citas pueden omitirse en las teclas, a menos que la clave
comienceconunnmero,encuyocasoserequierencomillas.Serequierencomas
entreparesclave/valorparadiccionariosdeunasolalnea.
Terraformtambinadmitelaarchivosdeconfiguracinconformatojson.Aqutenemosel
mismoejemploenformatojson.LosficherosTerraformconesteformatosecrearancon
laextensin.tf.json.
# nano /home/usuario/terraform_example/mysql_create.tf.json
"provider" : {
"mysql" : {
"endpoint" : "localhost:3306" ,
"username" : "root" ,
"password" : "root"
}
},
"resource" : {
"mysql_database" : {
"app" : {
"name" : "terraformbbdd"
}
}
}
}
ProveedoresdeTerraform
LosproveedoresdeTerraformseutilizanparacrear,administrarymanipularrecursosde
lainfraestructura.Losrecursosdelosproveedoressonutilizadosenmquinasfsicas,
mquinasvirtuales,conmutadoresdered,contenedores,etc.
JOSMARACASTILLOCOTN
Lalistacompletadeproveedoreseslasiguiente:
ComenzandoconTerraform
Creandonuestroprimerficherodeconfiguracinenelcualvamosacrearunabasede
datos y un usuario en mysql, en una maquina virtual con sistema operativo debian 8
jessie.
# Crear usuario
resource "mysql_user" "josemaria" {
user = "josemaria"
host = "localhost"
password = "josemaria"
}
JOSMARACASTILLOCOTN
Creando un plan de ejecucin
Ahora procedemosaejecutarel comando terraformapplypara crearnuestrabase de
datosyelusuarioenenelservidormysql.
Ahoraentramosenlaconsolademysqlycomprobamosquesehancreadolabasede
datosyelusuario.
JOSMARACASTILLOCOTN
Actualizando el plan de ejecucin
Modificando el plan de ejecucin, en nuestro caso cambiaremosel estado del fichero
creadoanteriormente,enelquemodificamoselusuarioylaclavedelusuariomysql.
Enlaimagencomprobamosquealejecutarterraformplandetectaelcambioenelestado
delficheroynosinformaqueparallevaracaboelcambiotenemosqueejecutarterraform
apply.
Volvemosabrirlaconsolademysqlyconsultamoslosusuariosdelabasededatosde
mysql. Como comprobamos se ha eliminado el usuario creado en el primer plan de
ejecucinysehageneradoelnuevousuariodefinidoenelficherodeconfiguracinde
terraform.
JOSMARACASTILLOCOTN
Representando el plan de ejecucin grficamente
Representando nuestra infraestructura de terraform, representaremos la infraestructura
creada anteriormente. En nuestro caso generamos una imagen con terraformgraph y
GraphViz.
LoprimeroinstalamoselpaquetegrficoGraphViz:
# apt install GraphViz
Unavezinstaladoelpaqueteejecutamoselsiguientecomandoparagenerarunaimagen
enformatopng.
# terraform graph | dot -Tpng > mysql.png
Nosdirigimosaldirectoriodondesehageneradolaimagenylaabrimosconelvisorde
imgenes.
JOSMARACASTILLOCOTN
Paravisualizarelplandeejecucinejecutaremoselcomandoterraformshow.
AdministracindeopenstackconTerraform
OpenStack es un proyecto de computacin en la nube para proporcionar una
infraestructuracomoservicio.Esteproveedorseutilizaparainteractuarconlosmuchos
recursossoportadosporOpenStack.
Conexin a Openstack
Creamosundirectoriodondegeneraremosunentornovirtual.
Instalamoselpaquetevirtualenvdelrepositorio.
Nossituamosenlacarpetaopenstackyejecutamoslasiguientesentencia.
Ahoranosmovemosaldirectoriomi_proyectoyactivamoselentornovirtual
JOSMARACASTILLOCOTN
Instalamoselclienteopenstackenelentornovirtual.
Exportamoslavariabledeentornodeterraform.
Ahorayaesposibleestablecerunaconexinaopenstackmedianteunficheroterraform
comoelsiguiente:
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
Comenzamoselficheroespecificandolascredencialesdeconexindenuestrousuarioen
openstack.
user_name:Nombredeusuario.
tenant_name:Nombredeproyecto.
domain_name:Nombrededominio.
password:Contraseadeusuario.
auth_url:Direccindeautenticacin.
Otrosparmetrosquesepuedenespecificarenlaconexin:
user_id:Iddelusuario.
tenant_id:Iddelproyecto.
token:Enelcasodenoespecificarningnusuariosegeneraunmediodeacceso
temporal.
domain_id:Iddeldominio.
insecure:Aceptalaconexinaservidoresconcertificadosmenosseguros.
cacert_file:CertificadoCAdelservidor.
JOSMARACASTILLOCOTN
cert:Certificadodelcliente.
key:Claveprivadadelcliente.
Ahoraejecutamoselplanparasubirlaclaveaopenstack.
JOSMARACASTILLOCOTN
Accedemos a openstack para comprobar que nuestra clave publica se encuentra
disponible.
Creando un volumen
Creamosunfichero.tfelcualllamaremosvolumen.tf,enelespecificamoslaconexincon
elservidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casovol,unnombre,descripcin,tamaoengigabytes,tipodevolumenyzona.
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
Otrosparmetrosquesepuedenespecificarenlacreacindelvolumen:
region:Reginenlaquesecreaelvolumen.
consistency_group_id:Iddelgrupoconsistencia.
image_id:Iddelaimagendesdelacualcreamoselvolumen.
metadatos:Metadatosclave/valorparesparaasociarconelvolumen.
snapshot_id:Iddeinstantneadesdelacualcreamoselvolumen.
source_replica:Iddevolumenconelquesereplicar.
JOSMARACASTILLOCOTN
source_vol_id:Iddevolumendesdeelcualcreamoselvolumen.
Ejecutamoselplanparacrearelvolumenenopenstack.
Accedemosaopenstackycomprobamosqueelvolumensehacreadocorrectamente.
Subiendo imgenes
Creamosunfichero.tfelcualllamaremosimagen.tf,enelespecificamoslaconexincon
elservidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casoimagen,unnombre,larutadondeestalaimagen,formatodecontenedor,ytipode
imagen.
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
JOSMARACASTILLOCOTN
resource "openstack_images_image_v2" "imagen" {
name = "Debian 8"
local_file_path = "/home/jose/Descargas/debian-8-openstack-amd64.qcow2"
container_format = "bare"
disk_format = "qcow2"
}
Otrosparmetrosquesepuedenespecificarenlasubidadelaimagen:
container_format:Formatodelcontenedor("ami","ari","aki","bare","ovf").
disk_format:Formatodelaimagen("ami","ari","aki","vhd","vmdk","raw","qcow2",
"vdi","iso").
image_cache_path:Eseldirectoriodondesedescargarnlasimgenes.Elvalor
predeterminadoes"$HOME/.terraform/image_cache"
image_source_url:Urldedescargadelaimagen.
min_disk_gb:EspaciodediscoenGBnecesarioparainiciarlaimagen.Elvalor
predeterminadoes0.
protected:Especificaconvalortrue/falsesilaimagenpuedesereliminada.
tags:Etiquetadelaimagen.
JOSMARACASTILLOCOTN
Ejecutamoselplanparasubirnuestraimagenaopenstack.
Comprobamosenopenstackqueseencuentradisponiblelaimagensubida.
JOSMARACASTILLOCOTN
Asignando ip flotantes al proyecto
Creamosunfichero.tfelcualllamaremosimagen.tf,enelespecificamoslaconexincon
elservidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casoip,especificamoselpool.
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
Otrosparmetrosquesepuedenespecificarasignandoipflotantes:
region:Reginenlaquesecreaelvolumen.
pool:ElnombredesdeelcualobtenerlaIPflotante.
Ejecutamoselplanparareservarunaipflotantealproyecto.
JOSMARACASTILLOCOTN
Accedemos a openstack para comprobar que se ha reservado una ip flotante en el
proyectoadmin.
Ejecutamoselplanparacrearelnuevogrupodeseguridadllamadoterraform.
JOSMARACASTILLOCOTN
Ahoraaccedemosaopenstackycomprobamosquesehageneradoenuevogrupode
seguridad.
JOSMARACASTILLOCOTN
Ejecutamoselplanparaaadirlanuevareglaalgrupodeseguridadterraform.
Comprobamosquesehaaadidolareglasshenelgrupodeseguridaddeterraformen
openstack.
JOSMARACASTILLOCOTN
}
resource "openstack_networking_network_v2" "red" {
name = "teraform"
admin_state_up = "true"
tenant_id = "039182bb2d1c4c4cb806e380c9e2413c"
}
Ejecutamoselplanparacrearlaredterraform.
Ahoradesdeopenstackaccedemosalatopologaderedparacomprobarquesecreado
lanuevared.
JOSMARACASTILLOCOTN
Creando subred
Creamosunfichero.tfelcualllamaremosred.tf,enelespecificamoslaconexinconel
servidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casosubred,especificamosIddelared,elrangodeip,elnombreyelIddelproyecto.
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
Ejecutamoselplanparacrearlasubredenopenstack.
Comprobamosdesdeelapartadoredeseopenstackquesehacreadolasubred.
JOSMARACASTILLOCOTN
Creando un router en la red pblica
Creamosunfichero.tfelcualllamaremosrouter.tf,enelespecificamoslaconexinconel
servidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casorouter_tf,especificamosunnombre,elIddelproyectoyelIddelaredpblica.
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
Ejecutamoselplanparacrearelrouterconectadoalaredpublicadeopenstack.
JOSMARACASTILLOCOTN
Comprobamos en openstack en el apartado topologa de red que el router se ha
generado.
JOSMARACASTILLOCOTN
Ejecutamos el plan para crear la interfaz en el router creado en el punto anterior en
openstack.
Comprobamosenopenstackenelapartadotopologaderedqueelrouterahoratieneuna
segundainterfazconectadaalaredterraform.
JOSMARACASTILLOCOTN
Creando instancia
Creamosunfichero.tfelcualllamaremosinstancia.tf,enelespecificamoslaconexincon
elservidoropenstack,enelresourceleindicamoseliddelplandeejecucin,ennuestro
casoterraform,especificamoselnombre,Iddelaimagen,Iddelsabor,nombreparde
claves,grupodeseguridad,redalaquevaaperteneceryipflotante.
provider "openstack" {
user_name = "admin"
tenant_name = "alt_demo"
domain_name = "Default"
password = "admin"
auth_url = "http://192.168.1.137/identity/v3"
}
metadata {
this = "terraform"
}
network {
name = "teraform"
floating_ip = "172.24.4.4"
}
}
Otrosparmetrosquesepuedenespecificarcreandoinstancias:
region:Reginenlaquesevaacrearlainstanciadelservidor.
image_name:Elnombredelaimagendeseadaparaelservidor.
flavor_name:Elnombredelsabordeseadoparaelservidor.
user_data:Datosdeusuarioquesedebenproporcionaraliniciarlainstancia.
availability_zone:Zonadedisponibilidadenlaquesecreaelservidor.
network:Unamatrizdeunaomsredesparaadjuntaralainstancia.
config_drive:Sideseautilizarlafuncinconfig_driveparaconfigurarlainstancia.
block_device:Configuracindelosdispositivosdebloque.
volume:Asosiaunvolumenexistentealainstancia.
JOSMARACASTILLOCOTN
scheduler_hints:ProporcionaalplanificadordeNovaconsugerenciaselcmose
debeiniciarlainstancia.
stop_before_destroy:Intentadetenerlainstanciaantesdedestruirla,dandoasla
oportunidaddequelosdemoniosSOinvitadossedetengancorrectamente.
Ejecutamoselplandeparacrearlainstanciaenopenstack.
ComprobamosenopenstackenelapartadoInstanciasquelamaquinasehacreado.
JOSMARACASTILLOCOTN
Accedemosalamaquinaparacomprobarquesehacreado.
JOSMARACASTILLOCOTN
Comprobamos en openstack en el apartado Volmenes que se ha a asociado a la
maquinaterraform.
Accedemosalamquinaycomprobamossitenemoselvolumennuevo.
JOSMARACASTILLOCOTN
Bibliografa
https://www.terraform.io/intro/index.html
https://www.terraform.io/docs/providers/openstack/index.html
https://docs.openstack.org/developer/devstack/
https://www.paradigmadigital.com/dev/terraformlanavajasuizadominartodoslosiaas/
http://superuser.openstack.org/articles/howtouseterraformtodeployopenstack
workloads/
https://www.youtube.com/watch?v=TFLQcgZr0no
https://www.hashicorp.com/blog/Terraformannouncement/
https://docs.joyent.com/publiccloud/apiaccess/hashicorp
https://es.slideshare.net/AmazonWebServices/usinghashicorpsterraformtobuildyour
infrastructureonawspopuplofttelaviv
https://platform9.com/blog/howtouseterraformwithopenstack/
https://www.mattj.co.uk/2015/03/27/openstackinfrastructureautomationwithterraform
part2/
JOSMARACASTILLOCOTN