From 9493803d36df789c508df9d199f502cc6945282e Mon Sep 17 00:00:00 2001 From: mkorobeinikov <92354771+mkorobeinikov@users.noreply.github.com> Date: Wed, 28 Feb 2024 09:53:23 +0300 Subject: [PATCH] Update the article Terraform Update to the article about terraform. I made changes to the structure and divided the article into three parts AWS AZ vSPhere. Made changes to the table of contents of the article. Added links to resources in git. Added troubleshooting as well as a detailed description of the files. --- docs/_static/images/keypairs.png | Bin 0 -> 49718 bytes docs/_static/images/sg.png | Bin 0 -> 31817 bytes docs/_static/images/traffic.png | Bin 0 -> 36786 bytes docs/automation/index.rst | 4 +- docs/automation/terraform/index.rst | 18 + docs/automation/terraform/terraformAWS.rst | 579 +++++++++++ docs/automation/vyos-terraform.rst | 1036 -------------------- 7 files changed, 599 insertions(+), 1038 deletions(-) create mode 100644 docs/_static/images/keypairs.png create mode 100644 docs/_static/images/sg.png create mode 100644 docs/_static/images/traffic.png create mode 100644 docs/automation/terraform/index.rst create mode 100644 docs/automation/terraform/terraformAWS.rst delete mode 100644 docs/automation/vyos-terraform.rst diff --git a/docs/_static/images/keypairs.png b/docs/_static/images/keypairs.png new file mode 100644 index 0000000000000000000000000000000000000000..7e772ae97d351c87be2a0f4c46d44c6f59d9d8ae GIT binary patch literal 49718 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 m$mu2dr{BvPAy7+aUn4IReBlH#k}&9xm*otFTQ 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/sg.png b/docs/_static/images/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..8be51e1f2d3da95d3db72f3753ff53ac908ac2ec GIT binary patch literal 31817 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
XqPF8&0cdv@UXIK-&!F0;qs;SAF^EIDt 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 ZXp258ey3HAI^y;z%BejmkuiPqzW~%3hj9P^ literal 0 HcmV?d00001 diff --git a/docs/_static/images/traffic.png b/docs/_static/images/traffic.png new file mode 100644 index 0000000000000000000000000000000000000000..74002b1679ef0446264d26460e8a2fa33bf99944 GIT binary patch literal 36786 zcmeFZd03Kp-#1*h*J#(6%UqLMnM+qqR;FgTlp8ipHDzk$E-IOsx#2Fj05xhhnc8G7 zrQ(#S<%T;V3X`U!sFbF-prnX|2neXi{xVB*-Ouya`_FwG?|VEChvEt6$;t2c-IveT zpRc%G(D-`q*W0#j)42HK57)MBQ`@m^+jh{idL^3O1a zduLEeE~;Lz(ulp$FS+#UndQZa%Zr{PKNk!=%q!lL__*Zr54i`<9^C&nGsALg*Tdac zcYpJ*!TbC7W@+#G>dbEEf1J5`W!J7yVur(!R~JtmN`MRf=jyON5EN%l^4zv`uEKo+ z{e&|w>&B9U@IiHeO}Uy;=D~}P|NMD5|L)F}zm5-HTzS58$9I39G93E<;wd-9_JyvB zfjwc!!i{lXVB#~w)m%_u5Eg`MK0JT;RPH^jZODS{QBr^FqA5PL^^;YNO9->$$1nR$ z@3S#>i2vlgs_%J0orI#0n7-tE8&Y?+& z=Wo5g;S4=`!uZJ-%2ncn_i8uh16$AZ{-(d^jgV>Xpgzn-je_R=EW??1?~Nxmhr#^~ zHNC~s`YGSUuHex-Yo0fq4}YQVd4y`FMvW_aQ<9xCwya4qCf#Yu{$K9jxN`>pvf*l( zuw1X1b}Zq2DOj%hB`#Bi_KSTtTSx9+(i=X=Cbqtlwm z?HpX11)^+waC;?2f?>i}>bnTF8I0~Pv|Fja>S#`7KV?+@j!^9ke(r!6ouD0N#1w+RE2+*O7FT9Eb}e{%8>n+ zD)Mq_%!D+^(x<0%5)bbS2G%U;65 zQ_KX-#L*vHG0uAC)G>mVc*Jq=qYv84DIDSaLz6I*{BxUuMM;df!L|~-c~AGkUhNL3 z(?N1D8wKA>_RJ#!itRCo_zeVAi__8F91p%MX1Mzx8og6N3M<3;8S!c0(VmJhxV^lQ z33qdWo1iXoSfQu^+>46BFXS_@j!?@)NmpihgOn8AO{IX|)5n$D*Z1E!4mcKhYGejz znhlw3V6Bj_3Oh^;zvii~yCKxt5GgK{$0(jwJhi^UuP49X4K130D@k;0sN)&)pA_Tjw6F zIrFyy-aEXEUM(O~c2V)KHo0#UhD#M%bOs9-wmjhT?A|R5Bi=;l-YDlvwrlRt>e($o zF+btlkgdfEMqNLHw-RE>R6hq8pQ1O%Lf(*Ez6fF7-a?gLm`jaS)YDC7Cv@x&O^Elv z8z`kx9l8LdWp1q*y^`b`Y3wx_8x5;CkrP7 z(9$tj>#q{C8uGR(&;}X)_JLX z|HUfY8~d!UZJ2r#S79`tzEBNq>7NXYsV|#o@|yTfEi>cv+;4k7-#N}6=M@6=&{K5A zT`2S#e767)vb?-JK0z&V?*|0njVC$bPJuI~`IB0|Iyo_$djn6|AQ}CTXmf`-T-dGt zehgua=EF!Xcv@Gd(%Xjbb^ybyFnQ;&c5L9j0zRo#H)GOgnE|nvyzWew=k!yjp`ZGF zp|bv@4EDkvZSPCjO9`}v!ctn{YMLl$T6%*m2Pjp`M|X)+iI*nl++F*ybRq$WlnZ`> zeuqexO8@}N?+n4b0JEg^&+l=z9$z?Yh%!~_9X&e#^(*kyBV_f6`B9f7zCmWq^qsYP zg}DUVCq~r=bu=*hmVgK?q_3Jk1 z{pq>w3$DDI2DP^cnCP^GCrnttpnWNqpts8r^H&mrp{QL*8W4sJ}#7b2y zQ>Fo#r?#Fl=Q7rl&{YL@UHb04W~LqzCPaUN#J$hKwFO^;?Eb(fe_g&YXJzAhZdy+KCf&aE`Wg#rU$~Neg58`Uh9EM$*`#IZAaQ9umjQQM*UCSEJ60E=f60 zeQwO@b9D`=Eg`6W*KzLw!lBSP{`afqcI974UvsfC(%ILx>4-e9w|eJ}>~QBP@NG}P zF}up^kmu(ns1+mmjL(MJn#(rAnLAAjPJ6G9ka^Ayr)7&2aA1Or?sH>owPrE5G8ZtO z;x6lU_#_!?fn^cUE9@G1ox|=j@#SH}a^cpT02bHzDe;R(EjQnzy?nyBzPx7p^X&`H zYMDj~Ru0X`e5Eah(5p*jc5>;2MdU@$&+fMvK(dK>9@hfazQzzoHmUT^5htIhWde*S z^e;ZuYG!YsO7BSPVgg3MynXzJvoBP9S8K;C`~14|vGOPOoRxlqG7wFc;xR5e-KCbP zfyPuyn#ih|8^RBOVWZ{kGaqb2{%|7c3*!^S!@}32xQe#t%i9;`w?-^%39dOoKeN+7 zIU;}pwZ$@Oa1*0CnNKqYdE5a`80h}%lir2O1qB(|R@H!{{@sCMQDrlXU9`1q#v~n_ zYjFaD08I;(e^dO$2Ww-BQnX3s?ibE(Q|VO(JGi|9i`w!qnr?!AjKY)MNg_SS#nAlQ zd5wzc&9L*rJF&;n80CUBgdf&NJB}G#mUNguxCnX`SaH(aUmLZntTAvzX(d7;?6zFQ zcs%xm95C)p03q;FZaz%-bZf2|W~nGzrHU?5&p`h@X*R5yO%2pR$SS?!ypyF0Y(0t- z|0Oux8?97`1+~(UWkw`Jz|%)QIFMCC40S%Gw8^;sI9HB?es-&*$nAAG=mHi2vtCvt zu%)9VGg9BY&F#UmX!)h#m}Zw@{~lZ8dThSkzI|Fpr#WjlroS)kYq#<0NtIsf zIAI-um~D`98u!$|Mlr%C>2PkWf7)D4tfO(tO)g~{z?Yw%GI3nR>eF6-JI(w;y}env zEy~q3$K3+gwYsTZRn6=>VVoW+_lc+h2xfV)puTWT2i<~NLWK?jLS7cr^dqMNSA`X) zW)h!u?e{_eGs}P49!z_`o`7!ThFy0|Rn0sngy591#3YDQBkrN>_Y&?~U9-QG(5|oT zeedqMY#q%V6|=rhs~3PFY4oOELBU^3317EfQO)GyyN%69%gF?br#kvtyUNVNsmu4~ zG&SR#x8%=C<7*@pmI(=O!c{4UcWWa>ueY*Udj0AR9D)h>0iIY6;u){ruJ5r1bjz+$ zx~luluWKD7TPQlypF@c)U4f4dG01#5XLg@D3V+He$dSE6W5+l*w0l2VePqebEw!y* zxM~19iR_k{CXwTQP)fE6CEq>u*rraoImT7#+;l)9;!L>x9&LDcaB*w<7`JhF?n1?u z_b{S4WB-M_^Sff8?IW3|v=2|p&GrH3`Dk|Uv8YcwYKWAvx3b-r+yzxjVjV3+UVZm#c?*D7 z*ts7A)(1IiqoUjlSr_!IK=}G!_Glm4aMUeW0h9cAg9zlmY>)W{bZL#VpnWeX(tmd1(X@>^gg;zyE+3eWhx_(BQkT!u9L;q zl*YLn8ox_&7#1{q2@WC?)YCNI;#4jcvW`otOA;@NOD3sQrfx2iHDEo>O%d-qEDP9d zbvG~Z7Iv>d)F*$sm*l*)tj?<%V@?vddDe!TAYN(4bnq7oncJ(R_&(or8Bdkz($c;C z!B;CfPk~DSrs$l$#r^ICm0qp9fq~gs5IC&wS^9=>dR<~bPu z*;jF-r5XH%Wap9qlC|vwd$Qfj2>+?tS9}G0YW9X++l9xHn$OY)V4oV{)dsNy3ofpa zt@G;i+NlQ7Ilu4fjXkflqL9R`2ig!+B0=}L^PX~{0>(9s>rA!#;&#u2DifVclC6TE z>optL@9Up{ry;DxsN$!;+Z|JaPK6Ic89%8s$DN^h$I_idSxU!HoCB{8tbsfG%7Z#p zctb6IW*yzq!~lo(4f7vM?bdHNq_gN*z>z|UXPE@mx;W_g6<~Ji`A8he)_e!Kqz6+_&C7VNIVly`1t1&EG*sQ$1 zLzFkTxgxEs1^oxNk&x+(y8-576%aYCabW5%Z3HhIXA+?^_tFNk#uU7CaIF& z?b~sfbFo6NiuK5mEKUO-1Yj*-=1-C@JmZX6&9=w#TPyjZN6Aa&P|5YN=5PB6Uy=u_ zAv?4GWV;t1-!u77jD7I+f6ucYryl-4;*?#xO0R4-M0U@*Ih=&;C*&{Yv8O$|II}`M zBfv2On4`^i#m(|USwEq!b3XtzpX&&GEP?fHLa}Sm+>yrwSydJ9Q}=002EZtH1FI!W zfC^J3h3g{pkuiEM>VUNE2AY!*n1{&YcZ)O!xb^*e`DtshRO`vfF1 zb$C5hDCKuPm~CBGt718YCGdECW5E0Y;bUUwZO*+#niu6!g%66bXmm&@se<%Z_tLUw zAS&B=DL`ev(o)^?AumY};&?B{@RL#zB zFodS~JZ>N?n$js<2X;LAb0g<#_iODi&1gBJ5wdf~tnGl$Wqd20Y#BDshc?wrv_ztR{J zEZ*9a7ZS)nRCjX?^B|fPaO`A5vI9o0hQ-&7RNGYNN875Z>)&t_V>kOQgt%YGMrac> zx%rTLo%Fyu>fK z{a3+l@3hiI9BViQc%}i!Gs<&BJ%OARe@_GdD99+IaR+7_+5X~P)3 z`Z9~a@$xi?b7!@{dVE~xZYiipFFXH&}yX2ouFg`mblBQQQ2 z4Ln_nyg87e7@?Bv9$rG7O~nn$ur;5_|0pnuog)h z(=L>hbwoWRZ8PAo&~x~(gG1eC$U%%j6~iSS?^8iAi`cNgV(Wa7JL{c))<0DWoMw5* z<--#za8m>LblJ={6JhuC`p`Tj;kg%+0bTo})Jx8u${16Y7 zH*=PR>vJ;+!uE9s`+bkwQ;*ec2xg`|X@j4tIdiRv>AeV_oFnA~E}n|CGn}SL!OgQFQLQ zgw_m_8sk#^y8hiX>7`zQlBL_c!>km|-Wao8afgT=(wj~2Es-RCXXy8`aPzM9m69$i zeA>I!7RlV#x3`gb8GX&+^GS5Baou_@YjGf)*(jRP+Tmh)2Gwmb$%VG1&bbIZI>y?= z?@XMUifF&l^%=J{pwSFN#u$icE56ljcjLk0A-jgh*5jTtS0rJ%P?#fRN zHGsV+FQb}K4jEk>MrBU=GLvsH;)r8YI38|A@FE_77xc5G>TVg88SAJ z#7O#J3(hH&Bmk)BLmVt_!3wkA{etl7CgoXIZ1{LeZbdApo)Qa6x0q|cC0|>DwD4hR zNv2!+q?nnB4dI3OX(9eexjB2Sx)aYl!F{l&itw`k{pT#ngNl=dROYH28$;Xl4M;&2 z<;@zoQ$NIls;Y#9W&V)FRiG@}{wN|pqosww_}wwx$b^oY1V)6y{t59|eayz{a-zIheqU zr6+zx+UV_jEQaMySIFk)zj0^av4SeeVjVNQ#?fC0dqfvjFP-LnFXoQI-KokgLWUoF1uK@=%I|{pNDPaZ_q#UVVINqM-__|wdq!YiH=H=+x z$4zPsPJ^51^dKhygs&q~wca5U47wRU_#7+p7Slyp3=GP!!{F8UcGFbWMLco)pONb| zNtdm0w^FRE7$2rQMgNcii6Q61KgIggqw0?ly%%#UPMCOmcYF;MZup*N&5SLOot|kZ z@{|_3iaMPh=--goONhC6tB{|WJNTE9VF$gyj4h_nM0lYi^zEB+o_|MDzq+uP%i_w!BL1Wg zL5r}dgYKs@NfeQ1$F;6LNqgIO!vfxQrc)H9>!5u;@v)%%xFZKB_GH3mk(%!|E%Nop zb($1K(#y&7gw2@yl1q$}rw!B1dNeP(nr4@pM!U9z1dGy^{K03Ym;%~NXPh4$2e%CZ z1_Zrv2np<)G@Llfpq?^5MqQTpgaJDZs7AATMF{*Mvr(|i24taYYx)7Z*#tYE7BuY_ z^m?8N^GpHDW}|s)%jMHW4H6m?OUxH+9f9;OF0JvoOQX=vM3@PoZ+eK~t}&P>&@yNJI8ReWh6P6ZhhM9pT{AJ>&ti!3~QF#R4?CudKw=A2WZ$xg`3Vws>z* zs#SE42S#D;V%Tc0HxRrEacRiGn)?0vHZj(Ojf6C7B zH&?~2CnpbPZ$R)~E^Y}f@y|@T4{A(Nrd16E$pc8~adS{S3_1VENv)NdzqDRRkko== zNNzrB0TvGRt>hB459NxTt2_xUb$q}S(bcjGXFcR@gL!aw0p5O^71TxF8cHc}sfn~U zUgb8guC}-Sx(Yc8a|0z2%Y3`-=EjbtME{t_`nl@7WMB)k@Ui`bl z#3DLij?9~vyMdM>sA%GgYRL0)!C|av{8*@li)Z zrLi*d#`&)A(Q#{Jp0e`D>O5&E2lKg6-zCTs3uosPcaEc5TCa6HZek|e&KngL{*2KX zuQG$z0{cIvrulU(I$-CgMV>yFHi60Z7LijYYOc}YZs-@U>^XDLuC|u8c!b8M=9rY3 znT3fn@spAH)zq+w^jRvk=Xj$ln7cJ3`?!)a;rm7gY#g6$b~G$2kz$$f>0Jq9lDY}! z=bxp(K!zjUT+6amP%Aa}%w}jLr5m+(vCSGU&;&j7J54-k9_r_cs%#&)utjHWMCiwo zIDp3K-b0O$q(?LEbb=+qFBkQVibFTw{=~0^f`*ucx>-ND8+sFEU&y#Dw~R``dl4I5 zLT}qm9nFVqq+ChVSJz~%Ti;TQl{_m`_;68CJTE6y-SWIwYLFMVxRSn|0tH z@F6vH)(<${{7?d_{3|bWbodV2DRTMCdyMl4l!<{NNN;k{>Eg<|D9}(oubpqbbD9X0 z*;K@|SCgA3$yFR{M{G~~c1VIuVNQ>b2ClBlR~Z{GE9rMA3xCJkbHK?XcB#CxX0_r)7;x+%>yfrcW)p1h1>jbnJ|@b?fVi-v6?h z;|xeDuZP~Cdf6vzK07>$uU)-|9#Yvi=wm8eM~~v|H`M%bTZ~tl&kBzr|o) z;6DA%t9vZppkR13#iuh8znyZS0i2e@viz(pjd6oE10oEU+HoX7yR>|TYl*NGItHm} z5yWGnC5y=WD!pXgqU5uF`TBY5yK=wE)>yZ$KJo6DOtTuVMenNNFe8%Zo1BjQIwA?9k~$ZzpxjoZKK{t$CIy>u3SN#PsfFZLChz(j zJK)>=k&7sZK;#{n>iBuR>tKzknMZ&Dc^-3oQZL=)hJ;!LhwIt*03<1n%-g4b{lxe) z`FNSGtVH-CW|B>ph6rBfrr1@u4<7xlG->PrI@z!r(;AA<_>qtxiCc3WjsH&(S2hIl zuDg37I~yV{tE=l{_;J>%$>n{68}D%0QPM(kKOMu3AcBfFNu`&vY3&mjF0y;It230j zIf?zv0U4lRPD995c$LBmmpUh{2jGx5!E6qGwR0%ioT@e*JzcU7;ur5kXbmPm0TmnO zk8P`Jp+hd;s39Crnlr~D!`DwsJ zdy{$4OrNuyQD;5JRp~U(h71f*guC)8Vu8oze_=mv`@CLgC;DA&qJ-TSkAku_i&Xxi zzD@4f_TW(BT|W2_Foymf>Nky-1P)RclA>Be1IHhTfAVkqarnRKhX{B06v?}a8iKZy zz|jaSphK^`I^Mp;8(udyvkKb-);;L%HN9?{!`SL-COX)kqi#N;2n0`uRR*IXhNOYHas3myYQ6kfsosEDRRb@k z&dK6|J9UA3qed78K$)lnY5tXBf4#R{rMJ(00ukd8-!&#YXw9iMlQ`ARY_q_wu42_A zYoY_5PBW8+-HPG1)CKYQ1~%UIHT?l0>bv0aOSC^t6OkLTTEkW!FO-c?>7M2i&0d$7 zoI(wB>qp*_+{Gw=UGiup*}fBCSc;SfgjR{2y?bpqh8@>ff>#vA$;po$%ZE3j;hxkX_O&oTv?QWojuiHR50CWW+oik2JJC!tI=YUk{4&5o&RI+_&V1lr zdlPJcA9xuGKrmo&Ab#0JwXCYX);H4+CET34qgXw&a$GBQya;dqhlV&5sdNQuw0Be7 z!0utBTzQbYoubD);uVQIqus?!+b^kOZu~kGw-a6xGnm}&7nnj8C8dYCrktZ}9Z6VhUY8K(XAD`z z^Ew4BbJ-fo_N++rwJG<0Ayb%aK+&J|p&HrV!kX007Z+}y)Z*q8>f7`q*RjpNhv$W= z#|lD5A24X`>$t;nMkGRrdT~*Qc6u0*4~=q31{CI{9liAuFdm`a`*MX{77KLfwsWMe zr}ZNr^s|zS@~EwC-K7I{95?d=GH_LfeTb}ku&U3z0)0f1H*mKh(+qXH#|A9j@St$^bK>fZC4v4)BZ|HTe!0(qs`LZB%WKZ z@*%tg9m{oPh91h7iFJq}9(K1suRBGwzvyBqGYU*mzyO^YOzkuWmz^|Orlgz=hosZS z2`@g!k-S9n9gz%kGeFQ_LVF^vL1|R&KjBgt{8dP3SXAnIM`tbb4^ae2+d(yb50{by z5TH#-FYoxne#TAP}A-N*ZQHp{YzI zMZOtE_E|`~r1n%LdHKR$CxRlW(>?nQaR<^G8l1F_o_%5T7B)ZeA(4hL+hQS-<@ju@hb6*zmq&{S~e}EG@>R#PCuIU@=+Q%rR-+^A-k$; zX@MW#BdHf91;U|qOA&erb|l3N)m_6*33WXNPjqFGH>=4RnxJuz%P4wX?t?3X%%?gT z9y3e(*kOE39=Nh5H~dXDy}9u+gMMcv)($fFXBSE7XRkX$11b3U@Zpjt4VkVkc!@GV zp(nrYD_xX_i?~`Yzso!>cjIhHh{YUezWmmP6}kUmRq0}LqEF~VVT?*=o>8|xs^Qhn zT|=;>8CWy?TuR-*8I2tUg7o0vl&|9G4g~kE1G+I6IoV5!NFjY;$_mAI{K@w1;)+nc z@pU6~*j6qE5h4e9%qA3Hc5#Ash@xvM^fbqJIx5v5GJ#t9B-tyeZlrH8sS#%3fk~|5 zKZ9bs{{4GhYYa%F6-6C>W`k?%zs(XHZVyY5C448t+~eM_m4Mrb%eyMvCy^5y`RtE$ zrXbuHO^b~J`6CSJ#GXbtIVVY{3{kh;=fl_ZUTW6tB6H}{CpS)|w`nafAYX|AtL|wH z374)8@FBNcyV!DH#pLK_ep*!}iI5>;$ZcC1vVe1lL7Ioe;1X7u&j{~6behA|TGZWwc-BEA)$t)XZE-?0f!y*guiK+^s4pHq8zOZcB6A^NE|}aTW$Q>1m~X z=n}k2oG7zys3^@a(B}9~ts9n@hfx&YbJ|-cxYtaC!aE!iJjh+_r};|b8;!p}l1gZa zT4vwOhjov&Y??2&u)1peiMtOpeTLU3tGM;60Ro+lypTY(u=;ou9ooe3>#=zJEcw7D zcwgN<+g~NmHxsh*&u-wNN!glx41ixpZNDl+5Pa!#H zJ7rS7G7x#WN)zEu#M@^`9l;yE$+YARNSdmc@}v7~E;;A91HQEu6?U;t-hKO3vR^ck zd=BrTf>HVn2r`RY#h)pfgu+zCc1Qj&{4bFaiOTJ7+_Iqf%&iD=A10>(K8(U`=fd%;kIjs!Kn%N>^eH_fCs#`WH{zzV-SRWd`F; z`hhC|1>p}B`QNe+`sb-(`+@3 z><@imtG=?;EoLB1yHEV*^Ibr@x|9Dw-#$(~ z_Hf6%i{)~hK0`U(a&)^sjGhuokoq3w>!1Nj-1YWb&d{M4^!Ddp_&4@Ri3Yf=npq=F*8dwzd{Dz&rT5Lv|96)* z8X9SXb1-^}gn&mjuygw^YR;mU8I~fDlTnxte7TH7uw{UAv}yqbACDgf;=;}iKU>S^ zy&eiiY~))mG`dy^>H@tR4$Kz!vqj@3uoW);TeJckCLpZ>zwt07^A`0(L^vr=5+eFI z6sOqdQOrddqGLq4(+i5dcnWe~a$=Y?c>uDgjwr+qyF3=m769<|OKn=R&yg6G@ab-V zh|wI!i=L=p-*)b#E8A%{vcbx#zDq)`4rcbm)GYbUowavGS(ercU*u_XCz*xqz}Z%C^rL|n#$=+ke@y@9H{G#^7}?>q{k8`vK3Y6Pu*$4 za5Q!Rel!;f3Tbk=8jlzzeEUnKgjPtM^TsMjMAb^8`rOxreWOxBN%!%TedKzxjoGY( z8!MR=WUVXqpYa?Etu1++=y@*C*!RRBmtK&N(Y8YRy|`GN4u!LNZFT8tset?R3$3(!A$OAf z`idTMkLCQckoLG%IQT)w5|aw;^DYRFj)9y>s!{k~mW@1s!bu-a#ao%qU5lSm%82AN zKza<#n;eQ846VZYjDX}}+Y z@9KSYKf)W+u?6FdWW4ybDd%A}at@>@FHorucZRO!b_(yB#mzpjt&Abn@ml>NX$gQ- zJ0}QhV2j=;EErGU4FiH68qMKq9gNFx`@t^m3ass7tXN=@Kd?+MU1TvyFGnc5wAc%>#tuHBYWx@p3KtCHe1n}50 z$V61Pdf}zr%<+~#GC&LmC!&4$R zx#?A0<8)iNy{SYf^zLVXeZB1R^IiRQ05e6JdZiYiFAI7dsG4b(uWYT)DiOg%yB3%q z1x{y_s%C{LJmPz(b>)o({+c^Xq92+7PWd@Skp(==Sa9hgzNNyH(*KzVTvQYrZq8}& zmVRDuDrjc$RuikX-$?!&cl1*8q;XUVMO!sfA8dLG?r|AqI4Ol?=MvllH_nLGzS*a( z%iU{DW*#@LpY@7-6a5(lNgm*1s6VU6V+{=OvF^NZ;Kx*FUwu_w18*zidP5uG1QcLj zzb5@+svp}8-)W-9DPvu@w!6ELk3F3K;M6r`Eoy2*w5N0h$KYfvIRHSSr_x{R!FM*Z zO4=JXPxd()OK%H%cY_?$1EPQQd#y}97dm003eoqMsqbU;?N;A$aUS-HrRJk{u64?` ze_6$BZIifFpEh`A^}oEn&~797ciOQMowuHD%{;ttL)2;?LPbXNW}kwH?CSV{%ODT^ zD+Ye@3`(40cYz-Gfo&cq-)BSzGRyH;h<~9oe+a!bZjnG?npTEH0_9 zM`<&v%>(pNtM+>@zWptjKDvS6!!gZ#4T5*p z^Go$Z(!uJ#jd^E5qHCkS@+E(mf|Bw5HKq4rX^Z1Nqd(_zcS(nlp-I5q)#WlLKQ zYQ9!H6>{pBa+zAmPXF>?b?7>nIwkd&K~p6yB>|36ol0j~)X}QM;gxJ|n)2BCLkvHrkrBlp z+kN?O_}Sx+!H&m`_hFn4vwKf4GZtwqai3b;P3q`W=dI`{3I>qZ?GyVfeUK?+Q+Bx* zCug1Re;&O*yK~3(KMsG*-mU##e;he$SsMT2kE1(=H=LCNpT9pG-+uXU z>izBe|9o# zTnXko`=}jmhErGJDna-InqJhq?r$5%f^(yD0}0)(`5Fy|wB?;I?t<&&mQ(Lv1s>Y# zolW~Crie-=b%sPH?^f{wBExTI>+IY)%$utVS#Yl&Adlloxb)D=qQRe_H@)De_iQ_l zP9{!P3fNH>hUK$SDO)+}H++&mH#M2JW_{Zne<``5;-s~A-cJB55_he}!GnC$*5w|7-+*I4v zS0yG~KNALea!e0aQXV_C-aj!+#q>xtr=-o zB4^3B2$*Q#RLM+v`@Z}kgR|EtOwTdmhrHh}RNkVaQVzX^p5 zD{dsq%mb}DlX4m+T|4}Xr_XLS{>UxHG{?Hg;{e~7B91qvD=BecGWVxJ-Vp=sykGD? zUq7~orktYig@$jwfQ)XHoI<2*h9f6<@1%Py>2(RTs?{fzuFUc2+={pJC+gCH=ULYi z>i00WFI0KBsQ;^#dl6Y$47ah59@E1%_ZI!);rIG!k|1-XW@Qwce4f4bvM}ZrAim2U ze%#wpky<~Ka!_7k@bRg_fMk(sC%-W^wB`G{z4<+1`ns=|Vz+empK%HF4F-fGEB3rrBUJ9o{8f7Jz75A?}qOeifDjgIp7H5_3K5}_~)DZW`3Dl z9@0;tJJbOtIb!dFHPb!TSngv9-B}Q-DVCq^ut%Df$ArbaDkPp3)vVqbV;`yTA&{Tr zw+C<7(K%=vv4OTteLV#W{XU64C=znsY0}$@(}E@}td@}(xhe~Qi9A!s8WtR&4oBqd zToc(HoV6|1+XBxTs zK4-@TGp!>M914`8fa{cH(*ZwOq}=ogKc_IQ;pw%0EDBrk`MNy7+S)!nV3<;5P{I^i zf&(}Xesai0qJcwxggA|}jJ!~l{C0jo5Yg$>&Z6EpZ6y?*4Tbc$5?|<)%Ns23^(6Xi z9uc3cfk=;t<;b%J7F3}``mSvYi266aZmyC0V)`$}+w3HYi{5&%og60K@SW$tbC7jw z3y*_thPB;*NehydS@t^GEovKUw|`^lv2<#~p3nU2cp|88p$|6(Q7LNl5DU+Z!zfLZ z_Z&M}cqFCFaT$a#K8=!+yud)Y6Y8@trew+g3A|$yimW#$>N-Fk3+$gr^cy~NtM_Z{ zkh%UNWOPbdPV+VJxD?~h%$fgbYJx-s6KqFnVPeeKX_~$hJK^7xvX?2vr^2X(nz8Yw zNWMkOIhDIB!5$&g9E~`^xoM*z=GS%AG^nRO#J+~4=j#4quu8u)Ym|a&SuY=h`+jJbsm)zdA{5(yQ z(ZzwVk4XE15WkitU%wLjn4$IRz{9oxEj3}f!Q(fL@Aj_$bm;x-BE-(dieGx1(rs?l z^p&qfPF$x7wFoVdrTG?KFgz=#5YYLnXe+^la6ltQU;?o?Iu)88TJm&X#WD53v9@|E zbMx-VNN~?cSt>J0|3UJVX<^9I=6$d7i&oICI1?A!QXyW4At zlV1VH*@20E$rO>LJ^E6kf__(*3lj-DLomXoh(fJ!jr4NgFxGCdpY3#fAYogvn!TTV zZ%e@-|6QmnS6D>|_5jo4Hf-8KwkfxnnUn?55Glu-RB%_Wagrzh&hjLl(A<{r82|H8 z)^7C3NOaFLz{u88O!th;r^hK5@ojQ1^@roj582y;`D*h+M=-X-38Oi6@b1Ijy0D>E z@e6>tIi{}LbSxAS8lyY0aG9?f@56SDrs$av+Qu3&N&{MD)~zZaFgs7#D{eiK$IT>) z4J;Kz8cn)Vx*kT8jungYN%B{Xu)(!y+n86duWRg1)q{2qrZMM-*rKR(S>AWeeBQY@ z0VERL_ZU@C6 zgdIQXWP<s3Fol6v%?ST=wd(M&C zhj}`M4HkS7m!jwI9uVaJW4&1b+{XOrwRzWYxzI*ocYKP$dSun`&Tdz}W2ZG3v9vLj zu+-qYMcm+t^ef!_jnDv4(5j5~#<6+rZaYu$M0a;ZUgX#~VC#m10G_&Pbc57t@zxq$ z1t>_IJsBq~0>d)32RghFJ8_Bbp;<7S#5$a}#wJV=TYp)8AGelJC{&gYpXLk^&Gkmz zL1}!V=irHV`TFw=h0-&g-KkbYcDh@Bj93T~-g^5a#?4G&S!VAfd*so@`q&lvG}|=N zFrK*WD=tQMbSnf(y0_lGlI7d3@O5atkq{7+8l7fm4r()*cfotmw%$OOAf&gVstTY^ z@vyr)-rA7ZIA$c|KEQH=N_!49=0-jy4`#Sl1Q-VTYwXAeIGwidZi%lI5IV)(my2d2 zOoN70dN)ax|HVdP2jjkNr34Fi_h7dr{;(v~Zz8|X4!pwdI&n-RI8K?E;M4TOI1r(d1;3;RAmS*Y5 zoy$ryEru_z@M$o?+nEzCNvIUyt^P3Fvw4X6C2TAR1NCNiE#oe|NQLc{A6mVy44#I6 z51xKlsEHWUqcVB#I5R+(je>fBZ+TkZ^j_Oyw+fA^c;LawdqF7~BAS)#AMf&}O2J3r z{F^C4o2-~xww^<6#bvviWXil+%UqUqRIaDTY;O~|>C|s5AQ1Z6=!Z#fn<8}T-c^|g zdSkw{-Mt1qA05Ss#}#z%5tjeh$QV53H}eGXiu~N>VR_3@;m)Zi(J3EpeMP#in%NKN z3vc+0@s2x@(lZ1%sUv)s?Mie5O@H4B4d&dem&DQA8(WBtZvdd|m*MBU=><1TX%;x; zpf29_pgN3PtdKQxo%ESr_MJDPMbxCKienNkRQ}wHjzB=XTADg*yGUXe?|nzg?cZZo zSQj|?sbsAVDR+hye71@^3yqE}E0x*90v&{DbcG_P z0-Wzyxuq_N%nw(7C&FRBlgFM8&*Vz$JHJb_l>g8dBZ&QTctO4Bk>&fZ22)Q&*C(`Q3-L-B8S@j znmKpW@^_&`h1^ak&6$U&wK_~u`Q%3vlLekmnSt?9DVK*EJvO?Q!5(Y% zN9yrG{zWfv;8iR>Is%*75SYxP&Fx2g`=;dNrdsBACbaiO-&qP)mR&y*5f8~hQ6y}K z^y1Tak2;I3D%+nZH3;zh6L~>;EP*;EbRbX+Kj&4fBe77nT z1`I+~7ar(~Q!FKizvqvi#Sp_&3-&E0y)sOO2P7rXQyyDYwXp90L^$Np9bYHA)3kYh z{>|5xZdyt!TekA`=Fp|;CE=^}u7uHt%U|*DWnpH(W&_1&=Y73`q#yko-}&nc#4Y)E zWx+n1J*O~pF1y&ZFT}Fb?u2gikW04mUqnpvO&0N`WuyOfVCRo)M=Yil|4jOgzu!Nv zD*NzEDGWc6272+SEi{*#g9*Gm*>LRDZ5|GJ8@HNFR5Q3OAgpEK&G0i-z-0#;6Z@!h zbPL&wIcB#}{#>BboT#uu)`#3Wv)Qw69GyR}hn|u7zgL=?p`jaLg#0*`u>C<1sq){^ zNUTmfH+p(6)-dLzawy#CD^j~Rx|z8)L+X$LE6Mw24NMs(!ZRBlTl88Z&)vVV-aabg znu;YrR4OdKkN2_^HBvO^?|{f2{ym7Ch{v3oAa6N+T;TsU`c=Cbd))E)T=PLB5k`hY zyL+7UmpW3xPtjYBtrIQ2<97FcApSq?y=PRDX}dNI!w8N_84D;7z{-r2fFK~E?`1>pOoSr-2LQqS)uy$Tqr5I%l!7i9NDjr7pR?ZkI&VEvMFST z1@G{T-y=nPLbxd6LMwQH(fxo+VA;wNH)Tgb_gI|)Yof%r7+kAhp#r5Qe*fh;P24xy zXqT!1OFGgI;+u?4Pn9KU(7j*%)rS;_e}DfHw+4lakZ?pin7dOlF%}X|^VnNb7D6=z zCd^h-6F$@psV%cWy)mUM%s)xp&9L;({czMF=^~a?Jm@4qJan7UU8d16hY?mSV?NFg zOFLc!e>-<4XJ@m&x#8vA;EqJShob84y!4Jt6`lfie|YQXq1g2q`O`srpKsU1$EAj_ zJMUsyQ}^EJs&XqFHPh28<^z-Z|jOJbx z>lG?lHs20mA7=4dd^UAY57L@!$FKAJJw7*Ilqbz}9SDpb7OR)*S&}KCX=s$~qb~cW z$c(P)=){da&f}##pQrn`E-=WVfhmW77+LCC$R<8`1Qq7-1}o4BsYu-%rWYvi?1@1( zE%&}tKWjU5KJ$#&F|mzgQxbQ2=|-h; z#r(Pl&`nbtQiTldnK1LM-pf@A6K=fn=aUaAlYsqvmFrW{-R7SOt5GJB1eG-Z*A{p? zG}HYCM+6=6@O+8EM$k4ye;aqQs)4fiRxlXn=pcryzWC06;3HSdmr;0g!XT7s zH`#)UzOgVJDcCDlN`DTF-^cMz8-Eb_I!TdLd>a~v98tzsMDXT`EG*Z{oY zeREGr7o7TEpl%g$E7urf+v84#M%rAL0BZtkh4}m?FUNk9Zl|~1Sw~;GZs3J)+@H6V z)9v9Prlxro&9Z_|rIQgjw{H%-dlh-WTK>t0qE-ssC!74RA=6ybYlY{hz4$ux9jm>J z#6QI+L*nMbl@Lak@90B<)1cgKTU?Bg6Mn6W6TP-P2^otHyi#g{Ce2-P)P?wy^^5J3 zQn@4ZzsifQwi5y1=viDrDlkqa*ES;uth9h#*ZjF*x5R~@ zfiA6BPe^GCwR$0HI0EtwHCq3Ue7}&Dfl~p9N5#Icw3N#u8^3dY!=?;3mj={8luItw8m&z35rF?{S0*4wPn z;Qr)#;`y=4@(;&<#DIV?6AXsUWm^%1LSqkbg3~o?x~bo)W*+KB4Hf6sf7_+1+|c&D zAPW426CKtJj;-H1W@)+aN_lw95T00=x|Opna}K-n2w!#L>ji zAjj04kqy1Kbq}%m!QkKYczqQ#n718%Il8ic^yrbkLpDt@gS@nf`i|rMerd9kH@Pgw z9;hDoWzL>?6NW5dS0W|G0R7N{!eJ+OMMbO=S|E&s1?sJ#ZAL+pf#nL;b9g8s-06V)o&0~lY6SwRIvUD z^R{?24}(4%d4B2K?H0w@Sih1deTa(!JgIk^b!9yC8ne^NA-TBXTv=|$MYpCscfS>H zPqe&grf-;qR_Z=OnZvkY2(8vt(8Hl(q)~;>=$mI`RFe%h!eQ70}2kg zN9MH?7ra)er)*29hjBl~Q8AloOXhBytOdT3q3%J!TWj~>!tk!Nc$aG)P}+kTU0^M$ z+tzGgPcn!qWitJfTb~D~nucNmgL=@PurDu13 zW=kv~qTG6-bvH>0wnv8tWQ&vtw}%b|Q6%Uie*KLvH^R9amuLsTN>1_xH3KNMptB$GH6SK^a1`BErj>Xf zi0S`PqOs8h7fC-QPrs-X7C7F|{K#0VdCiM8Cyct!vGN0*jj9!M9SvTF0I_VBDvXO&+yxj8jYQMBHHD_KnP&Z5r+!cRdRXNY~l4IeT>GvpzP?{#{Q%)x{n z)y-YQFoTVtnA%8PDPT4wlJjZ|G>^_2+!)7IIceG0pW^!T5MUs}FF&>)9YP7O4006d z+QHb7vC#QT(*AaoZ}XTCmZ43GH!j%Bz3AL{<0h2C93jOH% z=T3kb`r_{~BI`BYB}3fJtt1wybtYz}H3NW1__Bj?TIg_Btn%fe4=8#0wT7p#Rzh7Q zkG2|0b8UbP2$Ia9zoF}6tjEjx4y!-wY%J60f5-n`8RNl|@vF0k+8;?f*!xtQZR=91 zpeGWeO&l$kVQDm#A{%->Cf+O`|sNwW!U_dI+GMr z#hmqN&~)sH;a!pHY$#22D=_HB`u`%Iw)DuT&^7Bdq&j)fkHQ*iRS`V7cS_#;)ZSnn zaW^CvByp>lNVmAf?$YMFo4;g_J~2{2jL0qfS$iBFyI(g7(MLZm!FTsXb!y%&>Z$uO zcMY{psnZIpV|m|~X3zrpsJ+hJ#g<3|X?{Wi<-936O$p^a)TYDtRAiVn)6v(YI7>f# z7SSch=h>y5C|;WNb7UO<)XT3DX(lFUL#>Ja&0_v&Ui)K|b(3eLNe}9oCMSqcVQwR) zK-6t_ObGG}H8DoN(e&aPu0Iqms#-+~qH<%W)|wOwiOJ95@k`t}qhjwy{_PIIY zJ3+b|b`ZE%g}H-g$EE55;gdLe+o8_ti`pxM<~8!C@4QG2asB^*+k}9dpX%=5*Kdvk z93UCHs(M{HHaT~32O|G|`^=9o4ywyV^U7YbzK=A8}`*h8G!Rgw4%{yRwofs=&() zC64R>?I16JP>hq202Hg}^5 z9aS>DqFH)6r?c}^*%Qjd(9|*DZC?SAAK;xvJ7g<8sS-0TWV2Ea{CUne$v4%bJLw?Z zd9|*L!OKqq^yREAUJG#{ixJ0k?7iZ4aQ%?v9Vq|nb3o_~r&2jz`4+&)D!0ShWos~d z`bB{o4g*Z3owx7Eie2_AXUJ`i zl}NkGDhAVYh-iTmZQ#Yz-8_LtY$z4BQvz_h%2EDHUk@ z_Q}cxIPtzx8Zz}(k3oQXbP51>*gNeI5wb7vKv4EFCmg(KJC%ll?DW-@g#W2@1fcN1 z?|(5HfUEyoF)#$b_dk&Ms{ZdpZs_(zv9>9Q|3@^a7z?BTv|WO#O3{}s;TV6^Y7=> zHKe-cp1HlP%3`Tqdzbe-(!6A!5U)a3AFqD!S$?{-cKQ0z|Q( zr(3?m@jX^=J$uymKT)=FDSCeQm8Z{2>?yC>Z>AJhvPJ#=pF9hg+Rst$A-9?zO1>j{ z#%Ax7ucuq(4M^ekS?QF7x7gt^uM^g%Bqv%B*CdrfGx(2w{YBscV7+Sg?Y{5e>UQ{R z>Y-xE)GHST$oCf2_bVPq@g?-1NP#tX#fi-WLmpu8*a#*Vf~(K$^X%MXA#8L!Z$9X3 znB*_8#~m7UkMt|Xcvr*SA#HKb06j=WfeUXWY>o)lx;!jSeE0lDNRy;a%FozKE#!%iTq2}dBsznCl1<|cbFajbY@^|mSZyL`5_CahS_1UbPvOqZic&8k11f{!b)!p z2mBXJ22?|S-|j9oxgMY#kvltuMyaPIVopPQkY`eLsn19_zL`UGYXgK6{@v*`rq69 zuvn^Z5oUY*J|@X!qA#avy=l&w4A6k?k!q>}Cz7kEy_$Q?!Iag~ziJRhYi-C)DYMOR z&=-?+OG-KWSHnwocc*6vg?(;blXAw>4vZgN%SDn(wMab*q~`+T{Ey#auHfaKp1yQ9`bq782reXHYV0-T=al&MqDt#e{t-fHzGzqOxg$f zvUwC}{7ENodg{z(_3s)q?J=%OXxVd>+EHXipr`HD(f7ht-mc}!0_r$oe?5vF#GdUs z#Q4gT-(#Hg(0_^OxKVSDIC3_bbpND+Gid_Qg*$E!^xkZ?t~B^;dBtzqi?_7~B&g!x zN8>y zfhFwcK&spR8JLVwg8lf>lQG5s*V&itjG6j++$@QIY66)H7QQz^8?y~(HygQkDzVsS zV2gf#w?!&8F~+-r_M{;>mB`MT**v2|b6`YnW4_g0X?x~CH}iYsMPXhTj9@K(5ph*N z(o6S{s@Hea+-Jx9RvaG0Nwh|-qZdRRv!%I_j*e3i`-+bXxpdZ;e|{hYm4Wm`$<2ao zf2BGY+>FL0iqK+IVc_l1o>!V+TJ*9eV}2`#(eZqGXyj}HRyW$y-^YPt-NWmT2c(VyW5K^lW*v`4QT6~Ssxx2HF>c#}SyFG;q0MGaOrX0&+82b`y9%rs2E z;V6N&GF32Wy3Ug=D$%jds>u-f3Y@;9qYoNOOiHYXm!`&ypMPf>xqYQXRab5?Ig_Hi zh^yCLcP|p0hn=rbJXf!K>eSxy14Sk&HT}{OY7MSQbNc{VxYrerBB@H(JRMH__bg*c z!k8^6R}qcS`n7Y(_l3;aEujPkC;UrNz^f#dfrMy}0&mfrW(-|7=$=ypid0|nebvU_V1+tJ znJxVg^T@MvL8uzhTMmr`r9+8TGfiVz+cqC;0n_W$Cnl88*`T=4-8`P*T?9{zJ0M%Z zQ(t8qx@DYXZexLFPBkG;V8uOBjYSOFZS~F+J_Wd55dX&!1@|Wx8#j?wa8YAqSeOql zCXC5{m>Czay|}1-0*(Nw%CHM0~0k~0KA`e zE0|eBz}#c4T#K5kUeVmtZ(eHO=uij4e4t+h1!D3C{ zg`O)ICH4=}rArqr)j=YKn2&FV3ViWZ@3c=$u1+UEEIM)(Ir4(2Nq4BKsVCbJ3#|hj zncQ%?zq5UbeSmC)YHViiEQOKP$8+JbG=*H6e9a5jhhY1J-52?joI(GRb$QKGB#Ao0xOC**+va1 zlO**3z>l`qXv{nrQ?)$Ed{P;L*Z|{$W2@zK^hVAq)`;9QZ1nYeYAi7(RpK+=;AY9B zuehui;u&9R8D#oCMG)kerP;R6N`H=;zRgEv$0|7Ox2km#F5O{0RqI>yz^-(JK`p>Av?mHPZaQK_ zg#!((9U!X5Bh1YV;%*`Fp{(;H-+8+B$?jRo3VAFIJ)!8)|!ZBpIh*KbJ^v}AvK7|4oJeN7eI@WBboKZQu^9NCpojOn~i zk|)4@KWyCW@z$l6QV~5ck8QoQ=g%ExJpu3Pt6TgXoAk2XS=GmE$8T@dMz3@i0mtoY zlzz4%*y-C3i6<2BPuT>npPOqRg|_?#E7(hz5Ru=Dk)JN8lj`2vG5%nsOQ6K%4kc=r zL?&eKO&qRr81{f8ohv1V3Zd`n3Oy_#!F7$GFs~OGb9ayFoS}mAT(^87BT9z#3VKU- zQ)v87_0_7jPK}HP3aul^_7~S9V!2y8zUw;ill9sSrrj4yYq(I~%JcwS%FF{e2`TkU zd`#;Ea=zNN>5axW1<~bGoz=}HIl{a9**{oP0JisVD$mD;+;gNr>7ZFT;t$Dr3wYHT zGPbc)_h1hUxkLHg{Bj9kYNfkq)-?DL%<22|mLxT?e%<%Y#t2v7 zVG-rMUdeS^6C!iDaHNx*cyCif`5MsxDr3ASjB2A_-X292Q(jpfX)hR^(6L&)7hyNx z9k`;h+-qGg*P4ocTxW{BPzGu!rv-RzPz!-mSla*xNT9K)!_;nnR7w1Y?j-x!j<$}W z++dp?!XE~2wVPbdM{_18z0&(oo|d{+N6OtW&5v2&v~erMXh1CK-Rk%&%P{3fd#U<9 zxBMnQlk4mshy)qFj0J>GI5&z{)y88~+#(in>J5?G*KIj#kQ@%s38&COECnV07=*y*iB4;1oy*WgH0iMYw{qSV3j&h>{J zOMulzzD7v^oV9;tq|lb9cVwj;j9B*;&6gdI`dy~Q@1|W~#QF-{0c3T8$F&@MT4$uK zyEDoNe~mI5o0|^fFL)tQ>t35a$!$-7L8hi;4j0~y<_0*18AkPUPUs=ne&+?ZKncQ0 zh)FTcqP-lr`$Z$I%Y+zK>qhsXQTM&C%Z$x~*`MXmDLSgfLJ2yEM>_N_-@qHV{iP8l zf&y)~h&!HdEVlmoX4jw(BxZc%l)>iG%39H13sWn>4QqJIaujxdkAap2kaC1xT-s84 z(`NSfJB8irlQ-~PB-6OjsGkqpFk5Gf)>zm*+Z9~2Xj{4oUkac6w2 zjo1$JPnBy*HGG#coam;*9||Y%z$8e8r>b3#{v~xV+F~P_+$zj=zP$Ke$M+moQ1U~w7mxsTuNN72aQGCf^`zQ zonnly7nQ{7U30UB&@xqn1DDt$WiK5fW%Wq%Wl7K4Osu4z;sd@y&U@PyMcjJjd4+y*xoR> z=xG@-+S6TDnW6}W3BcL$9cKy8*55AWMh`*6!eV9cu)oKRfTPXL%43Ru$Vjdm?31qN zccR@|31t%ZzEpf!p^($B0_2UdJ1B9Ar%xw@$$BI_XRP9c#~-*;bGa45;~#`P)J1n| zf=wF^N6W#i&;q~PGDa)+p80#Aa8Fl+^wD1{+iv0;_X2y}TZF5JzftWq_LUN+!M2vg zwuPQ*az56xUbvsC{3Ht93hv(xWzoo3i37#(j3$)tcd-VzR~sSi?+Z% zVNaUBB3{_b&2VFjAdVz0=GRv^E+vLmbf#|)vHGXW7I7lGg<@WDvi(c=o!0a6bP!{& zbXquMYmKj0hfR0XEcJh$SiPS#Lx+t%|p}xU|JN zTM=r##!`FH@fh+-Nx8z|#kk7+Vc#-o2LcoAm@@ji>Q}m)k8Vqg)%|I@PNLb`WZW|2 z_wh4sZieAa!Dsn1IL3 z-NmrnEE;ZiRXhSxjqP}oEriUZ2-38g#4uPQ#}P-it~dUg-Y1lhdH=4P&AXOkz-w|d z$j@ssuu5f$ie=G?yyyt4cjQc1rnZGgR#q^DydbmIl zmDaZlf1SE;pWi8>fh78wsTo{!R_@zxAF>3`%JpzN(98E{TUVv;XdjILf7n-a2Mr&F zK3l(3nw_5O7t~{p-hX1W8j&B5;R+?RL$froP$42iQz|jg9wa6{DfFry=z?0{jD@4w!H>o1yg{E_j6VCN;TvZ{ch?q!zfAHN5tyqo0FU!!v=x(DRt-k zTa$mZgx%IZA8upP;VW@ArE3w&JPh?y9N{vBu9||j; z@KmHMtXJckeU-&i9I(Q=eN+mbZ3nFc6_sjiSSse=GGST`Kd&&}~*Nv1YqotOew$Z-^!H3aP znR1oY>`>=WlXENVL6%{rrCcf#pFF!Z4eZ^rzIJ~EgSdxs3U6-Z#ETj*Tq(5_SkmPp zN~68Pb>uwC?HY#mVrbAFT-13sny+XOmxQGwuR{oiGol7rtptt5 z3oYNU=AS_T>E8ZwksC72Z}Q#8DHo)37dRa=r<*@rV^n|#<(cIkVE1>=mS+)m8FwACu zO$<{1o+v=CSteMZ_AO>2di4|`aIf`GUpH=(qLw|L0Xfsc&9)p=M>E>DWQojedaGe+;_BI zJ~mfZh>A$UlXFX>HE+h> zmmvtZvSKYKdOdL?Ae}wt86rYM_-8P4mTOD1hxrsmoA#xU2@AO_(B$(ytdq29A3TDq zddtR*>;7E2Z!D-HXEQP2Rpyj4UQC6$vdBQZZG||+zU%xI-|k780y+HX zv&`+V3yKP;;5WzhROQ(7tibuQP*wU?cMv(@Wdr9OGw^W?w%R_z;jB)*My&W!e;0*o z$0aVrRrn>NTB}y0$QX1Oz*cn%!xgX2sSVS$TUOVt;oHTZ?(f*ZQKwoU&^TXxzf|#e zdU5galgdkO3aF@VsP&7a=(*0?B+bvwc=Dm!Ku(zti`_HnIxslIsQRAKW?DR;$-5|; zz7pG_y$(a=Bf+`0>Uzp1NfDuY=@+HNPOa-dqb*QN53_oks(i3Ct=qVVUzpZS?fUv! zp@aB}ObP9ZM_C?hMV*lOE95=H-7x;-Alq{Z|db;xe(37v~MuCIQ>_j*RYW_N!c zWL=O?%CWDE8eoQMEA$~8d8%al74UDMT%tvE@$eM>+bz1sH6TnVn~b<)0ot$sN|EIk z<>s*%Ni7?Mh!on2Th>dLt}@1Cr^O>f0&U_ktWWT1%;L9`omQQ_ znM!-XNNrRoKEL!ARTKbFZSoTjsdAYmB}CH=LbGl9kXw?Y#pZavzrB4!-BeN+<+K5G z0MMH|)WsMzuyI(Xuj)1{wXz4g}9=p+_sfHI2(J+tRo*uDX!XjY0WMtij57<4mWqGnpOY6d5j*KyhnThhB&- zRF5uQ9e-Kh9rx@OppZQ=d;l#0hf>bNV*kc9%j$zpz1g;9YCM2T3NGr{ z?4tCc!XlRZXLp?LEt$3U4^;s%TY0!uUGvX*c&X{Fougt=k_4;T7KtT9pqPE;qQO(b_ zt0+B>XcOC7ZHEP8u(x-qT}$4Ez~vinJOmRc-|2F);*rzqSuwiT?! zJ+%4YV;tW-B7n4P&klL$+U#7##2Z~s`ry42BJ#Cx^Uhp&vRHTzSrrrF!K5EYI@?ep z;I}tv#czKE-#u+lofchr-SCri@jy%RfS)9g_AuWR-bdkLc@s^iN% zwGZ~l>VG>rMS$nNZwa$tbvEbcxx|SYWV8?#cg+m-fas-VnqJN z>Y&P~DS+!2LMOyycCS-eKD{wx`DdiFBx|J1bZA+7rwbC#jsxfC9(#>Ln8T715`?O} z=-hZ2u~R{^x@J1t!3Uhzw@wBIGkJARcHE1fGwp)_#m2V#!=a52AL`5Ko3Bj(f+GFaKqgI;*nh9eqdzT{x4rQ`Q1i`6*>hR=w>t_9N8}OOTIF&TaguW=f2n$TSQc2iY1d=#=W-3Ka*X< zV%z7=9n7TS$fDKJTFkbQJF9EUi$3`-a z`)lM2k?SpQI1o)$ITs4YXCo=WC4VvM=NQe>D^Ym$8Ga{Q-}+nuGlhSFdSBwiJUioV z{0H{f_WrO~`RiXLV*Ts@bY$jbQ`iiORUz@Tj#bnBOoc;hYZVeXm|HlCtBUo~t(m!B!bE-%7AhF3@LO1q3n14r0;k}>!S(T@A1Ph`s^Smi z)bRa(g>p9Q$o<^0=l=q?|F3{s&klRuuihiRJ=|S8c>51N0G`xIS{``!P~nddNw{ty z#YJboZc>Nm@eS!}6ZNni{P(oveO9d|k>lc3z~il9ib%P_G2?lELH*BBmiZM&@T(Xp z{}g%4@;+|6=L;b5D@py&?Jie<{=)KQKB5?wAN?0KfV(TlOB7gYR8@!s|H2Y&{*B=C%;t-^^_z1BUtgn!Z&08ILwC;q$n z9cFtcL}SGeK+5TjvHVO)QbAhqR=5D)S71R0KK9Y;C`gjCir$+3Y?PL z|3R(c%N8G0!ahm7CYe?6kN*N>JzzQEi=+K13Szbw@C^Ve1fL=6PrZ<$T>@={od$Rl z^+QS|ZU{)+=nq7t`M&D?_0>;tl?^);o|oBS4Do%hy=ypT3)l_5khCA%oq#(ka*I0* z4!-8jA1$e+bXaWNa_4Eh%MR}cDBQl?wk$TYDX`Pt*qIas-!wlxYgQ4NNvwnJWrCKg+%w{U2(f?u(GV~tXIEYiR zIq)F-`#7cvaU^_iZ0iXw5xO~QjhcPcMoPYJp2h8f>etpTZ-o7$o`*N$D#0?j%i{n~ zpk_J)YM_q_VQgq=g7N`i$1i5x^%KP#6dPt4{UHRma@~McfbQ?}Xk&&qeP68;guap| zOh`6x0WOP2XL}Rx1$S{5qiZI*Z=tN{r_8+?YFn-Sw{>v?TMb^qwbHXz@tKNuk? zYY=Q_hk9QTwlPo^NF^c;d1PxUj6~mnZr#zDPF+=pBC<~b=PV!joPW{N^jis5HjbQiB8JR1w9-(${c28%8 z&3-U1FRb~j+Te--ns?qU`LwM-AqK^*KOz0a%l025%IPj3&+!s+P5VWbl$2DePRqSW zuf1rtI3%>w!*<4g1=&H$SZQh8&@Jf{Wu7sQt~^>;5dSd|pHSG^ayQzm64F_}g)wfe z(JjB$$0DiKTZ%?SOu4lenJbgFyS(~ewlrhx3p7T%zWZw>#{Z|`r4Hn6*Ht!8a%vb6 z^f3JsOz1O#bVj)8-l(+gUkHrp?Gz@TG52|8LC{u3lbuL`yKI#;L*ymYS5P=M-$Gh_O46aDh!uaIoGbl7-$8~wVS z+VNIjCBbZg_nu-}*_co2|CrJOzKDF6v_#rWwQdc!(la7OsG-7ic^0=x#7K zaSuoeb^`41Qub;+IvdEsTBuha8RK=>`gWwt2KiS!=^Vojhe1(Jhc_soO?YFJ)I z0fsMO#Cs~fTEM0fU?u&_GB_CuwCMqS{!R~?r#>xSn868oq!AI?f)BSFd~G{)6qgVl z?zj>N1|LR9!+CvZyNiuI2c+Cz2qwV6%7>L{4hJ2tr*3DBH?5fV`Qy%YZJJsW0%Btr zAKkj9=6as&gpqQd%0pie>OU|h-lcR3mxmaCs$f&=hWVYgcxe@c8{xS7?*F+&K&#hU z?gT&93wB*59y-imz76q4y*+x@?W2ZXF8d9mvG$XryIZ5R=FdIaJ3}vggJU5tB_bs; zH1bWP+#9c(;?QHF5c4R(y;YDX5*=IY!b0wn9o4#SAVOdhd}K^!XaHYfgKSw&ZhWf z#wA_dqvzP!?2i>eV^7=8lc&zAO_RFTd~m~F>p2ghnh*$QD*iXL_dvJbBZj*K{5pv9dP_OI9fro5BYfoxo2PheQ9Zn6H2(21W|tC%{>Kz(4zUrDP0TRGNEjF8K`#aD*_&*x3gK!B4 zm^5KJN=%`(L1)$;;y^ibdTxyYeJvwO|6OZ|Z^4yM%kJWZe+=_@AP>BD^y;OS9Lo*- zeF_6ewqSJ{|Im}-F(FN4>Iy}?lFjK+Ub!UQ2e{u$k97KU6#5$TG4x-f!AKD$aLJ0` znGLDbqj~?nmOjkex4YA1oV8mc27MPk0a)e1%8J2i3+f(oI9Sh=>k&rRxgFkY`44-c zBKI_WvukH*Om^=NaKeY6#@tUnR`eX0OR^9_*o{(XI(`ao|2A@_*-kHSD} z#G0{xTDbphR{a0uc>Hi{DA2V-A{pxS*JbBc8G?LobpCQW+ScP`UnE|kz}zG!{^|7q zlkR^I$CmHEO^2;xH7P9bIM6M*Ibezlr~Kn&{Z{Nv1$8mKDl zuNK?6@|EyXMy${lHlU;X*S#DyIoFVDbt@g(~Q^k;kfBf;)K;S~hz8!ZF_!;u{ z?LMOR|Mwwj3;ib-!3I*c4X0Y8+i9Lh@HJC&c3dmsYL#+Otd=zIM zD-Ln6ka^G9u5KN#O3{D9B6NotZ850~0%Ag#BN&7egzC!3q7b(?r$45}BG}t3#sETr zhmb*VbXErFHHgiar3t}p06>H4)q5Z<@y*+Y_|24r)#g8?_`c@yPgO?h$uyPgUP4CT z8R1L!e<9z;v1FdajQ?KDjg}kf?MbZ&8Bb_DCUts5cnbL9Pnn+xqcYJN>xxL#4tU?Y z7B^C!e3ARyE8<{P_{La};l>=PD)dwSVzhS(BHYnO_KTH@$RClf{;YkihoM$BA@(@fvZfYw=~nchpPH(Bv~E%>=10UdgwGqTu$=rKW|6 zag~uWaMQ;T-a|^e5lgQjBd8+%W(Xh;id)M9K<402zBSmQ z)&*|3lFs{yLF}JH@{Jy#!pfY37sprQRF>a`uhV?q!(?B89K=V9l1|$5W&l~b+n?_G z$rbtLk;~5?0N6j46~u%_E&Z8!0K%pr_McebuxpVK|7t^%VoZ&O1v-sx?fc#mO&xgfY0}Va z;)0b>!Y~ys6_AQMV*} z9i4hBR5QIl%7wBvJ~ez4c%N-)4gXYrcz}7>-Q<<>TywnT{Vp%Gl|I{>r7tB5^K8BBED#3=Z(l&MM({T|uacD!H*g@z zA-D(63@bbf45?#Ff(cbIVV!dvT>OFJq%<^pp>5&}w|J6ffesBtkNRpAz<17w{MlR= z*Zw08am6ebs>DlQN&wbgK{U|#&|=;dAYKR?nRp{ zM_nmd_o9XR)iZyNFJSU6-`-xKW0A*}T+OoqixC%nP}U83iSs^CB5#-e7Kd(|T^^<{ z3kWQz|Fxq84Bdaf@%nEylW0{yYPcEv;x;Acft@~f5TUs zxFA;p&1C&|uJG~Uq=x=7czkbi|Ia%b^W_nsIVhtoo#ikl&fENw-pDbSZSOTe%KM@I z&WwKI+D%Pkk6_AE<(%OHHRP{H#0o)CtkyB4KeT0o*%$7PU8(XL691QUs=abfZ-H9# zkMs>s+#@(=-}5`&(N58goxaqvO^Eti))`3g@IK^<=1V0Z1>wklOU*%9#m4=ItnRf1 tz{UGB(+(h(oG;V;|K(CHC4Pe^@CCZClwn)9ywmH~E}LB{zi{`#{{u_BzuW)- literal 0 HcmV?d00001 diff --git a/docs/automation/index.rst b/docs/automation/index.rst index ecabff7a..48e83a96 100644 --- a/docs/automation/index.rst +++ b/docs/automation/index.rst @@ -8,11 +8,11 @@ VyOS Automation .. toctree:: - :maxdepth: 1 + :maxdepth: 2 vyos-api vyos-ansible - vyos-terraform + terraform/index vyos-napalm vyos-netmiko vyos-salt diff --git a/docs/automation/terraform/index.rst b/docs/automation/terraform/index.rst new file mode 100644 index 00000000..9a51df91 --- /dev/null +++ b/docs/automation/terraform/index.rst @@ -0,0 +1,18 @@ +############## +VyOS Terraform +############## + + + * Nornir + * startup scripts + + +.. toctree:: + :maxdepth: 1 + :caption: Content + + terraformAWS +# terraformAZ +# terraformvSphere +# terraformGoogle + diff --git a/docs/automation/terraform/terraformAWS.rst b/docs/automation/terraform/terraformAWS.rst new file mode 100644 index 00000000..c81fe906 --- /dev/null +++ b/docs/automation/terraform/terraformAWS.rst @@ -0,0 +1,579 @@ +:lastproofread: 2024-01-11 + +.. _vyos-terraform: + +Terraform for VyOS +================== + +VyOS supports development infrastructure via Terraform and provisioning via Ansible. +Terraform allows you to automate the process of deploying instances on many cloud and virtual platforms. +In this article, we will look at using terraforms to deploy vyos on platforms - AWS, AZURE, and vSphere. +More detailed about what is Terraform you can write using the link_. + +Need to install_ Terraform + +Structure of files in the standard Terraform project: + +.. code-block:: none + + . + ├── main.tf # The main script + ├── version.tf # File for the changing version of Terraform. + ├── variables.tf # The file of all variables in "main.tf" + └── terraform.tfvars # The value of all variables (passwords, login, ip adresses and so on) + + +General commands that we will use for running Terraform scripts + + +.. code-block:: none + + #cd / # go to the Terrafom project + #terraform init # install all addons and provider (aws az and so on) + #terraform plan # show wtah is changing + #terraform apply # run script + #yes # apply running + + +Deploying vyos in the AWS cloud +------------------------------- +With the help of terraforms, you can quickly deploy Vyos-based infrastructure in the AWS cloud. If necessary, the infrastructure can be removed using terraform. +Also we will make provisioning using Ansible. + + +.. image:: /_static/images/aws.png + :width: 50% + :align: center + :alt: Network Topology Diagram + +In this case, we'll create the necessary files for Terraform and Ansible next using Terraform we'll create a single instance on the AWS cloud and make provisioning using Ansible. + + +Preparation steps for deploying VyOS on AWS +------------------------------------------- + +How to create a single instance and install your configuration using Terraform+Ansible+AWS +Step by step: + +AWS + + +1.1 Create an account with AWS and get your "access_key", "secret key" + +1.2 Create a key pair_ and download your .pem key + +.. image:: /_static/images/keypairs.png + :width: 50% + :align: center + :alt: Network Topology Diagram + +1.3 Create a security group_ for the new VyOS instance and open all traffic + +.. image:: /_static/images/sg.png + :width: 50% + :align: center + :alt: Network Topology Diagram + + +.. image:: /_static/images/traffic.png + :width: 50% + :align: center + :alt: Network Topology Diagram + +Terraform + + +2.1 Create a0 UNIX or Windows instance + +2.2 Download and install Terraform + +2.3 Create the folder for example /root/awsterraform + +.. code-block:: none + + mkdir /root/awsterraform + +2.4 Copy all files into your Terraform project "/root/awsterraform" (vyos.tf, var.tf, terraform.tfvars,version.tf), more detailed see `Structure of files Terrafom for AWS`_ + +2.5 Type the commands : + +.. code-block:: none + + #cd / + #terraform init + + +Ansible + + +3.1 Create a UNIX instance whenever you want (local, cloud, and so on) + +3.2 Download and install Ansible + +3.3 Create the folder for example /root/aws/ + +3.4 Copy all files into your Ansible project "/root/aws/" (ansible.cfg, instance.yml, mykey.pem and "all"), more detailed see `Structure of files Ansible for AWS`_ + +mykey.pem you have to get using step 1.2 + + +Start + + +4.1 Type the commands on your Terrafom instance: + +.. code-block:: none + + #cd / + #terraform plan + #terraform apply + #yes + + +Start creating an AWS instance and check the result +--------------------------------------------------- + +.. code-block:: none + + root@localhost:~/awsterraform# terraform apply + + Terraform used the selected providers to generate the following execution plan. + Resource actions are indicated with the following symbols: + + create + + Terraform will perform the following actions: + + # aws_instance.myVyOSec2 will be created + + resource "aws_instance" "myVyOSec2" { + + ami = "ami-************62c2d" + + arn = (known after apply) + + associate_public_ip_address = (known after apply) + + availability_zone = (known after apply) + + cpu_core_count = (known after apply) + + cpu_threads_per_core = (known after apply) + + disable_api_stop = (known after apply) + + disable_api_termination = (known after apply) + + ebs_optimized = (known after apply) + + get_password_data = false + + host_id = (known after apply) + + host_resource_group_arn = (known after apply) + + iam_instance_profile = (known after apply) + + id = (known after apply) + + instance_initiated_shutdown_behavior = (known after apply) + + instance_lifecycle = (known after apply) + + instance_state = (known after apply) + + instance_type = "t2.micro" + + ipv6_address_count = (known after apply) + + ipv6_addresses = (known after apply) + + key_name = "awsterraform" + + monitoring = (known after apply) + + outpost_arn = (known after apply) + + password_data = (known after apply) + + placement_group = (known after apply) + + placement_partition_number = (known after apply) + + primary_network_interface_id = (known after apply) + + private_dns = (known after apply) + + private_ip = (known after apply) + + public_dns = (known after apply) + + public_ip = (known after apply) + + secondary_private_ips = (known after apply) + + security_groups = [ + + "awsterraformsg", + ] + + source_dest_check = true + + spot_instance_request_id = (known after apply) + + subnet_id = (known after apply) + + tags = { + + "name" = "VyOS System" + } + + tags_all = { + + "name" = "VyOS System" + } + + tenancy = (known after apply) + + user_data = (known after apply) + + user_data_base64 = (known after apply) + + user_data_replace_on_change = false + + vpc_security_group_ids = (known after apply) + } + + # local_file.ip will be created + + resource "local_file" "ip" { + + content = (known after apply) + + content_base64sha256 = (known after apply) + + content_base64sha512 = (known after apply) + + content_md5 = (known after apply) + + content_sha1 = (known after apply) + + content_sha256 = (known after apply) + + content_sha512 = (known after apply) + + directory_permission = "0777" + + file_permission = "0777" + + filename = "ip.txt" + + id = (known after apply) + } + + # null_resource.SSHconnection1 will be created + + resource "null_resource" "SSHconnection1" { + + id = (known after apply) + } + + # null_resource.SSHconnection2 will be created + + resource "null_resource" "SSHconnection2" { + + id = (known after apply) + } + + Plan: 4 to add, 0 to change, 0 to destroy. + + Changes to Outputs: + + my_IP = (known after apply) + + Do you want to perform these actions? + Terraform will perform the actions described above. + Only 'yes' will be accepted to approve. + + Enter a value: yes + + aws_instance.myVyOSec2: Creating... + aws_instance.myVyOSec2: Still creating... [10s elapsed] + aws_instance.myVyOSec2: Still creating... [20s elapsed] + aws_instance.myVyOSec2: Still creating... [30s elapsed] + aws_instance.myVyOSec2: Still creating... [40s elapsed] + aws_instance.myVyOSec2: Creation complete after 44s [id=i-09edfca15aac2fe0a] + null_resource.SSHconnection1: Creating... + null_resource.SSHconnection2: Creating... + null_resource.SSHconnection1: Provisioning with 'file'... + null_resource.SSHconnection2: Provisioning with 'remote-exec'... + null_resource.SSHconnection2 (remote-exec): Connecting to remote host via SSH... + null_resource.SSHconnection2 (remote-exec): Host: 10.217.80.104 + null_resource.SSHconnection2 (remote-exec): User: root + null_resource.SSHconnection2 (remote-exec): Password: true + null_resource.SSHconnection2 (remote-exec): Private key: false + null_resource.SSHconnection2 (remote-exec): Certificate: false + null_resource.SSHconnection2 (remote-exec): SSH Agent: false + null_resource.SSHconnection2 (remote-exec): Checking Host Key: false + null_resource.SSHconnection2 (remote-exec): Target Platform: unix + local_file.ip: Creating... + local_file.ip: Creation complete after 0s [id=e8e91f2e24579cd28b92e2d152c0c24c3bf4b52c] + null_resource.SSHconnection2 (remote-exec): Connected! + null_resource.SSHconnection1: Creation complete after 0s [id=7070868940858935600] + + null_resource.SSHconnection2 (remote-exec): PLAY [integration of terraform and ansible] ************************************ + + null_resource.SSHconnection2 (remote-exec): TASK [Wait 300 seconds, but only start checking after 60 seconds] ************** + null_resource.SSHconnection2: Still creating... [10s elapsed] + null_resource.SSHconnection2: Still creating... [20s elapsed] + null_resource.SSHconnection2: Still creating... [30s elapsed] + null_resource.SSHconnection2: Still creating... [40s elapsed] + null_resource.SSHconnection2: Still creating... [50s elapsed] + null_resource.SSHconnection2: Still creating... [1m0s elapsed] + null_resource.SSHconnection2 (remote-exec): ok: [54.144.84.120] + + null_resource.SSHconnection2 (remote-exec): TASK [Configure general settings for the vyos hosts group] ********************* + null_resource.SSHconnection2: Still creating... [1m10s elapsed] + null_resource.SSHconnection2 (remote-exec): changed: [54.144.84.120] + + null_resource.SSHconnection2 (remote-exec): PLAY RECAP ********************************************************************* + null_resource.SSHconnection2 (remote-exec): 54.144.84.120 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + + null_resource.SSHconnection2: Creation complete after 1m16s [id=4902256962410024771] + + Apply complete! Resources: 4 added, 0 changed, 0 destroyed. + + Outputs: + + my_IP = "54.144.84.120" + + + +After executing all the commands you will have your VyOS instance on the AWS cloud with your configuration, it's a very convenient desition. +If you need to delete the instance please type the command: + +.. code-block:: none + + #terraform destroy + + +Troubleshooting +--------------- + +1. Ansible doesn't connect via SSH to your AWS instance: you have to check that your SSH key has copied into the path /root/aws/. +Also, increase the time in the file instance.yml from 300 sec to 500 sec or more. (It depends on your location). +Make sure that you have opened access to the instance in the security group. + +2. Terraform doesn't connect via SSH to your Ansible instance: you have to check the correct login and password in the part of the file vyos. tf + +.. code-block:: none + + connection { + type = "ssh" + user = "root" # open root access using login and password on your Ansible + password = var.password # check password in the file terraform.tfvars isn't empty + host = var.host # check the correct IP address of your Ansible host + } + + +Make sure that Ansible is pinging from Terrafom. + +Structure of files Terrafom for AWS +----------------------------------- + +.. code-block:: none + + . + ├── vyos.tf # The main script + ├── var.tf # File for the changing version of Terraform. + ├── versions.tf # The file of all variables in "vyos.tf" + └── terraform.tfvars # The value of all variables (passwords, login, ip adresses and so on) + + + +File contents of Terrafom for AWS +--------------------------------- + +vyos.tf + +.. code-block:: none + + + ############################################################################## + # Build an VyOS VM from the Marketplace + # To finde nessesery AMI image_ in AWS + # + # In the script vyos.tf we'll use default values (you can chang it as you need) + # AWS Region = "us-east-1" + # AMI = "standard AMI of VyOS from AWS Marketplace" + # Size of VM = "t2.micro" + # AWS Region = "us-east-1" + # After deploying the AWS instance and getting an IP address, the IP address is copied into the file + #"ip.txt" and copied to the Ansible node for provisioning. + ############################################################################## + + provider "aws" { + access_key = var.access + secret_key = var.secret + region = var.region + } + + variable "region" { + default = "us-east-1" + description = "AWS Region" + } + + variable "ami" { + default = "ami-**************3b3" # ami image please enter your details + description = "Amazon Machine Image ID for VyOS" + } + + variable "type" { + default = "t2.micro" + description = "Size of VM" + } + + # my resource for VyOS + + resource "aws_instance" "myVyOSec2" { + ami = var.ami + key_name = "awsterraform" # Please enter your details from 1.2 of Preparation steps for deploying VyOS on AWS + security_groups = ["awsterraformsg"] # Please enter your details from 1.3 of Preparation steps for deploying VyOS on AWS + instance_type = var.type + tags = { + name = "VyOS System" + } + } + + ############################################################################## + # specific variable (to getting type "terraform plan"): + # aws_instance.myVyOSec2.public_ip - the information about public IP address + # of our instance, needs for provisioning and ssh connection from Ansible + ############################################################################## + + output "my_IP"{ + value = aws_instance.myVyOSec2.public_ip + } + + ############################################################################## + # + # IP of aws instance copied to a file ip.txt in local system Terraform + # ip.txt looks like: + # cat ./ip.txt + # ххх.ххх.ххх.ххх + ############################################################################## + + resource "local_file" "ip" { + content = aws_instance.myVyOSec2.public_ip + filename = "ip.txt" + } + + #connecting to the Ansible control node using SSH connection + + ############################################################################## + # Steps "SSHconnection1" and "SSHconnection2" need to get file ip.txt from the terraform node and start remotely the playbook of Ansible. + ############################################################################## + + resource "null_resource" "SSHconnection1" { + depends_on = [aws_instance.myVyOSec2] + connection { + type = "ssh" + user = "root" + password = var.password + host = var.host + } + + #copying the ip.txt file to the Ansible control node from local system + + provisioner "file" { + source = "ip.txt" + destination = "/root/aws/ip.txt" # The folder of your Ansible project + } + } + + resource "null_resource" "SSHconnection2" { + depends_on = [aws_instance.myVyOSec2] + connection { + type = "ssh" + user = "root" + password = var.password + host = var.host + } + #command to run Ansible playbook on remote Linux OS + provisioner "remote-exec" { + inline = [ + "cd /root/aws/", + "ansible-playbook instance.yml" # more detailed in "File contents of Ansible for AWS" + ] + } + } + + +var.tf + +.. code-block:: none + + variable "password" { + description = "pass for Ansible" + type = string + sensitive = true + } + variable "host"{ + description = "The IP of my Ansible" + type = string + } + variable "access" { + description = "my access_key for AWS" + type = string + sensitive = true + } + variable "secret" { + description = "my secret_key for AWS" + type = string + sensitive = true + } + +versions.tf + +.. code-block:: none + + terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + } + } + +terraform.tfvars + +.. code-block:: none + + password = "" # password for Ansible SSH + host = "" # IP of my Ansible + access = "" # access_key for AWS + secret = "" # secret_key for AWS + + +Structure of files Ansible for AWS +---------------------------------- + +.. code-block:: none + + . + ├── group_vars + └── all + ├── ansible.cfg + ├── mykey.pem + └── instance.yml + + +File contents of Ansible for AWS +-------------------------------- + +ansible.cfg + +.. code-block:: none + + [defaults] + inventory = /root/aws/ip.txt + host_key_checking= False + private_key_file = /root/aws/awsterraform.pem # check the name + remote_user=vyos + +mykey.pem + +.. code-block:: none + + Copy your key.pem from AWS + + +instance.yml + + + +.. code-block:: none + + ############################################################################## + # About tasks: + # "Wait 300 seconds, but only start checking after 60 seconds" - try to make ssh connection every 60 seconds until 300 seconds + # "Configure general settings for the vyos hosts group" - make provisioning into AWS VyOS node + # You have to add all necessary cammans of VyOS under the block "lines:" + ############################################################################## + + + - name: integration of terraform and ansible + hosts: all + gather_facts: 'no' + + tasks: + + - name: "Wait 300 seconds, but only start checking after 60 seconds" + wait_for_connection: + delay: 60 + timeout: 300 + + - name: "Configure general settings for the vyos hosts group" + vyos_config: + lines: + - set system name-server 8.8.8.8 + save: + true + + +all + +.. code-block:: none + + ansible_connection: ansible.netcommon.network_cli + ansible_network_os: vyos.vyos.vyos + ansible_user: vyos + +Sourse files for AWS from GIT +----------------------------- + +All files about the article can be found here_ + + +.. _link: https://developer.hashicorp.com/terraform/intro +.. _install: https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli +.. _pair: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-key-pairs.html +.. _group: https://docs.aws.amazon.com/cli/latest/userguide/cli-services-ec2-sg.html +.. _image: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html +.. _here: https://github.com/vyos/vyos-automation/tree/main/TerraformCloud/AWS_terraform_ansible_single_vyos_instance-main \ No newline at end of file diff --git a/docs/automation/vyos-terraform.rst b/docs/automation/vyos-terraform.rst deleted file mode 100644 index 75967202..00000000 --- a/docs/automation/vyos-terraform.rst +++ /dev/null @@ -1,1036 +0,0 @@ -:lastproofread: 2024-01-11 - -.. _vyos-terraform: - -Terraform -========= - -VyOS supports develop infrastructia via Terraform and provisioning via ansible. -Need to install ``Terraform`` - -Structure of files - -.. code-block:: none - - . - ├── main.tf - ├── version.tf - ├── variables.tf - └── terraform.tfvars - -Run Terraform -------------- - -.. code-block:: none - - #cd /your folder - #terraform init - #terraform plan - #terraform apply - #yes - - -Deploying vyos in the AWS cloud -------------------------------- -With the help of terraforms, you can quickly deploy Vyos-based infrastructure in the AWS cloud. If necessary, the infrastructure can be removed using terraform. -Also we will make provisioning using Ansible. - -Structure of files Terrafom - -.. code-block:: none - - . - ├── vyos.tf - └── var.tf - -File contents -------------- - -vyos.tf - -.. code-block:: none - - terraform { - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 5.0" - } - } - } - - provider "aws" { - access_key = var.access - secret_key = var.secret - region = var.region - } - - variable "region" { - default = "us-east-1" - description = "AWS Region" - } - - variable "ami" { - default = "ami-**************" # ami image please enter your details - description = "Amazon Machine Image ID for VyOS" - } - - variable "type" { - default = "t2.micro" - description = "Size of VM" - } - - # my resource for VyOS - - resource "aws_instance" "myVyOSec2" { - ami = var.ami - key_name = "mykeyname" # Please enter your details - security_groups = ["my_sg"] # Please enter your details - instance_type = var.type - tags = { - name = "VyOS System" - } - } - - output "my_IP"{ - value = aws_instance.myVyOSec2.public_ip - } - - - #IP of aws instance copied to a file ip.txt in local system Terraform - - resource "local_file" "ip" { - content = aws_instance.myVyOSec2.public_ip - filename = "ip.txt" - } - - #connecting to the Ansible control node using SSH connection - - resource "null_resource" "SSHconnection1" { - depends_on = [aws_instance.myVyOSec2] - connection { - type = "ssh" - user = "root" - password = var.password - host = var.host - } - #copying the ip.txt file to the Ansible control node from local system - provisioner "file" { - source = "ip.txt" - destination = "/root/aws/ip.txt" # The folder of your Ansible project - } - } - - resource "null_resource" "SSHconnection2" { - depends_on = [aws_instance.myVyOSec2] - connection { - type = "ssh" - user = "root" - password = var.password - host = var.host - } - #command to run Ansible playbook on remote Linux OS - provisioner "remote-exec" { - inline = [ - "cd /root/aws/", - "ansible-playbook instance.yml" - ] - } - } - - -var.tf - -.. code-block:: none - - variable "password" { - description = "pass for Ansible" - type = string - sensitive = true - } - variable "host"{ - description = "The IP of my Ansible" - } - variable "access" { - description = "my access_key for AWS" - type = string - sensitive = true - } - variable "secret" { - description = "my secret_key for AWS" - type = string - sensitive = true - } - - -Structure of files Ansible - -.. code-block:: none - - . - ├── group_vars - └── all - ├── ansible.cfg - ├── mykey.pem - └── instance.yml - - -File contents -------------- - -ansible.cfg - -.. code-block:: none - - [defaults] - inventory = /root/aws/ip.txt - host_key_checking= False - private_key_file = /root/aws/mykey.pem - remote_user=vyos - -mykey.pem - -.. code-block:: none - - -----BEGIN OPENSSH PRIVATE KEY----- - - Copy your key.pem from AWS - - -----END OPENSSH PRIVATE KEY----- - -instance.yml - -.. code-block:: none - - - name: integration of terraform and ansible - hosts: all - gather_facts: 'no' - - tasks: - - - name: "Wait 300 seconds, but only start checking after 60 seconds" - wait_for_connection: - delay: 60 - timeout: 300 - - - name: "Configure general settings for the vyos hosts group" - vyos_config: - lines: - - set system name-server 8.8.8.8 - save: - true - - -all - -.. code-block:: none - - ansible_connection: ansible.netcommon.network_cli - ansible_network_os: vyos.vyos.vyos - ansible_user: vyos - -AWS_terraform_ansible_single_vyos_instance ------------------------------------------- - -How to create a single instance and install your configuration using Terraform+Ansible+AWS -Step by step: - -AWS ---- - -1.1 Create an account with AWS and get your "access_key", "secret key" - -1.2 Create a key pair and download your .pem key - -1.3 Create a security group for the new VyOS instance - -Terraform ---------- - -2.1 Create a UNIX or Windows instance - -2.2 Download and install Terraform - -2.3 Create the folder for example ../awsvyos/ - -2.4 Copy all files into your Terraform project (vyos.tf, var.tf) -2.4.1 Please type the information into the strings 22, 35, 36 of file "vyos.tf" - -2.5 Type the commands : - - #cd /your folder - - #terraform init - -Ansible -------- - -3.1 Create a UNIX instance - -3.2 Download and install Ansible - -3.3 Create the folder for example /root/aws/ - -3.4 Copy all files from my folder /Ansible into your Ansible project (ansible.cfg, instance.yml, mykey.pem) - -mykey.pem you have to get using step 1.2 - -Start ------ - -4.1 Type the commands on your Terrafom instance: - - #cd /your folder - - #terraform plan - - #terraform apply - - #yes - -.. image:: /_static/images/aws.png - :width: 80% - :align: center - :alt: Network Topology Diagram - - - -Deploying vyos in the Azure cloud ---------------------------------- -With the help of terraforms, you can quickly deploy Vyos-based infrastructure in the Azure cloud. If necessary, the infrastructure can be removed using terraform. - -Structure of files Terrafom - -.. code-block:: none - - . - ├── main.tf - └── variables.tf - -File contents -------------- - -main.tf - -.. code-block:: none - - ############################################################################## - # HashiCorp Guide to Using Terraform on Azure - # This Terraform configuration will create the following: - # Resource group with a virtual network and subnet - # An VyOS server without ssh key (only login+password) - ############################################################################## - - # Chouse a provider - - provider "azurerm" { - features {} - } - - # Create a resource group. In Azure every resource belongs to a - # resource group. - - resource "azurerm_resource_group" "azure_vyos" { - name = "${var.resource_group}" - location = "${var.location}" - } - - # The next resource is a Virtual Network. - - resource "azurerm_virtual_network" "vnet" { - name = "${var.virtual_network_name}" - location = "${var.location}" - address_space = ["${var.address_space}"] - resource_group_name = "${var.resource_group}" - } - - # Build a subnet to run our VMs in. - - resource "azurerm_subnet" "subnet" { - name = "${var.prefix}subnet" - virtual_network_name = "${azurerm_virtual_network.vnet.name}" - resource_group_name = "${var.resource_group}" - address_prefixes = ["${var.subnet_prefix}"] - } - - ############################################################################## - # Build an VyOS VM from the Marketplace - # To finde nessesery image use the command: - # - # az vm image list --offer vyos --all - # - # Now that we have a network, we'll deploy an VyOS server. - # An Azure Virtual Machine has several components. In this example we'll build - # a security group, a network interface, a public ip address, a storage - # account and finally the VM itself. Terraform handles all the dependencies - # automatically, and each resource is named with user-defined variables. - ############################################################################## - - - # Security group to allow inbound access on port 22 (ssh) - - resource "azurerm_network_security_group" "vyos-sg" { - name = "${var.prefix}-sg" - location = "${var.location}" - resource_group_name = "${var.resource_group}" - - security_rule { - name = "SSH" - priority = 100 - direction = "Inbound" - access = "Allow" - protocol = "Tcp" - source_port_range = "*" - destination_port_range = "22" - source_address_prefix = "${var.source_network}" - destination_address_prefix = "*" - } - } - - # A network interface. - - resource "azurerm_network_interface" "vyos-nic" { - name = "${var.prefix}vyos-nic" - location = "${var.location}" - resource_group_name = "${var.resource_group}" - - ip_configuration { - name = "${var.prefix}ipconfig" - subnet_id = "${azurerm_subnet.subnet.id}" - private_ip_address_allocation = "Dynamic" - public_ip_address_id = "${azurerm_public_ip.vyos-pip.id}" - } - } - - # Add a public IP address. - - resource "azurerm_public_ip" "vyos-pip" { - name = "${var.prefix}-ip" - location = "${var.location}" - resource_group_name = "${var.resource_group}" - allocation_method = "Dynamic" - } - - # Build a virtual machine. This is a standard VyOS instance from Marketplace. - - resource "azurerm_virtual_machine" "vyos" { - name = "${var.hostname}-vyos" - location = "${var.location}" - resource_group_name = "${var.resource_group}" - vm_size = "${var.vm_size}" - - network_interface_ids = ["${azurerm_network_interface.vyos-nic.id}"] - delete_os_disk_on_termination = "true" - - # To finde an information about the plan use the command: - # az vm image list --offer vyos --all - - plan { - publisher = "sentriumsl" - name = "vyos-1-3" - product = "vyos-1-2-lts-on-azure" - } - - storage_image_reference { - publisher = "${var.image_publisher}" - offer = "${var.image_offer}" - sku = "${var.image_sku}" - version = "${var.image_version}" - } - - storage_os_disk { - name = "${var.hostname}-osdisk" - managed_disk_type = "Standard_LRS" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "${var.hostname}" - admin_username = "${var.admin_username}" - admin_password = "${var.admin_password}" - } - - os_profile_linux_config { - disable_password_authentication = false - } - } - - data "azurerm_public_ip" "example" { - depends_on = ["azurerm_virtual_machine.vyos"] - name = "vyos-ip" - resource_group_name = "${var.resource_group}" - } - output "public_ip_address" { - value = data.azurerm_public_ip.example.ip_address - } - - # IP of AZ instance copied to a file ip.txt in local system - - resource "local_file" "ip" { - content = data.azurerm_public_ip.example.ip_address - filename = "ip.txt" - } - - #Connecting to the Ansible control node using SSH connection - - resource "null_resource" "nullremote1" { - depends_on = ["azurerm_virtual_machine.vyos"] - connection { - type = "ssh" - user = "root" - password = var.password - host = var.host - } - - # Copying the ip.txt file to the Ansible control node from local system - - provisioner "file" { - source = "ip.txt" - destination = "/root/az/ip.txt" - } - } - - resource "null_resource" "nullremote2" { - depends_on = ["azurerm_virtual_machine.vyos"] - connection { - type = "ssh" - user = "root" - password = var.password - host = var.host - } - - # Command to run ansible playbook on remote Linux OS - - provisioner "remote-exec" { - - inline = [ - "cd /root/az/", - "ansible-playbook instance.yml" - ] - } - } - - - -variables.tf - -.. code-block:: none - - ############################################################################## - # Variables File - # - # Here is where we store the default values for all the variables used in our - # Terraform code. - ############################################################################## - - variable "resource_group" { - description = "The name of your Azure Resource Group." - default = "my_resource_group" - } - - variable "prefix" { - description = "This prefix will be included in the name of some resources." - default = "vyos" - } - - variable "hostname" { - description = "Virtual machine hostname. Used for local hostname, DNS, and storage-related names." - default = "vyos_terraform" - } - - variable "location" { - description = "The region where the virtual network is created." - default = "centralus" - } - - variable "virtual_network_name" { - description = "The name for your virtual network." - default = "vnet" - } - - variable "address_space" { - description = "The address space that is used by the virtual network. You can supply more than one address space. Changing this forces a new resource to be created." - default = "10.0.0.0/16" - } - - variable "subnet_prefix" { - description = "The address prefix to use for the subnet." - default = "10.0.10.0/24" - } - - variable "storage_account_tier" { - description = "Defines the storage tier. Valid options are Standard and Premium." - default = "Standard" - } - - variable "storage_replication_type" { - description = "Defines the replication type to use for this storage account. Valid options include LRS, GRS etc." - default = "LRS" - } - - # The most chippers size - - variable "vm_size" { - description = "Specifies the size of the virtual machine." - default = "Standard_B1s" - } - - variable "image_publisher" { - description = "Name of the publisher of the image (az vm image list)" - default = "sentriumsl" - } - - variable "image_offer" { - description = "Name of the offer (az vm image list)" - default = "vyos-1-2-lts-on-azure" - } - - variable "image_sku" { - description = "Image SKU to apply (az vm image list)" - default = "vyos-1-3" - } - - variable "image_version" { - description = "Version of the image to apply (az vm image list)" - default = "1.3.3" - } - - variable "admin_username" { - description = "Administrator user name" - default = "vyos" - } - - variable "admin_password" { - description = "Administrator password" - default = "Vyos0!" - } - - variable "source_network" { - description = "Allow access from this network prefix. Defaults to '*'." - default = "*" - } - - variable "password" { - description = "pass for Ansible" - type = string - sensitive = true - } - variable "host"{ - description = "IP of my Ansible" - } - - -Structure of files Ansible - -.. code-block:: none - - . - ├── group_vars - └── all - ├── ansible.cfg - └── instance.yml - - -File contents -------------- - -ansible.cfg - -.. code-block:: none - - [defaults] - inventory = /root/az/ip.txt - host_key_checking= False - remote_user=vyos - - -instance.yml - -.. code-block:: none - - - name: integration of terraform and ansible - hosts: all - gather_facts: 'no' - - tasks: - - - name: "Wait 300 seconds, but only start checking after 60 seconds" - wait_for_connection: - delay: 60 - timeout: 300 - - - name: "Configure general settings for the vyos hosts group" - vyos_config: - lines: - - set system name-server 8.8.8.8 - save: - true - - -all - -.. code-block:: none - - ansible_connection: ansible.netcommon.network_cli - ansible_network_os: vyos.vyos.vyos - - # user and password gets from terraform variables "admin_username" and "admin_password" - ansible_user: vyos - ansible_ssh_pass: Vyos0! - - -Azure_terraform_ansible_single_vyos_instance --------------------------------------------- - -How to create a single instance and install your configuration using Terraform+Ansible+Azure -Step by step: - -Azure ------ - -1.1 Create an account with Azure - -Terraform ---------- - -2.1 Create a UNIX or Windows instance - -2.2 Download and install Terraform - -2.3 Create the folder for example ../azvyos/ - -2.4 Copy all files from my folder /Terraform into your Terraform project (main.tf, variables.tf) - -2.5 Login with Azure using the command - - #az login - -2.6 Type the commands : - - #cd /your folder - - #terraform init - -Ansible -------- - -3.1 Create a UNIX instance - -3.2 Download and install Ansible - -3.3 Create the folder for example /root/az/ - -3.4 Copy all files from my folder /Ansible into your Ansible project (ansible.cfg, instance.yml and /group_vars) - -Start ------ - -4.1 Type the commands on your Terrafom instance: - - #cd /your folder - - #terraform plan - - #terraform apply - - #yes - - - -Deploying vyos in the Vsphere infrastructia -------------------------------------------- -With the help of terraforms, you can quickly deploy Vyos-based infrastructure in the vSphere. - -Structure of files Terrafom - -.. code-block:: none - - . - ├── main.tf - ├── versions.tf - ├── variables.tf - └── terraform.tfvars - -File contents -------------- - -main.tf - -.. code-block:: none - - provider "vsphere" { - user = var.vsphere_user - password = var.vsphere_password - vsphere_server = var.vsphere_server - allow_unverified_ssl = true - } - - data "vsphere_datacenter" "datacenter" { - name = var.datacenter - } - - data "vsphere_datastore" "datastore" { - name = var.datastore - datacenter_id = data.vsphere_datacenter.datacenter.id - } - - data "vsphere_compute_cluster" "cluster" { - name = var.cluster - datacenter_id = data.vsphere_datacenter.datacenter.id - } - - data "vsphere_resource_pool" "default" { - name = format("%s%s", data.vsphere_compute_cluster.cluster.name, "/Resources/terraform") # set as you need - datacenter_id = data.vsphere_datacenter.datacenter.id - } - - data "vsphere_host" "host" { - name = var.host - datacenter_id = data.vsphere_datacenter.datacenter.id - } - - data "vsphere_network" "network" { - name = var.network_name - datacenter_id = data.vsphere_datacenter.datacenter.id - } - - ## Deployment of VM from Remote OVF - resource "vsphere_virtual_machine" "vmFromRemoteOvf" { - name = var.remotename - datacenter_id = data.vsphere_datacenter.datacenter.id - datastore_id = data.vsphere_datastore.datastore.id - host_system_id = data.vsphere_host.host.id - resource_pool_id = data.vsphere_resource_pool.default.id - network_interface { - network_id = data.vsphere_network.network.id - } - wait_for_guest_net_timeout = 2 - wait_for_guest_ip_timeout = 2 - - ovf_deploy { - allow_unverified_ssl_cert = true - remote_ovf_url = var.url_ova - disk_provisioning = "thin" - ip_protocol = "IPv4" - ip_allocation_policy = "dhcpPolicy" - ovf_network_map = { - "Network 1" = data.vsphere_network.network.id - "Network 2" = data.vsphere_network.network.id - } - } - vapp { - properties = { - "password" = "12345678", - "local-hostname" = "terraform_vyos" - } - } - } - - output "ip" { - description = "default ip address of the deployed VM" - value = vsphere_virtual_machine.vmFromRemoteOvf.default_ip_address - } - - # IP of AZ instance copied to a file ip.txt in local system - - resource "local_file" "ip" { - content = vsphere_virtual_machine.vmFromRemoteOvf.default_ip_address - filename = "ip.txt" - } - - #Connecting to the Ansible control node using SSH connection - - resource "null_resource" "nullremote1" { - depends_on = ["vsphere_virtual_machine.vmFromRemoteOvf"] - connection { - type = "ssh" - user = "root" - password = var.ansiblepassword - host = var.ansiblehost - - } - - # Copying the ip.txt file to the Ansible control node from local system - - provisioner "file" { - source = "ip.txt" - destination = "/root/vsphere/ip.txt" - } - } - - resource "null_resource" "nullremote2" { - depends_on = ["vsphere_virtual_machine.vmFromRemoteOvf"] - connection { - type = "ssh" - user = "root" - password = var.ansiblepassword - host = var.ansiblehost - } - - # Command to run ansible playbook on remote Linux OS - - provisioner "remote-exec" { - - inline = [ - "cd /root/vsphere/", - "ansible-playbook instance.yml" - ] - } - } - - -versions.tf - -.. code-block:: none - - # Copyright (c) HashiCorp, Inc. - # SPDX-License-Identifier: MPL-2.0 - - terraform { - required_providers { - vsphere = { - source = "hashicorp/vsphere" - version = "2.4.0" - } - } - } - -variables.tf - -.. code-block:: none - - # Copyright (c) HashiCorp, Inc. - # SPDX-License-Identifier: MPL-2.0 - - variable "vsphere_server" { - description = "vSphere server" - type = string - } - - variable "vsphere_user" { - description = "vSphere username" - type = string - } - - variable "vsphere_password" { - description = "vSphere password" - type = string - sensitive = true - } - - variable "datacenter" { - description = "vSphere data center" - type = string - } - - variable "cluster" { - description = "vSphere cluster" - type = string - } - - variable "datastore" { - description = "vSphere datastore" - type = string - } - - variable "network_name" { - description = "vSphere network name" - type = string - } - - variable "host" { - description = "name if yor host" - type = string - } - - variable "remotename" { - description = "the name of you VM" - type = string - } - - variable "url_ova" { - description = "the URL to .OVA file or cloude store" - type = string - } - - variable "ansiblepassword" { - description = "Ansible password" - type = string - } - - variable "ansiblehost" { - description = "Ansible host name or IP" - type = string - } - -terraform.tfvars - -.. code-block:: none - - vsphere_user = "" - vsphere_password = "" - vsphere_server = "" - datacenter = "" - datastore = "" - cluster = "" - network_name = "" - host = "" - url_ova = "" - ansiblepassword = "" - ansiblehost = "" - remotename = "" - -Azure_terraform_ansible_single_vyos_instance --------------------------------------------- - -How to create a single instance and install your configuration using Terraform+Ansible+Vsphere -Step by step: - -Vsphere -------- - -1.1 Collect all data in to file "terraform.tfvars" and create resources fo example "terraform" - -Terraform ---------- - -2.1 Create a UNIX or Windows instance - -2.2 Download and install Terraform - -2.3 Create the folder for example ../vsphere/ - -2.4 Copy all files from my folder /Terraform into your Terraform project - -2.5 Type the commands : - - #cd /your folder - - #terraform init - - -Ansible -------- - -3.1 Create a UNIX instance - -3.2 Download and install Ansible - -3.3 Create the folder for example /root/vsphere/ - -3.4 Copy all files from my folder /Ansible into your Ansible project (ansible.cfg, instance.yml and /group_vars) - -Start ------ - -4.1 Type the commands on your Terrafom instance: - - #cd /your folder - - #terraform plan - - #terraform apply - - #yes -