From 5b9899995b87fd94bafadab151b315195820461f Mon Sep 17 00:00:00 2001 From: Ram Mohan Rao Chukka <1331672+chukka@users.noreply.github.com> Date: Sun, 30 May 2021 20:51:17 +0530 Subject: [PATCH] [ansible] JFrog Platform 7.19.4 (#124) --- .../jfrog/platform/CHANGELOG.md | 7 +- .../jfrog/platform/README.md | 10 +-- .../jfrog/platform/galaxy.yml | 4 +- .../group_vars/all/package_version.yml | 8 -- .../platform/jfrog-platform-7.18.6.tar.gz | Bin 56595 -> 0 bytes .../platform/jfrog-platform-7.19.4.tar.gz | Bin 0 -> 57763 bytes .../roles/artifactory/defaults/main.yml | 17 ++-- .../platform/roles/artifactory/meta/main.yml | 2 +- .../roles/artifactory/tasks/install.yml | 65 +++++++++----- .../roles/artifactory/tasks/upgrade.yml | 82 ++++++++++++------ .../templates/artifactory.cluster.license.j2 | 4 +- .../artifactory/templates/artifactory.lic.j2 | 4 +- .../artifactory/templates/binarystore.xml.j2 | 4 +- .../artifactory/templates/system.yaml.j2 | 4 +- .../platform/roles/artifactory/vars/main.yml | 6 ++ .../roles/distribution/defaults/main.yml | 9 +- .../roles/distribution/tasks/install.yml | 40 ++++++--- .../roles/distribution/tasks/upgrade.yml | 51 ++++++----- .../distribution/templates/system.yaml.j2 | 4 +- .../platform/roles/distribution/vars/main.yml | 4 + .../roles/missioncontrol/defaults/main.yml | 14 +-- .../roles/missioncontrol/meta/main.yml | 4 +- .../roles/missioncontrol/tasks/install.yml | 31 ++++--- .../tasks/setup-elasticsearch.yml | 12 +-- .../tasks/setup-searchguard.yml | 77 +++++----------- .../tasks/upgrade-elasticsearch.yml | 1 - .../tasks/upgrade-searchguard.yml | 72 +++++---------- .../roles/missioncontrol/tasks/upgrade.yml | 46 +++++++--- .../templates/installer-info.json.j2 | 2 +- .../missioncontrol/templates/system.yaml.j2 | 4 +- .../roles/missioncontrol/vars/main.yml | 5 ++ .../platform/roles/postgres/tasks/Debian.yml | 6 +- .../platform/roles/postgres/tasks/main.yml | 4 +- .../platform/roles/postgres/vars/Debian.yml | 3 + .../platform/roles/xray/defaults/main.yml | 9 +- .../platform/roles/xray/tasks/install.yml | 27 ++++-- .../platform/roles/xray/tasks/upgrade.yml | 61 +++++++------ .../jfrog/platform/roles/xray/vars/main.yml | 6 +- 38 files changed, 399 insertions(+), 310 deletions(-) delete mode 100644 Ansible/ansible_collections/jfrog/platform/group_vars/all/package_version.yml delete mode 100644 Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.18.6.tar.gz create mode 100644 Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.19.4.tar.gz create mode 100644 Ansible/ansible_collections/jfrog/platform/roles/artifactory/vars/main.yml diff --git a/Ansible/ansible_collections/jfrog/platform/CHANGELOG.md b/Ansible/ansible_collections/jfrog/platform/CHANGELOG.md index cbddfe4..960584a 100644 --- a/Ansible/ansible_collections/jfrog/platform/CHANGELOG.md +++ b/Ansible/ansible_collections/jfrog/platform/CHANGELOG.md @@ -1,9 +1,14 @@ # JFrog Platform Ansible Collection Changelog All changes to this collection will be documented in this file. +## [7.9.4] - May 31, 2021 +* Moved product versions from `groups_vars/all/package_version.yml` to roles//defaults +* Added variable to configure postgres apt key (`postgres_apt_key_url`) and id (`postgres_apt_key_id`) +* Squashed bugs from previous release + ## [7.8.6] - May 10, 2021 * Fixed broken URLs in ansible galaxy - [108](https://github.com/jfrog/JFrog-Cloud-Installers/issues/108) -* Added option to configure system.yaml (using `_systemyaml` variable) and binarystore.xml (using `artifactory_binarystore` variable) +* Added variable to configure system.yaml (using `_systemyaml`) and binarystore.xml (using `artifactory_binarystore`) ## [7.8.5] - May 3, 2021 * Added new `jfrog.platform` collection with Artifactory, Distribution, Missioncontrol and Xray roles diff --git a/Ansible/ansible_collections/jfrog/platform/README.md b/Ansible/ansible_collections/jfrog/platform/README.md index cec9f31..319753f 100644 --- a/Ansible/ansible_collections/jfrog/platform/README.md +++ b/Ansible/ansible_collections/jfrog/platform/README.md @@ -2,8 +2,8 @@ This Ansible directory consists of the following directories that support the JFrog Platform collection. - * [ansible_collections directory](ansible_collections) - This directory contains the Ansible collection package that has the Ansible roles for Artifactory, Distribution, Missioncontrol and Xray. See the roles README for details on the product roles and variables. - * [examples directory](examples) - This directory contains example playbooks for various architectures. + * ansible_collections directory - This directory contains the Ansible collection package that has the Ansible roles for Artifactory, Distribution, Missioncontrol and Xray. See the roles README for details on the product roles and variables. + * examples directory - This directory contains example playbooks for various architectures. ## Getting Started @@ -28,9 +28,9 @@ This Ansible directory consists of the following directories that support the JF 2. Ansible uses SSH to connect to hosts. Ensure that your SSH private key is on your client and the public keys are installed on your Ansible hosts. - 3. Create your inventory file. Use one of the examples from the [examples directory](examples) to construct an inventory file (hosts.ini) with the host addresses + 3. Create your inventory file. Use one of the examples from the examples directory to construct an inventory file (hosts.ini) with the host addresses - 4. Create your playbook. Use one of the examples from the [examples directory](examples) to construct a playbook using the JFrog Ansible roles. These roles will be applied to your inventory and provision software. + 4. Create your playbook. Use one of the examples from the examples directory to construct a playbook using the JFrog Ansible roles. These roles will be applied to your inventory and provision software. 5. Then execute with the following command to provision the JFrog Platform with Ansible. @@ -89,7 +89,7 @@ All JFrog product roles support software updates. To use a role to perform a sof ``` ## Building the Collection Archive -1. Go to the [ansible_collections/jfrog/platform directory](ansible_collections/jfrog/platform). +1. Go to the ansible_collections/jfrog/platform directory. 2. Update the galaxy.yml meta file as needed. Update the version. 3. Build the archive. (Requires Ansible 2.9+) ``` diff --git a/Ansible/ansible_collections/jfrog/platform/galaxy.yml b/Ansible/ansible_collections/jfrog/platform/galaxy.yml index 96333ca..dd96571 100644 --- a/Ansible/ansible_collections/jfrog/platform/galaxy.yml +++ b/Ansible/ansible_collections/jfrog/platform/galaxy.yml @@ -9,7 +9,7 @@ namespace: "jfrog" name: "platform" # The version of the collection. Must be compatible with semantic versioning -version: "7.18.6" +version: "7.19.4" # The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: "README.md" @@ -23,7 +23,7 @@ authors: ### OPTIONAL but strongly recommended # A short summary description of the collection -description: "This collection provides roles for installing JFrog Platform which includes Artifactory, Distribution, Mission-control and Xray. Additionally, it provides optional SSL and Postgresql roles if these are needed for your deployment." +description: "This collection provides roles for installing JFrog Platform which includes Artifactory, Distribution, Missioncontrol and Xray. Additionally, it provides optional SSL and Postgresql roles if these are needed for your deployment." # Either a single license or a list of licenses for content inside of a collection. Ansible Galaxy currently only # accepts L(SPDX,https://spdx.org/licenses/) licenses. This key is mutually exclusive with 'license_file' diff --git a/Ansible/ansible_collections/jfrog/platform/group_vars/all/package_version.yml b/Ansible/ansible_collections/jfrog/platform/group_vars/all/package_version.yml deleted file mode 100644 index 473c62f..0000000 --- a/Ansible/ansible_collections/jfrog/platform/group_vars/all/package_version.yml +++ /dev/null @@ -1,8 +0,0 @@ -# The version of products to install -artifactory_version: 7.18.6 -xray_version: 3.24.2 -distribution_version: 2.7.1 -missioncontrol_version: 4.7.3 - -# platform collection version -platform_collection_version: 7.18.6 diff --git a/Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.18.6.tar.gz b/Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.18.6.tar.gz deleted file mode 100644 index 401e06fab25522047ac59ac329869889ed49639b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56595 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 z z*TPW^m^Z`iVLu4^lmP);;VJ1@{3T@~V4Oql@>*f!vi_QC%h76ry)n zvI^5FHwh5AP}4;|tp{@zm__)a|0T?|q+loTuKPS6RP&u7n$qX?EAuiBO^Wnh(%TAm z$Eqa@4x*>!{x*#G;5#OK%exw3AJ%Ew@kPD8=mA@fV8+~!42pZESqFXvx58445!=(l z&jIsY@ERVB7z(M%v9l)cG-F$BxPOjPJ$FY}u1TkPyq{rV|2e{~Fdh8iA3`p{mk<@6 z+LJ;nXiKye#&``J?k0~2`dg?PxEXa4tR7r}^=RCfCH_jofwG zTz~3a`$2Fx(?yXGpZ(Iqf`0!0EU%u%Z;+SvlW1 zK?dW$CciGvvNdigQ+i*!GPg{KU=##rWgRW}dwjjOcNDf4^zF_JM$D*7Sm4Qjem|hgxzc9m(Z)o*H($tWawvFlX1VDFz2ml{ zqPJmMhv)T~Q=I`?M(j|UG;1lj*={W;v~3A8Q(Vw@1Me*rV7^(){k ze6`#QocXTntpUwzZy<^>D0nxsr#ib2>F6BRdpR(%nYZNb-JNQ#;$1}E=aE>FUQ~VQ z3;x{Ttl+hv${6Kl!Z}iE_#tMTJ$?Z$xrRJ@9-IRx9i_N)UPfv*|o7E3tm_3zdAei=kewH2_z5~Wpc zXE~j_b<7+PjMjExI~iQMJNwn9Mo$w%ml2fC_nDB^#S^aA~EYj2pXQ9$c6g;N~hJPE)U z+hzkhyte>mCIIs6Zhi}zbo`fKum6XpNDA^vAx;0f3OGIHp@&M!!H{=lFkq==UkM`{ zj*kGldo^J%Z!(IH*8P#;UO<&_o4AA;WXNVHEWtxoWsf$Kj?2i;&_dle<_NQ)X;S&p zP8o57MvhTne1Zs*d>cc!BlrwA6LgB!gJ6sEWTq?82-!H({(6m@oJWSkMTEAU5Nn3= zV8y!6lxvP+4%6Ho?Ejxm-==1hm*y;69|`k^Lj?x;ROAMqBc7oH>-S=nS!d%Qs(kX# z?4-y4)c=Oe>Xl*qvj#W$O_&xNk0@t>hhQT=-QES{p;H^$dIr4g z_a6CIp~Li4-vIx=A!7C5MNAILwWfCu=pRDC+E8QQXxi-wW&9$FkFixKSIGM^>FDnn zSeo42MS1o)4y~ml1S#q_hW7AR3ahKh25pICa^JFldR@hHMjVC0!t7tq5Ukqlgy`^( zE{S~EaKBv@d$hEMp1nrB^B-R9F~JWoc5ViSh2nX1yUddfI=SFppht5^hejg?-`Fbx zcU_;)-sKlYFpJ4NTjeZX?v$SvN3L>17xPl2@!e=F+Met8GQ|N}o^L+&#Cng)t~q1< z*#BIQJ;IVd|IMH=C#P;^%;`d*l!xh@ zA1i$o4D1d{Ja_)|x34?MoBXaJJ{&_KQ}td3clISn9|ESY0on-)HjyBpd(zH(U|j>^ z{BhH(9lA9IIImQ71C9S9uJHg&n;9pVEiY(qrARR9c~G{#{d0Z@-q+WEH1LdQw^SA* zU;nv%GDwY5MT_~`fl^>GBhA`EMT7QzNfj*9-50z?1+iqtYWY-a^BdcP?Vc!qloj1C zg;(=eBOCxrGCcc5n5eX@!-8px@%NesfFBWWiN6} z9kgVHB_R&wE`}9E{a%S2ZEhcFJl0xca$O>Hms4Dv>c4R_d~!|tb8`1N=vD6=9i7yH z&5&mq{>g7ptbco{3)4Mc%{|9-LT|(!)MA8C=45>lH}o9HOaQLI8ja*aKFX&WY8+s~ zs>;#pDCl7fG>NHgYTRKM5~4^DDnHHQa?2G`;)bVLEFU=q>hO+_gY(a-XZ%1aWPdQtb?= z%q)5w>l@8%d?{>iy-niYs>^Td`NStHJT;&Nx+Ztr706C7Ci@WqujNzoUeG_yy4Jke zXSGsbSwRxrrc8tXI?N2N3VVgU3;PV0tM;2bG{EFR^crso{GpbZi{9rQTBnx17x>TzpikZDrQnXTGuzOTxV(S_kY$&xb{e zoe=|zP0qbVEsWa6T>j9A2G1PEeCF?+@AY^}Z@<>Yo8u-@F4C*cbBbm6ow*^_3*ctQ?CYhaNBt@F>U>=O4}k`q zodbGr`5>~|X27`|vQ@?;pyRe1Bt3o(771s9-|a z`{Ore4UUDFx0QYNAu{Bo)v1=)s>Tj2|6(gl+{btsMgpAQyTkQ`nHZaQE=Co+Rl3Q9 zyeSrg@zs6qjZ}d~N@`Y&8%7$AgS(F8C6^9C-kZ!_Lalo11rw#V8veKAKG1_wj0*}xqS^=>_daO&7k9EsBgX?%|8RyV< zR^fB5*rW(<`|LSq9O_RX#Jl!k(2;lnzz}u~{0KErq0DLY`nA2&06qNG-1!LZnPXpYVJqK^9DFXsq0oeoNGT6hG z<j`~&(iNyXPE7pnd^psDFJiMP)8{WOv86813Y*}+|IJPUNMxR5LO~9A z-XKjH*5%0x(fT5cZQp37zJ?mCH@{z!CVw8Q=MnY)V}q6tdWZgDWS}kLrnlo2@?i-O z+5}KuB+veD{Re?|`{u{q4I^l;InouvL%yZI{WXxcwi-k+3C$kz<~`|3%qJ83*p65c z{aFLNhy`jqd7AmsUP~`1P^OutW190wFD@s@Quy~oK5XM&fXZ7w>*vR+JEiIdgNy>u z;nSvu-|6e)7!H=&?_RRXh2yFzBY})E+%&Oiy53obA<44rGm z-U89N7J;2%YSf=L%u|1iiuLW)uA#Xo3*h=+Gnf&1pl1Mu`OiI#L=Jx6pj#~D*s+WG#86sg=xHsK6{?sT>uVckDGShyTfRTGDYUB#VXt#a2$}#w|;JT7u8XyMOkDY z+k$*5(%)f;h%ksAhk@?CNzvH1S-{voUxH!-^a|NIgafXkdY-x-SLXaDF;p=$Qmzg5 zr#8l4;?w4Fz|k;@$a_tg@WiHBcc1)63W~-*B@2lz-YlBL>CIS!+(hE8H=_srRuOM) zxpeqboMUyaExgvalC+*T0y>yz`te} zH%{Ar2v80Wpo=6SxaHO6k{T#_tnQF;WB27T@c5&pTKffG^BVq;H?FuD@UjK2Jzo=B z9=4F`f%VT16sTQGFP+^FTM2wHY#qQ_!}2BYu=?67mIG<+*YEJIkEi~4AoDPPaE>oo zf{Oq`)Ck^PK3cB0w zhkxx)|E7x9FmK>CU+mn)Mj?DfzUp+_Gv{IyOIs7XEMR1pYjyNVG@d{qA+MWX^}Y1= zQ7z_~lGVo*DqSwqUpSJ57ps(A=P8bgCg$~FF<~DBIKJk8{fLBKj^e}Yhfn5&TAV{s z$kS_KQ*Ke6oU3DQiN=!X4EYy+g7|=5%ld!G?BO)1Q}NA300MGlan=Id&v^kb(lU^m zu=^#&Sp_5Jdzverl85ZjF%Q=Vy-z9SbMSiw`flu&LzMp@UH{r)l2eB}i)oR&GRj{Y z)FKt)*(S^5i=yGts%BinAJ+KQd2jRPMf1z9dBq=fcF^WFv!EQELG>D#ZUUHyXZSQ- z(XK;-mmv^_AVbk?$0zEg*<^jp*V! zy{9As*=a&Q1+~#FzD*rR!t`XKvI>3H(Wm^~Gwgn%SIsl!>}E(*BX<%YojBJPCvgUu zUoDFRVI3|S)cUVno75;IS2TxkQ-v=!m$;Tox?LsZ2>osEY`p;y9+{Q`=av27g#3Kr zmqW%SL(1Zc?<1Iqa)}gdt?XrdyY8WS2dpK@>{cCr>$1~?_$>=J2k&o61<@XVe z&~JSmQyx0R{uR8jV#}RY`QKhQHae`b`Zb8ie{km8t#7h$SGBn<+1K-$ahPN25VxST zqIdK-dVL=z+{%_~gcJOk$;sD{bFtu%qY}2;sthp{&c!8zSjVUNDd36g$WFgN+@8^oQ!h#|qX9eg3hGvBi&tB-Xph8zo{JRfqZma=H#d8 zs+R1T-wJhqC{76Pks8!e4hDz7>+Gl?btQ9cXH1);k*ph$%r^D?VKtanjG8w^*lFui zD#+*ie>A;gcpcyOJ{;S&ZQDs>wNVkwr#7i)wCx@!^XC4o@AbUzQ6zTX6D6Q zGqbOKt-aQ|@1>*h{l7BogTuQ2=H8*u%LM{Na&~Xk=2fz765yRLeI&XDx7W@L0&Q>q zg)AZfA44A~$a{_s`7eM|3^?n2w}+nenkN7Nm0zgXpWOt#ei72DZ1Fj`;X0f1#$GWG ziazC%vMkL1zncBNQ{{^71xY#062!FS18X^EgZH>cfi%XPQOvDOJ?j*aaBR=BgDC=m znB510)N-1I!7j&~@@Nd&o8H9&V=ls($g9f86tX=FvdF)Yd3(G0uFmq6OcRD}*IcS{ z-tLNHiX!a?0bAR_JcQS&6Nn5nB`YBzXge-^=+0bzyw!hx{`kM3=|B6iSC-wb6>gLL zPvzD>=8cBS6>!mvg*U~$2~lHq+z2rA!gm z{2yjg0Ef49(qtg}8q6h#^!4UK;4g46q=1=E_AqF>a00A8PPROLpU9l~3t(P#@TQ9j zvNrwy82jwPQW`Orb3*a#YYoTZt9yMtyzt}sjH`@@4nwp=({sf%nQ9oK=1I4{h4_1T z%YY`Cs1M-CVz;J2IGhS$Qdk}wZFG5Bv zgxG{mBW2)TIcE%q8P&t4x>Y~(^!9QgnjKxJ>?Gx1ojYORJO8`w@E~mZvfw&?K{Dji z6vp$u%_L-|{1Wf>>0{Wh01J$ebw4|iGvE8A=sL>WgycG~*V7}l*Yh~)^#He*mkT7p z_i5bqlaUY%#dfK9g<{7PtL|y zKC}BO+QPaweAtl^s!L^o%r~&d&8f3wWN-D`xC&j>yQ&X{r%p{gALYA>D}~JFpFiAR zB)-0ibe~{6y&}cfp{J5P;a&@tdYt-+Jm=q=7qRx6wGN!b_0 zScq}I)!!LTup7dM7Q3N6tPwuCfX%;QI0Ibu28g%!Fy176|+Bs_j!N@M|aymlvR3v zs$GdgXD{j4aZ`%ea?o3+lrzg*%9d0!$GopcCJ>&Wxuzv*$llI25!PTfB`W&nTQ*_4 zT(E4>G4aZ(?yE~-s+lT70DrimlqOd{?7daC33nzULX%9u>sR4pM?@qmVuMu6Z9&24 zx|0w~LSxj)bo(CMKa?2{D&zew+MztfW}Ov*%d5RzL}+Z|pMG0t&ruWea&faa1^UDG zVg;}B@~a7;IX6rhyZ2fm>?8}t4$)+e>jw)}%V)Kkyc$e##X+?#9Ju;+3-n>yMUeqF zO+yOtc}d0P3h}_6B&AW2Lt@nKsfPE&q&nYrQ{Gz9*Xd7V_i&fvYyuGdeE-}Tn+iGksk^H&Z8M+*iR1G?Y8;LuGAb|VwAVg`tj)wbd1Xm_Rg|NPY=HRDRk zQYLz`(T^+meV)rfwReigrnEDRk3din{%Wl6RixsOvx-FVT-AM8`CB|R(zcRa(t1?t z3(+_3eiPL#_KbF+vVl|P%p4lImYEuvD93&2Dp;{7L(xAdpJEzknr%y^^=nU>MpK!W z+i%nkrYO8>F^>nQZm2EQ`6}YKj0X6kOl@GcyDca9i3aE+$KzY>{o%)REwqwsyEB+$ z%h%O97*f7_eKJ$^U{~dc_vY-$39h}d*@T9K{?*hze&pXy%n^G&K1rV}sG*_QPQkfm z;xVwppL{)=Lz}Y^KE|DUP;E%`bl9G)bgzeL)%g)DAz@#r4CUxcU+P(EXLT!XAMeK4 z7s!_E9kS+gs9S*(X(qdtyfZX}X=tpTQW>DsbA7bN(d`xV<=86Z<7)87qVEVJ4s6$Y z0qt0oIqSieF0Vs2_CbuKyD??-3@^2fv9n6rX+2e3zA1U^Sov4-bRWXZ1>oR%Ir~j= zt+$|<+YQOat94)3XgdW@sp-}-LDy1A_#5l5Y-?P#Vbv#W$8sqM-zzkveA=^A6#{+| z8hqkLf>nbDaK#6Orfh6iKkv>F)>jw}C=ulKRMOuaz&G==@`MdNj0mY4pV~QbZ}KFAODIgrPdjA&^H1`zSCjI1BDq z$b44L!OvAcnCMZLgqli^r=Uz8+7J`!<(f*)_0YU&vyjlad6t=U^~%IAc9ET6XvG^j z+T6m?k^RPR(0A>7Ki5}Gs6dJvyq3+YM5WWWViKyI2ZVDYPzf#-9*^lisI|tAFBRW| zuA)T;+pHVC2HHRK?s(-KOg_W=O9|;j7k@eU&{T5aE?>yCpj_+GoHY8bxV$L8%9U?H zi=fPv9qvWH#NumrxJ{PbR)4>-OU?n;>t!%(uG@Lo7P(33v3nay!=xf3gunu7|H$?C zgT#DpofzcRZ`#@Tk%sRq=j9s>`^QMSBWjF8o|O^PiF+p&mV&?MNr($H%rovD9?81g zUJon`X&8xBz9;rq|AM7^%Bm^;_UjY#=G=1GE06NR{ZY1#Q`DbJg-Md~+w#tKyRPRl zA*2H%{s{i)`+_MZNhf3hl-cTmFCz>n@GDD#*+z;tFJK;4N1(}%_P6v#*lN|*HS&YIaIcZ!4~jn!&_HpP!dQLq#VgqV5b z_)oCK@j*dwy)m98Danq0U2xwUphx@>DbNjVGP>Y?m>Lg;&3!yY`bq-1ei?PQ*x?nnZA!PU5zpMZP6u%x_kNcM8gPje)S^A*>lOPx8i?!J0RL@sf%8j zW{sMec3ftdM-l_rwd3bf&P_Wqf?P47 zld6Kn=?)d89+D`IpP%KCUYcG}T}pz!i&se#kW3~&PX55Z0v;PSUK*!!alriB)ulS8 z_iW$7Al9i}?)t$N_;fg#JgR4%M1tYQa?_+dBPZv6KHKpRExlqDEeuA)Jj#6E zo9ic7F*x_zIqoNIaH998qzy{(KR)6jiViP5b$gpl<1X%{s_d5kkjz#=cLVhE{njG0 z462AeOgFq*6!9g{^05X+hVo|M;PZd*ny-vTV^mkn@QUXdNM&TD>`+};Hrjk+7aCk= zL`Ygof`gHTAB4v_simY0@Mc(6sX0goi0KUGGK6h^sx*=Z@u{d?%;0r$*b2sRLH{Ul z&mQKRL)t2XZ(M{~JW~^+L>m$)t_#0d=6Y5O1g-FuqtiPZp4j-oR8;S9{EL94hgnn> z&ZV=2$qe>4WwQH}PLMi}l^BY`-!#+`rGw5mX^1ME8%IbjYK$sQA|hmrjvx^Dd7M)< z+?QXoUPgWj!H5dRGD0dBS|P$hw$)7b1QzWnVB52Nh?MEipCNsE)Y*sp*!OYg;nAmdJ4c^+1KRbI^?q0j4sx~0G zOoV#!2Q&(4{bo9Rwabj4dMffT|3{D-=Yv{~J+H}Xho{^fpSmrl5l(oAb;`LCzETU8 zdQ1G16KNZHg3+A4nOET6TWG^7$jUlVY&Me1{!(2nhv)-RNvH-Xc{l}BKdWKgz%;|N zlX=3ZeE*3MFVZr>OIIe?k^S}F!Ah%(x4Ch=+ko|}ptE}Q zmAlwe@3V>;^`-#DsE&zj;iP(SNldXaZAlGPfqd!7T3hBHXmV zz@4>H#%N#rbwm8qPKB48go8+kb0+G*1xL!)pXS{HW>rm~>RYoYg&De^bU&HD@Y&%J zE{A>Sbd#(2lEPf8WU8t1=gGmZ>yWU*CWE-zU17|HAaaW%HJh{q#gtH7=g_RiL2swD zeWu@?^A8+5Nul^>`$C%UXa+;Du&8(A?!|vqV+SM}Qt^^|`#9}`XKs^f&09hw%PLgywJdT19M1R*r95BERpIq*^l&%M zhnU@_AyDh%Rr`xj!QYX#BDFmiJn$gRV78UNjcbF4?BF;{cgn4iN(bs^)ki}#=(dWd;Mho&u|83mXa6?mN{$! z|7<+Rw-1t$h?xlZ*6mcMwbJ`y{TsiZ=e!rsU?si@vA^KY94)X1Rc?eMyzPMKT!IX~ zvo}goUL|SVV?@z)m^hUP#j3;va?Qkk`WeQO8z(zkS)3W}HOgnpb&b|kg~qTdJ*cYX z#V?P$5=@sY80wV8U4u7)ZAkBZH8xA{{Joy|bnc+S@l@HBZn8)0wiUqGManW1$z{Xz zw>kYGhl=psI=HP9yQv?`2VVrSV$QHKRXDmLhezktmcfemvB(q~@op>2duKznBoe9e z0==pzmBqhkuDZeYt6jIHZ$;MpYi8#kBXZ*`y*_k+X0&oDW8woffk&1TpX_hz&4ohM z?!egr-g=mgUc*nN^PAuKX*;r+%xE^ z4&BZZpIryu8W9GhdFQ7EdF(odPVYNUsZ~ZT$Ap*6QdDQ+4>? z`tTO*`%b4ybyAI}2D2O`KN$EFs#nm`AyqdU@+%CL- zw%J4et}N;Ocy2H^6Pw4)$FC|m*XGlnoKkonZr z<@0}GH-DYKmNhumlpN7*)z}P#nuna?4W$Vtd z2M78z?wA{GDs7Q@24r8FxlVe0fNDC*Kj_zQ?m20j^Ec~zOskqz&@yQ>8d4_ZCI8o4 zYr7TQY5TGKY85A!H&bJPZDLE^;`=;0R3Pv-WN%eaS~ynrb0+(tJhb#peOA9P-gmh3 zp>Qkyy4q-6568fc5RdrGJ#EaZ5{m6o%`bH|!VLc|7O3nT`$$HYPn!sL|fygHnm>hUlUj(x3?a7OSH(bYNZLHR zwb3y&w>y;plV?O7Y(e2PaK%Z3ZsaCD(); zRu|noscMo)J1%St?Mhk-_Op`;MMRNXPOn>-U%EcwAwQ3MqwaHmWj(1I?3TD$RGr_} zLVy0}eZyRj)urV4bTk%-F{VfAYPV%k2(+);d>jzw5MwrLF&q;@!d5Al@(D&DL;JGy z8OkZ;gqlRcu9W2w%j%mqk?OV0S#A~b|%*FIdY;|v1pXWP{Tdi?5Cg@ ze>i=tGCsn3W7M&T=`Z8pMlTK18oYDFk&$K;CTo^yikj6}coN$(KQqQKD!9sR%jpG{ zj|Z#Dsf;3{gm#x_I+hg%M_~r~#of^nR!Ajy-pilLT@Mg7L1PaC*K>I`u4WJ4DSmU6 z`RW@i$L85ykz^pMyY`uAI#&=K5_u)~!|vKv(`_cqU6p(w=00#<^vfwqZ9og<4KDIl ziQ+D!h%d7t?}d@lejVU_YHm5W<8YoaCIf6-%XRSjyQs-P2GV@FoT%st>KA> zbpPgaHz$=apA%@tYEhoS4DS)NXRaV7i8o@iCZ46?)n8>A348yKJ`sN`Wa5Uq!ZO?m>F3=m%}wB~?2o9+X{Fjy`AZU{K2}0OQ&rU-zb!XI z^}Q!fS*Gim|N9Xebc&v_*`S4&G>~_WtMjCavQNVINX#Pk56l!RQsTB%7i<-JKFlBm znwlXkdd51^mcWX`2;T|$OCs#s5LTjZ#so&fu8l9ZH~lBNjk~(|Rgnl`tCMzO#mOD> zGqeKq$O(aE2bEP+rAgW?5|dMxQ#F(M3_eXZk>WqtqX;+!o$;xr(>V?n90o!J%q8qQ zjJoU%HPvwJjxy^xjLC+VdPFYU4Q`3+w7#qS-J!BFsiO{rSEDWB-ngp8Z1g+C6({;( zM8x=&{3opAr{D$bd8WgJKZ0?hGCZnGc=a*JyHpbXH1tkQhnHQy4BE?6%22PR3BHJ~4b%`ehNzAu$xmHoZBdlU&L0$2AaR~-A zd7QM(j*I^-HYO-w_f+tr=yE2 zh!t8qbP8K*B{xB(Epj1~Y7bzB?hg<=S?m~>7 ztD~VJbmxQ*4X#47woL6@rk>acCbtDAxt zi=oVbLR=tgz#W$G=JKyE+8YDc(2Q-;)YraPLFg=~I5}Dex`|t*tfpUbn0kuiDqv6j zcX>0Ve~uM1f@vASeT?9xks#s4@ns$ZJox#T4(4=+ptw9V-a$^INKUMn z*=XygEUphMv9_%Ago@rN(^H=9qLL@*f`fG57<2SV`g9To)Oj&9l`{&IAj#SDHXz}s2#+4Y6T{#ev1vtdZG|X4nJCHX=@7io z>a~4bLYhUmQ5BICPM66GP%~pUMC! z^hSa4MAOqt_pvbPc!z!@o+(9H0X~`KD2wZcIOL5jxHFF&?V`^_vM)76S_7-{Qk+op z65IZ}7oW($1B?z~@slS~R0Vc9#&*#;HfeK61p@ z00^vpj|98g5H)Z29*mkOITgmh)WPSWm?{A6VQca|NyL8RHa`C>AN2MGPBd8v!wPb{ z|Bx!a{I*!7nEhbbP`rmx=+1;j{PHdsj)%Ou?liWG z<+bkjK_@kl>pq5>62-cB93)~32|}b`xD?9IJi}(vUde5jaoYdB%LNTP9un^jj&{&F ziFKZeU9iMBY`UHD+v6s+z*Wwu8;Q1kS`+qiSo%a4p3_|TeB4i-N5~DkN3Mga%e5xn zJX>>6q2Az7e`3fZ;~+G9+s5^Js9jhtv}EggW?E&S+V&^50x{Cy=X(bynY$KR1-h9$ zCTQUyYBRXq_f}brqjH`CD6M7=XW~ix?e=l%@aOE1M=EjvU#;tV-7(5~se<^KyrQpP z{j&wFV&zlD3?ETYWZTuxP1p|b7Zq}68i&RBd;yn|--}$7UpgZ_e+9e{{FQ^!VuF60 zSUZ$KG9N1H=7n`SXej#06JxMNbl-~}dq}TJNSP~6uHrdqWE}nBtd|rss#tHsRMaKc zy=JsjG#BN|L6$!K%7g%TAWqB^oQJ&OTc_%CO4bKT+HEN_%pZY`Z)Iqfb%%*7Ecn6X z^xQK(uaWi=aTPs0a;J$9aT9QxCmZ$)9~^*yNiGaeDYoW>m&R*W9DQ@kmXBb>$xYzdwU1nBul3APK?TA;Qq)Qo5oCgOyW|46O_xE9Do;OL3u zi=)j!AYkVEY|gifMLJc9awZWHOoke!KqY1u>($tzQm=-lw5(!X(-0E#!z^xlFD>18 z|0Mt?=zFev0*8!SpwB;B+We2!J8tXFyD~$D&Wo?otOf_*befS(Zrk4J^M=Np(q_{~&2oG0#H*EK#sQCKcpLsCyvU+;-lI;p%SM->< ztA6?FoBXWYXtCZaMGvJa^4HKUV~0(iKhMZKHhP=$Z9@TM9|i*hei&T~aUDrFL}Emf z*29sG-;`WXvtjTW^hEN%a(Ko`0)-Vv#R%fjJ;`aRbP;`?BW$BV+ON4 z3!=m}F~vp|1^5TFatn!y7bS3~NEg!Wx@Bl*!HjgmoFQn04O%5ye@#5%ko;1p$!}4I z6Mj}3n$aL9qnCe-QjZ(AI@LY>Te3OsWvrQJfIJvP5-2*4*@1cxsWPFZmRq2(q(db~ zPWR(0%r_1p<*+81_gHLmPk6M%6py*{BepJDw{X7Fx2}`!^vO7a=*M~k7ES3WB`v0u zh!3^@w8mqXUC{?I*Mz&x>Mf1S&mICW28V_}$n*Ih94dWW6urnz?mbOovs)}e;CdAv z|9mZ!b4I%*a*Ex^>0aj=!S~$`0m1P0=s(26Ch4clRD0T?RB2 zb_CPh>?%lENQ;mOd&zuE({O^ypv?3DVepZPQpx@(f`grenl>#KNhHVg@0!X@c0oip z5NDPuD-?m0sG7P!gKbeht?J=xVgw8?RAl7i?Ri0@E4E->OFG`LY;{Ql( zB);wR3)L!fo~^!%P9iuYJhq4TL4TVBqm5Z=AV2_J=@^e}Y^h}sx*Z%pHrdm_~{)q)nEkGgxVrK=Ke=tA%fw(?LUe} zx4dhtZifee=0U?SYSs$@>-4z5w*bt7V~g6{Dt^`g!HU@qcWxav!j<6f=J1#oPDBjD z>52u>eS;Zs;9or#P_24+=@DTPIAy)rP5=JRCwvh^Bi%MgXAFx{xWFjknT?O(d!pJN zyj?&t(v&FoT`VptOn~0ppGWsXck~(h3^RYDTKwZsg_`CYs*%HIxIkpwBNJJ4CdfSu zwSR!#uj=;(9p9$B23jTqYALz``>xCgO%a=e;loM0`kTrG{Vb33ESPxW`qn?%$mwO& zF6#1cvGTRh(lrBVGBWn%pEoNruiLoQQd*}3mK)eEpX9%Anb)Bl@#`JzdNLOU0sVP* zn~Gal7_?;JgZzg)C9t`>8BanDiB8>FAe;@RJonm+p{gyRvMJ9=8}{ zaT;t=y54M})wkhS#43;G;8)^z3deh?Cf@Z7E5S%=(3@#hZ2ubr_0_ToS_650F>mjF z4%CCe4%1nM!sPl)^87C~vaB>lTJz6gKR?}`VI8b3Anq^pz%zYY#2LR`mSU*-Tyv@| z{`19wpku~%fn~r%Kz9CkgH0NmF)Exsw_ui%fbS+86(f^w`+Fi4>o7pP3y4hu1d-EQ zP6<%w1_vNfI`XHi)$bYypyEs+SMRstEhOAs&g|x zf3Ui_Xjb>4)J?RvFtvq3U>t!XoF&S-j~K*E*t8ld-tsYjrVE~mdmXwWBzWEOhMG#v1^Q6ZCYp)#H1hc*_z7#xW$!kEH60}Wmo)q?=ud0A`_@AK z=7z`6S?tGM*c30WZt)A{H(UuYkh%E=N`8^_-+Hr3`lrYv6m)U?ss5OBU*0`rxZuujUJRPIzp#7B&E|Oo200Ja-71Pk~Z9Xf|4pNe`Pq6 zL}Z-0`G&a*mYjM8Nxz{EeBZL}hWeBLLMdO;zn&_3ypjW?Ux5;!kRHJS0O~y8a|u%A z%Q0SrdIf7hzF+Nczl;Jj|K8X4DES$<2mz84p#ZQQ=JU7jFf)z@4v5g{$rf0VK&)2Tn7u|DVpB_vwuMkSJ zOEckP12S*47kN3qUwF_=-?`@UJ}uJ3^AA&nAPo52F8<*mO9FTG(BUDfo1Q@S+n&e( z=6r(bbD4$b^K)}o16$8=(iClUaB>TjYbtwb>FBEMjU^g3t(I z2h`paI1jq^uhuX_*?FfJ%4h&WCl@vsT`Nsu6q{nDmp_exsNzQ8Ek6;=oQ&%|{LCKM zSc9a~SB}e<7V*!{%yn-efsjWA!_#!2NTQ^yI&2;9VX{1@MgZdV0-8aX@E{(%JsVyQ zggE%YcD0wJu;b@XBMIw8xF3ZBRq65l$o3&xQIck4?P4qx%N(hklzmFFMo=Pu<~<;v zyf8M)>$jF^Kl|+xfSs@%D_V)Vy3!0<_<0C;u0rUbtU4%P>dVtz2Q=Szx#Lp&xQ z1(8+mq3=qfq38bA*pu9{rUIV0cO@s(FQ>f>aA3r>V0QUFRBC-$!zm$UMhN|Mr{V`; z@35E@hPxe%ZhT->wK7q`bPG%NZvMKLek;PGwwIXKvl8y(aj2j=`EC1)BM{s-N=)sn&6ozd(uC1QH{6y93bH>wHx`5F1+IAS6G+Z|Nq z1)3)VbAV~cDGLAodxA)lladr6(%!l*Q+ilK-p5ZiV5W2GBR2gJLd9K-f?z}^Y$uE= z+!3-YJfjUp9FfKSg~&q+oJn#5sQnl*7;J7)YAXVa&F%V*uev)ijl+JisMX{2}s{+Sv z?m)dIg)1EXC>>}YAKDveA8Sh^LhQYgvVS&5fCj2jDvqunD)=FCUZcMa($eYVU%H$qz@V=`HX-1~w~b!_ah5tA49up%I*>qKV)zOHPXU}{k??Qtb_Mgj#AXZB4TJC` zxz7CtQoFwxflzL`3+(}i0f0~TWQyM7nIqf}d(BViu9()E?fQR-ms6?(9E<}cxsD9K zZKv-_inZiCffDIN>8wXLY7@HW@X(0qU#@B^0mrP}WW;~-ih-4NJD_#mL3X!88g4-T_g^IA>{LM+Bn^O2qP@!;$Nlvo+ zIZLt&$toG-J$5<4QrU(XQQi-uob6h~n1t!FEHPNjYO=ej8>&ns$lO=fOemU`V%W=n zy%pzcjc+h**rkl(tl&qg!aHtc>;q`1d3Ma<5vWu>2U5DAlV-{8(t$^*ujD4wHdoj0w@ekWNg{xM-?GOoF-q)=GjysN0yA9Db~> z2Go@{dv|Ab{VXF)Xq~cuc3jO5B%IfmkL<8w|IgO;Za=vfHJx0dFxGE3TFSraX=t~u$Bf$=6vaXZA)RDXWQ)#;j)$xyLKa`hoi1Feq z?;m;HB;m(ei+)ZsZYTK6epXDYy@WwII3%Fbl=nn^K-@zOxRDMEoJytS8LkCh6-Kwn zIlYc()sJSZJW}eZ`#&dBT6FJ^31#a{b+iF^3>4nC*tW) z=x3%Z@;$(SCdrKKUNiB11VB?;8Ackxe7ZJjc#;&P-OXNDWG5aP6FaY9`y5WW?L_oi zqdi#ZnsOo;`-apR5+Lq}C6BqB)#Nt}^FSQ9T@7`GrMP}v=6>E7c!qAFW-QRan!q~r zoKf40+(~cXu=(zrdy#0NM0MkR`ve~eBMN=`Lay_d-_EO&O2bNUH7gz8pN+M#AZUaMhfqYIA@*Pxd>pHLWLpACg5G*br#&<0RtE@kNFAZ@tQ+#i)9ZWZ8(k z8R}&z$YX}PR4iEoS3}rwBT>T0{;=2+$7^e1g)yu|QEYKx!ZNWXJO}T44-wON2F362 zNzH+knIudE>kj?5`=0BzP3@HxEGQAaHQe$)Zt)@=Ptw0>IEK_b-C@hIIz?fn9;r_C z;I1+di$M5pvB>OCEhS-_WX0dvvd(2|d4UBaQW)UhABDDw;;9_LxCauHDi^oDJmD8| zFvEl_mEd(ORXqJ{$$Ys}4aXGH4gf5Jmk1HP>R| z?T>zjA!R6z!cgoGzrv7jPv=uHK<`z@$K+S#r5}YuB=BUj2fb@9v+;GvZh8SeoB1oH z+kZiz-=;FR`0dDWYH)-bb$Yq(=K{`mlN-j;)jx&sEb9DS^&bH0F(|K7VMf4vuN`ee z#?3t%^94VYq|k{KOup7@XdS^xJYCqzOS3AwkSfeOyn(N;pw8wHvZ@T#Hiu;^dPgSS z;}@PG!4(p~YuN7N+p%3JN9F*uk+Mfu<_gS zU6FfWi~Dow;?@qf?-qKzTTU%!T7R9dh4{fqa*%(zU6PpnqsoWzVgk%>fXtVNQZ0&? zagnN@UkB9}%;$K1&q04fx~-b!@9U(+b)&o2-xp5+;I8vsUp72rOkjZc2WG&zu6aQV z$~O=~dD<`a2Kes+fdJsq2N1pj#ca44z;7Q2;F(dXmki8|Z8>&NeqkUR1~&F@h9)(M zF0Ycz?{K%zIsZIsCC)M%YlCQyGzkzR7vHrf(Cu4%1LJ|@;QLsfS0MKs2zGmdfp_wJf2eSGOkbi*TX(_!FOG+GHA8fC%4VM zlAt=(15Qx8p^UR=dO>)|&AX~(VV=dF%{wTt`i5T93u1)fmURLU4*->OK#_+cZXoCd zc=uZzQQ9xafKZH6@CN1^<}G*w9T?)=2IR2b_SSZQwkSZR>6H1EFmeFq=^ffRK?ps@ zF|Ul|mYUJL>}fa51jDnPxk0B&c?RYWdqNbFn<&v@i{g&x3@+k)9Ffr5$p2x=mpq7( zSXx2x)h5}Wp%(ya?%3xUkS_%Ex&iqAVah;YXUkK_7-~cGEj;n;r=AGF*#{&l@bNiLp+tZ>N~=z$>=$edPKPB5u%1UGUv&a zl+vUM5k8(m5)^aO6hd2KQHtA0vn&fY)c4^o9&iTh80)CdoYlIW?h9hqdZOUt$4I}v zb6V|}LUKz~r8V|n_m`|U*|ri7yZC?6))nOJCSVN&lIG;oo)B(vcDgWrUnoI=VqEwdvFFID^EA~so z&ah^B|95p7jcoE}#F>5cJz)W+E5mrWGZbgapv5YFZ~KRqM;23S!lp}bS)Z>gwp^7C zhC$(&yGpJeG-fyyO*ifmpM#A#aaVl;T29N=U$qsX)S66jd177ehiF@2Vy$S3Lp)p9 z`kw{Dg5xzWp^)LDF0N$9C9GFuf`Bh5YsRp4f_)VKb2CrBKxUN&+#mlts69#5*hHS?d|C(!9zd`>Q)C`N#B4!paV z?Y?TbbuNLp{o$DAxM>&HVQ5;dS^b>5NLKR{($uGiarUB-5rr~6BOT})A&NF6G(l^I`L%%(4MfCFwOuSE%XH)Jr!g5F(fW zWbfjjmFq^p>fO_jgodC2?2Skv>viJRQH_-D8B7{(uA6dU23W7}#A^<8ydmMR` zG!cma-f|@t-$o6NhE%($IMZRj=NQ*>c~>zVMYRSOnvPGxjx&4<{aT(w9ZFoM4jqrw zUW-{0zx0cieWY1ts8wGjs9O|60lw3<+BqnhcolfpM!(PBb)$R`g!4bODi;KDedAO{ zyqCN{0uZ0U7hwSBG9ZWZkLpz+0N}KQab4v%j0aG8?N1*eu*dO{aFC5}z7oDqh&&+# z+65iYk`&ybr0aC$Ni2c+Ns4hEi!R}}rKr>&*ElcIsiaZqIHSx1X`ydyhLe;WEt8Zd zJf{&c-O3t%%W z(yj6x@}r2F|32)0@xKKX}3S+N%6$$<@Y+0X&>!df%lY*EZ>@9YzH#& z6gJS?gmmXxA16UsMQb-RyRmJJzdX?to2#o40|o<`=(;bD+^>C(Pfv3 zcs?%yrT#R`-^#jSyFB8Imajt>ddGALjXmFsV;J;_l<@gJ>XuIgAw{9xzgUlaS1?lx z8M(X1QR)+n+DFThX+qey`b8S3hPDjT_RI1c-H5#PGKBJ?bRxJTgSruu%@dVgi~ zcqf&MEwR1XN2VMQ>kO5Dx?!pXCLs!iCh1bUDsx-mP6-#l47e}PwEXHJDJ-hBfOfJq z@9KEABEp2|v5sn2i2ee_hRLr9b(yF@xe68XBAhGZOkNQj4ejeS%lmjQ83HufO8VQ6w^Z^4# zthl%7k07`w@H+0B)#Q~V`6eLP12jZG=A##Z5g&mT9%;!V0NZ5pRWjop^hZz1KIL;N zzzeCtoyn{F>7rPJvxoXd^0#D_LK|S@Rt=rxfwu>cG4Qf>4xrwH*>FuVyI*g}*8mmb zFDNKkwtUR#} z5>)@Tfe0{W$aO79_Uo}%DdVO3x{0)+??zb!V zc$9D+4|xDf8v04h^3m(K9lu^7B0uNa4C6okWxig(&86P3o)$=nuiu**2LrE1Gm;k) zZ#Mwy>-5**PK@90JjS=<`SS2zA7Z;pusM%DC+iSlKM(i?dJn6-JQ*BC^=BvTw0Fsx z{InqV?j%jJNm_<`S>g0@qSHD0un9q1tJx~Kq1C}HO>CK=KV;=p#+^!u*!Il-^LD3q z?LCs6X0D$s3Bb$mmh}X@l^bhMEo(tMY=?<`&v@k(eqDmSR4*q#_q{;i+W zAMlL&pI`N>0??2v4us!)*#``%uQqNTB{QH8wciM12VmbW*d?akIECQ&CC&0Ql<(y&%&CO*O>WD58 zb}j-i(0Je*56WU2v?A)&!mCXGOJ*WYoxragM97%x?r-4x$rZIIL{u~vPUw87?r}F_3Q8OpwmUi5v%Xy4Zb9 zD(w9WL>sLZ89El4@;9g7Yvk5Wv&dviaR6nJ>vj}jtZOV&z zND6p}O>VQ(?B^?5_Q1-_{#x7>zU;?>LdGycnQsS1w-?mqxI|zBgVC_EUa}vaOOXOC?(Xgm#a#;&FYfN{?of)mySs1P zb`JkJ=O#~blZzy?GV`r>zKM;ui$2xuV3l4fZ-aYWU6|SD?0gdS$YI;_iR5M=cktnVjVa~XW}K& zuQUj&dirVzxz;fX8?gaSm4)+o9{>(SN((%D5eCrg3&p|v5&#qgf#8pI>*zyJZ)pj@#VD#1bcJVdMx>2uH1=KC_2aIuQu6+ql3p9O1kibYcD3zUUQOr4JaIiX>8)3EV)>s$+)X6p&GW zo63D}utEx=45uxPC(k32b~jz-(TV?}g-N#@3b{;yso2Pp2zut-EO6Z!qPD#L)u>T~ za@s$;eH!5KJKKQSvsW%bBS?OeU_XRT_}t}p=W-tD@SIYfc+7qz8uG4fze3oJu+U{2 zuSs|cE6qIo&NRO}+$KrVciUkEBr*kESWNWO{eKWYp!wlBCIW;YBK`byAyPlX?%(7M zAwTBbn=~&3I_|risNO~*LJ#5^{k2fc{LJVWDmi8L7ZUwD#hw#|rGT46wl`YVlrEiy z)GIw7N9cqvu{;V_s7a9BJ%)LLp>1tk?XM2%eL@^hn*<4q*v_o@6nP?Bg!4$6!!yOj z`v^7#nMLAAd-J?I~HqBv84lp0a?y(WQ(7ki8d)Cd78JOX0upYvgz&W+QE zyF&OB4MymeAMh90bN+Xky1%=*5*EVUn$vW%*TP7<2wG~zE$ywXEhn>Yr!LEWA%G0O zeb-EHSHz!;D%S#;y8k9~_p#FrA~ZncC%FhiQsfifHm1qdtm4WCOFlqMx(IQCn2Y0)_NoUs$}cT z?F0qWzA(&RKQxBhZmUoV6>v0!`Lzzm4DQfCqcMvz-Vtjp)CVpL)6dmugt%n85TX=f z1_GN!#pa(Dku~)VA}@mcVy{6OtM9J?0k#ZhG`?L<-pFQzA}dC@R~8Xm`c%5r7esz3MNTF9J?!X#(J*sKFi4)St|} zb8P{FkE10(&KQ?j--#mZ_V`ps@aSL|ad$@s*v#w={P1Sdeb%cKVMaM~F#iOqBnOkZ zkt&ep_AXOAy*&>52fd+f$$_2e0H`NSi=a7R@<0eqY@Hz!kk}Vu921=c0V2;1WPm6C zv% zOxw5!AHDKANHZNmf5`@ZF`g-&9N;^p5tK}6D6r-FF)J|zGoj9OJ?`C_*7sNa1GFTz zhFFZH20$?Be0P2z^q-5ok9B{MIC_6n+X@Tx6Aeqe7^NbobzZlraY3@zw-^c=zAgFd z4nTPN6LH~!@^u5<^9;c45dB60<-aZa3SQ*r85Cc)^oLvarVLVG4~lHQdDB@XzyEwsIS#;X?r|MK7XGyZ{rk72dyKV3LbVs&s*d8pKe!|}aE@~)^mDsEB; zKc|CKseq;(vom+)6tPZ;zMk~(BF2L7euWXPn&sI%I{0OUA*yYCz7T~Lri4ylf`bj#0N0OhVnCMLFrI+?ki_KfjtFyE6 zqeA=^BSc;WA$#topE1z>t?ll;NTRmHgz#o>kw|~raNO4zHc~`)IO6*zHO7L|s?Ttv z=&(2$2*&0&3F9qIndB+xv}@!GBF`EH?Sa96=QIAzh)EjxI|8<#0-C)wYz_-qx54EYBupL3_L zCKfs4=~todk)~^z4*zsIV}QQm0~&{^UDcS%)3~LQMHO+Lu1rI$+Co6f6M@TFJB3~$ z7PGf=7T(}Xna1(=pNM@77=#*A`5ePK*v4lWYbL%M+@Kt%efJ==2Jhsoa9k*SQ8EDO z3E)Wq#EeHgwt<_;1OIB9i8^;R)?V^P_6OdfrO7A$>b}*QbF0WrK2MY5Jj; zs46LkI5+HNb=`#pU7z3(ODn>Oh8i#*9_G${=nTweW?{3PTvR{*=`2kJ1PDL{E>#@` zK|HbVLkVDd^t!jA2*7HJ6O479LNQjPPw(M-pH0%p>_86r%T8rWjPSbMW{vLdL^Ebf zGwTj3cuUy-jdh7RRu|AWfNQP^rbyMtgNMQ>fP=*b+KDKf+x+`<6QtOSP8??Rbq6{d-*cBzUcP zR|FiVZB^9?zRzuErHG7>X#YgzCXT<3SiMC7Gf^TpN>04A>hxI(=eUx33UGdg<}81Vnlhf%HoiiNp4 z!5JvN01m2om<|RF5y~`{MPWgt&|v0Ma&%i#ct7HW;2ni*^&eSUpL#^G?qN?uuqgJ! zMCGQMKX>L@^47t1@Od+UaIc&n1^mh^=is(HIlN7=JNH|bp*0h0Go?6WmE%%A2OS>2 zIsMw?ouyX__8BMk^yRFyxkF8IMoy`5c%Ry4{L#NyXG~d##!8D5DLznl#$l9)NX)C5sIhA;--Nf_KXE=YyVz1WbhHPMr9=97na*y-D;Z8ODcRo^2Cd3uyZg zgP#;&-khINLig&0m7-7n|gNB?P3V?LiD1R5B=f(`6nW0ZKEV0kP$$+PfE zNLZhjp0ql#L-b^~ujME1{K;(IWJD}}jv6(xJXHmcGqF7=c{_&Nq`KF0i59bIS7BqN)JOdFCZ2Re>UJ(+9?{a^F<+cUn3y zIM2f}ksNe5P}si}W#-9^ATC4UK2hLPuOvTFJ)=#1?tSYSMq`Hd==s1RcGwT=`nW$W ztZ|&o-w|ALIza_DwuOhuBc`tYUG2rQ-fj`s&V@;&i`-X@4@U6tI46aj7^Vu|SBt9* zepKlNQYo>8$@F!&1vjjZ5hKG~^*1)+EQMKrvmDPSlMT@^Qks|&D#}AdcTey~q>nC+ zlMJvaS-N1CyJo0!>U1)B{U}i+JjAh;kAsm40pT7YJ;%-EK^-#@<_qG>ID0KjD9CP5lBMxY)Q{a{ME zHh~GolrqyFGB@{=0L7zF>xIGz;7Cb?^1r$?8N*PuT6czy$LS$%_rio6I_WnbvW(g- zW{2Tvxp_)IatRvqodW(@1XV}^LE#;2a-%r(v_5vHW$-TzSp?3>@O)$h91?ybmw_2nuZqDG#sS`GOC_HF?zT{uGJ` z!?N~I)T@g^`ZA|4FC3n}ZKX)y`;y?f{Tt?X3Z{YNZ2fRyFxIrczrza)F04upJlhR# zmLxO?aF+o*Q`XP2fX}1A9vk;ZA^QLL;)>%(c6ALfoIqr60~9x!Z;W6QN|I~9;U-Yv z6mBVI{BJibt$hRp$yoXC`pt}e@t_eri-0g(2o*Ri9BcZv9XTSim?cpuN}AASN+IL8 z2a8gv>Ez*PAI^rMoV@CiY$A-Y>u5#=5NLO;>X|b)W zy2|`y1!GIWgQMV6U3inb@my;rU8q5Iif;j0zuclVmjjW_<@&>?T*87(G3_O(k7xo- zj5gztiHi`3Jm;Q2n(+jdzteU@uB#*sbXp^(4HhRb*_NioG3u+!etKoMeIx@D-x+g&ai)GJ;#5zMHyB06OY-SU#j0W*}N z?XIT;wUNE%t|1I^o`0{^uw8!>d#IRE6w3z{#(b_Y7LSodW0-L)5giTys5e zL#{`F4R+UkM6W;Yo!B=*t!-L=ia{^yV3w~vYjubT^@_;Ahb zPdM3z`g!iv*ZQm~1~p!{!xE756tVq&)iuP*9|-$iar$t~%etQ%F7&MVQsk@wR}wPd zd0*ZUi+XFw&v8O*zQqs#S!?vTBlzJqmmW|cnaSMiET?`|M6Cb$`W@ZPnQmP#bN&Zh zwm{zgk%9)Xr*!r-0tsrCbFJ<4fZ?UGwQlqS3D4ZPdxYUeV|c4 zU0)d89KuMHI0xAT@q3j7!|?M$c(6cbE8l!}GxlrNx zlWa_$a}<3(l|(rjWt5AY=?=*s(b9Bh7aUJ)l21vfB9I{Re+aWw*(qQ0Cd#%CVMGp_ zFHwJBsETiY9=#U!sMo%mUGde()?GPL3Pv{Lm{oRecO1p6^0E1wG)BRkHQB7~Zc#0b zqt8=^2pxS~${8~o0Bx6VL47Jac|5FphuGvOmV0U4by})9VfuR1^>dmMmnxUcQzQU( zI#-3YN-?TiERaW3Iqvgvz#2B9}gc z#5}v>bIxao@iDqsmznT%ZJAfaUoVkwu7s%gpg@Gdw*_PVyFaNhhClX5KDbC*t?_pvV@ImPr=SpRICBx{jzVO*VhxT#wNe$c^W2`7 zPgEZ6Q!HT}Yz)<*)>eY+7W_%7Y*TDmwqEUYEw}^3Z00ZxscPqa%=L0tZOYc#7sb2{ z{Y>R_B{Q-uGsC9JU#Au0nOQ0tK*|P)V}*#_HQ_%q5}XLVG)7GONR4zxT-+9-hJ!7< z-zxV6E3jMb+@`oxRH_>PJkJKvr~mykhUz?b>N7sO_LfQbWU%Yb2b(k4rJf!w=N6IM zKIOP5IP;6eJ;SQvb5_dH3VQ%??9T=%p5w|nS|atL_=}XqJ;wo(S}nqI%riSMD5`zmOh zvFjaUuZ^2~7_=aTn~Kx_O_-Ci?$)7sNt$GA>DhAXG&g_#&8Fjs6D}!sKKRATj@omg z{ff0?SfJUoeOy&jGR>%1>s+kzw3}_RcpNmLxNJV(IKSKaoh36ZwxGi|7;k*wz^hKH z$emk|j;7JtbV;pXadMyfy}2vubHu}?KAHl}nwH7x=~2g^tVk4ET96_)A7%x{IV&@L zah!~MaY#Gad~?UTUj_^HzY{O}>2L|cikoH<8S1epRvnPbO#U*m;4-4P|Dx{sql$3@ zk8+zF+W=Q<;y-onU~Y}DF?CCI<#oz9xu&nz)xv7Z2(6vQKj-jNl?75{?guW!on;c! z#VSN5_MugF`ez;aCem)CBg8{E=EPZ&tX&c~vv9Pt)Z0{Ikr&k*=ljP**tn`M+6V%@ zY$zQabg3p#U^8S*6x)|V2UoO9gPK@M2z1T)U}}(Nz{1rA-Qm!xhy!fc6)_$`1^eHaw zZ_A2WJ8vR^o}Kc>0(CKF+2XmTtF{AOG*cGgzeFz`LUUzL!R&B3#wJRab5B2!$M}w? zpkasR)y~SrGz8b447AmgJKyo~J02!30sKSfnN4LT+E*ht_nJgP?Y45Wu&9k}g%y{% z{W9|~OWUTK;&zt(A#u;v@KY?Q1m_z8LWjd9REZ|zF)5xUT33$yV=`Gg89A+(f0c*^ zTn^~?AbNrXKnF{>FndehDg*r@+jk?wzH9P zw`Z$zjBJxkaH2x(c$H@h8BV+1D^e|sWA~kZCKYzGKu!!tE1Qg)l~;rUG}RgvVpLlu z1ZflIV|7Xu*_}DaOTV;Bjz!zMiEQqFkry^J_*MS7oIKtI6)&NdD6fTdrcSl{EY)h| z>9$-}l_i}HJv$nqUujVD#aW@6zZ980+4gX7 zMEfzw<2caYBx)8@(`m!qU3y8|rfu>~B+t95=_w3KOP@*F6tT9HbgA;xh_!0TO;xp; zQ7ElEgk@<7vQ(s92()bCh4h)%7KY2MpE_B4kIO+8jX-X~Pc~zujPJaE!%D(wYKi9g z{D|Y(SLNLCI+;IjP*I`Tur-C!wDTUH+iR<-ORv*GidGo1h|qGXQr1G7G3(2jj92)t z!jG!WCe3VQT4&I;rPX+~4zKF7tepy419n`g<;0+qVg=7p-KOfX3h~G&$a?+vAnsye z*1ohC759YfW1E=^@5UUGYt|l5(GxY>a!oQ)f@Gq)bIgc%|BhX=2?FParuf56pgG52 zX(Pu2@;09GJ^9k5x-pYcrdC}S*qVdskl!SUVPETu`Vsq?c9&m5tA=H{s@zs1?uzKi zp`V}>+PpFw$G-Q)oh~*-zYpYtc^(T#-8|pt3bcM3DP{Qbb#t}gJXo2)vBIk1f0qXf zgvHb28;mk@&*d99)Y0lAcs!RXbK=E`v7$(0A;dYQYVt*`lyMcGleGn^u9DZfznLv> zP-fR(MgO)vrpk)FPkvWrw6UM-p!~4ujdr8vmuXb%N{qcYoVl+Sjk0313AqrRla_0a zGqrHbDY+XLmSMCu2ON z9>?l&U*E|#!-{W35}CVg$5HoWqAYuOKI4r~_JU*Zjxy7jV8YL>X%;RaW-$5{D}V6z zv^IUoMPRH=j)`PTGGsM>R5ijz?cDl%;ZGsfL+rUs?Ph`Sn*_hkZ*dyp`5KKXqBLK| zGW@EO@IzIgvf0iC?j6%va6v&yoX%tHgqu`0Kgx$Fs~oxOCFyj0%l3bD)6pP43szu8 zrW-cgKg-Ty%7s=*>?%=kj8!38S*Ip02xM4}-fMBFYr4Qq99q-J_j6cPJ7}=~;?-G2 zACPw9ox*8&e92W#_%%U4JE3FuO?^vlFGMr1d-iIesClK)tL%=Md4XZaG8!MvVrS3` zSB5e}ln>W@-=iyMNoVghj~(BW5gTMC`Kw-+ z5#QYB7O-BEJJ;MH35V`+rTEEsXnqDV)pNw3`y4QxnW> zRR~1wsRe)5%PK#v_+*w+7u*c~x&0SpW;E zp{^IqvkeGvMQrJm+?EzGDv4@nTO$`Jg%|T&rNXx#B)KZQ>*?@aEn;mSl|9{`ItJp zv?<)|H~tG|_h<3N=8jRaxNL-XQUCIiab>}U==HnEi8kLk+l%_H3?tVWR15EmLqVbL zHV3&1#y+$a?Tm0&^@Mml=83ik#~(^-et9byMT8tii)a-K8-7Ze=8$ZR+Evl>^hXp6 zo>i>5SXobrc+!|-sW`}4^?783N&3x*2Toosgpbr#MV;r5k++E( z);d+%UsZA>?oej9LX{H^i`wx?)n%-6>iGs;nz$0ny*c~}s0oRq6RzN@PJLy@ZI^lV zNNi?&ew?o)wYIZD2Q@V-lhL_g5voOwx*;DVwy>J$h1fMYx|o z8Ga$Wi;_Y26vQ`5_@trVWby7DY@^((is_{brW}wILx~3BQZl|e%0fb)-qk%g-))5 zHqmn{ln&!MKDvYtGV9uuya<1Wo&yb;{?>6Vz25ld^~5qGdS{PC$V^ynR`zEse<3$T zENgO{n@JD0@+8eJe7dw!C(uXW>Z%wqx5&#t5z%h=K5{J8MzWFN zl*$o~=4{^m2faRg_*+ZO1`E7YMChZlnU?OO#;v%+mNsKchp9!H65N`t9k04cyx$aV zL4Fd6d;EZr2WDFh<*HpZ=0u528KE%=MtNdg`Co=zTegXmvT+yZhPA_vQS%vgLL4n4 z6>HQ7&$sN97VeyK?LpNPYWw(sLs1(snw2(k&3E`Bm(dJ$#vp zO%#^b$X~GtXAu84}$Fttd-So;n1%?hO2R?NeIchW@St5I>a-O*-0%MmYH&PST`9(Gca%G9vo;44RzdW zHimspmF3CjMD7WMv*LekZEb(@n1=ji?y`2X5HtRo7G~0>Ux2K&_}z8joJLJ2KJ|53 zAA8QrIr9%_Af1;nS=xqma@n^lJxy+myF=%}e)gF;ZnV^;yNPa5UDgVZuB_M0u)nfc9)Y*`% zVL9uY7q8|EG>&_tt_&&Hh%$MWuQUB@{7gglvIW`-W<&3Ch3r(+2eMkJN*k7(7GYKW z$;`OcJND|ClIkw5J%q9jm3Q-&vdJ4hzwA>J{5DTlcx-bRJlt<{;f!E-hA?JvbDKMuYX3CR#AZ@ar7#64_ap zql|v4T+x;d3M?Lun{~{SOzk$MvWL%}h*Rk-o1I8=X)xfO4R)nV7F+Li*RE^oeHl6J zRI=yUlat>)OFHBhD6dM1a`CD=TMZ8Blhw@U zR+^W~v7`4<2p3iJYFcJo%`kuhvup#Oz*iF6z^+Ro>i;ray@2lr!G-l^5Eav4@n%5z z(c_&CbeIAuIJxhn4NeyTNZ0?5VS1!kNWtyNBK;P9%s`qrchaUytMoS~Q(+0BsQp?< zz3PdkDU{>(&lf=M`x@4R{~dMD&kG>kyPIa!ho$_*4g$dv+G7RQ(X9{G@t+1LV<_y8 zgY)|>IqhL;)yGic6>WH)=4a%kfj`zbUk2=#ptvnS&-?na-fjU&h?I17#D>Mh@)ryf zyVPeN;|;@L5vIRv*EfJpqMV~qhr}Yv#zTXzu2_C<|AD0G4uuLs=Dpz};x+9Jui5D( zhm!X}fkVZ2+_m9#91g&OLlqE$YuE_JOokE$4;mW?!K^zEo1S$XG2?)PzpQ zJkTY^A%5^AANu7DgTr zvy<6w$Uj=zke8g?wbB=FhYz{3=%Z6`I%ZjUPGDDM50EuRIfVV zv(U7ad|up?YP(iAmuT$~Q8){=>A8jvBiw4zhZP&vWy!hkG;J?HJog9oUza+v5L-kJ zBUj|O#q0=95Qps8J-(ez<6_!N*stcO&l1r~BodSw*2G)y&slMxH9Imll@%(_mBpo- zJC}w2**VmOBUCqUNaNPXmRFeU59W?75|>K5Du=PItVsdoif{c6uXIYle3lo`FeS9L z5o2AO&(a*SUGE>s1SjfR91ZYG=&WMEJNzxy4mzb?TN!hys5u|xj1FZ&DylZD|$Y5=Nv ztR0o6@F(U!W?oNRXKYj21*?l%dKXH!t}wl=zNMTJTH9dOtB$lZYSy%>MN&1X+oyPy z*GZ-Rh-}_3S0X9FEZ@{#GWpq|GO};+k9A!gg-NUa{CTw6EZny!;jkBH>ZVE6G)G>H z=>ZaG}7`cD@2TU$6B`*o_ z6UDvhElF7YICQfer`S1>;pHfL;ILb2l|m)mJ4#eT;Zts9BO6^e@Bn+nzfR{ znY>s2@_o~brE%kJlX|#XYy0$r>r5qvK?;{)^|V@GGt7JD)Fp+W#QXVc6MfO6Xh*^b zWh8>1!u{)wV_qf8iwQaZZ)Jvp&1f^iuJ?U$%r9C-)~04&@u|&MkJ6os+Zw^+&D{Fv z{GJ_^Y8{BZ#J2KRRnk!Q>_rsZFq0xh1~nyv@+RU^kK%b8@BAz6a37-T=W9S=4A4xE z5yPtcxEcoJFMys9z#*!*zyjQJLk1o~BL{3mp0~hYRd5M-X$(k2BFg;4+uDcqW7&D* zmi+fCd4^7ucZ8l5D)-mPd%*1B*Xu4>`ikwWiUy}j6;jA3cgBu&HJT&6t{Pld@!;bZ z$#V$-g-iEy&mH$pvhKgP{Z}3$KH*0pTQ@;Zm{UkSdoVXt*`NJ}kalGRSl(hjL&v|$ z@nxJqJDU8MxVf<_!o78|CfOm`F~79f^>voe1u^@FJAeH-((y($dGMF&%4zs>kX+)o z2T}W`h?kdaoT0m7&hS{CaVPFtOlXM|zG!ZZ8|SL^%sqNtXpMhPy^Os$ZNDj?SQ`0C zb*Tq7uxOmRo!QWxJ_Zq5YnD#mk2BWUr)Y=2v+6I?;rN!KGx@b*3>+?IPAEUFNzyS; z=68wf#m-o#j8(RCxXv8lo6K6er27sic!+vS2AV!z{1v<<4i+?q0RNYaX>A*g>s8}0QH42SVK;aqw-Hoyo7hzK-XuAr_Zv;ezb`1(3g^YzreRVMzJ_6nbFs; zNNwwCBdeDGb_*d>p}*~$F$-1g{Ypa{DYqTzWY-4Kk_lFt>Q}NZa*ja@pX3!a&PQ!X z&io3=C=oxZ(t~y0yr`~X!tzKs^F(~`g zWV5;>E-3A}mt^cgynagXc=5l5A^ITVHFe%E9y8PWP~+p7lzx7lTf|{|bzA&;M7a{3 zIjL$gzTlKlf)v^Bv{P@)fTdhprfF~+#cadS|9Fp6fUYsrESp@B<9ygz%za<%XBqA~ zurS06F*#o+ivcfLxpaC;Zr1IctyWXf$1_sfB~>7n{dUKjwKOy3Kmrie7UVQ2^pM6K zWfu_(`o=TB3NiNZ!g0hLF7|L$S50aspPp6fJ(Dk4D;E~aMcm8pI z$QJEHW51Ui_k6e|I4m!~c^ME!g$~4gQ@+c|2bM9Xhra8ilS(}6MS{;$jskGLRDi~{!37}L2gv&`tAGu#-z1(`pvzZjEI)DI z_y>!eyoYTPyCwoDRfQ-ZAaol|X*z4mpMtfD!&!U;4s#a2i}UZ%d$HRw$0C7MnA{}Q zrY3KW2{~a?|5IB}u3~L;j!n^x6y)3b6K!-q7dF1`XQ%bEb;*vr>z;lf2LXKL79&9q zk=PG>eFG5Ux8vI@4vIDYoJ5`dhHI}Q}AK)RKjyg|5oz^O#J~; z=wmfFBaF=aydO@T6A?=bk9+K9{iOkChdYBRaLLj|3^ruxaZmGJ-@T(AK{JuVsf|DD zR!19gFZHuRjX^jtcUJlc=tzB?wKMWMj9T4?s(Ty!1P=oygZll;9R0=3R&45m8eNH| z{wa2MTp-Q@mY|=5<9-0_^?%3KKI<5lVLgaSOvG9b) zw=G7AsO^#UJAu)T@qZ-QGw`s6W~x;25?2JH*djaru7E=*z`wEQr*H$w9|=HquLj&Y zjJ!`tbOKk=u!8qsgFgSJ54{SwpR_C_>ZN{M~u+Ct=_SzR4dBm`$AK8M+m?I#bC zMqINAWt~2v|DJD;#oHEfO#6%Cv;PY58(QsBTDtnLtDerZJ-ud!SMXL8Fc;Ro3t+!# zy!snl`?Fp?;=FAcJ^9;jraxVo?E44LDE9fo01MzPtT$3u*io?i(GGC&8~7Nq$oKB_ zwiLLj0qUuuBnJjICQbd5=5njU{|m({bTH{%nBX9A!48gB^L8QgMbrgJG{j>basHD^^cmgz@ZU#E zKbJ)oU4P&)Js`l*;mKb$40!cD02}Q1FZxL<5YKgdki|>eK%e3cV7KSb@mrgNAda^d zGDU+HVmP@Q!=u|MZBbwX`D9$A2Tm9gerZ~qwnri_crqLA7&EB-(CK?<7A&9UZ=x2( zbl#}i<$78Z#0T1s+XLSF0Nh?+1dw|TsGkc3ypw($U2p)SvnQa<@d3h;FE?9GaBPQm z{f3dJxvVet7wf*{_@%G8>_o_3ege4w&4hRnn_uSduQ01*HXc%iCI}?5t>3LA^T}8o zwkPJ{3G8$3BrUFgb^MF?A$?6S9G(kDTTQn_U(oy}+-_u?MEFAAV|7f?aOk{UO`;AtYg(sJTG*%mc1hURwx#<>u9AAa zmwFa&FsJl9V^4?SHP(&WM*PJsQSsJ#LT;ja!Ov=EYrjr>kVf=lcv0vB)=B`cEPVxp z0Jk*o4@>Wys~$Lda6u4Y4O}6C-NWc1egy$KUVz}~anj?K-hXSFm3jN&!L0CA%rI*D zPtL~~tXrXOgm?UB3{+ug;KverO<5b6zYOvBdSHh+FYr~zXJH?iyWu;{?^eQ-!?UlB z^B&EZ;yH0S-M-+tnuEs!f{`TC<*pu9ilHC^nIJ$pBa@k7oQVZZfNcKe;mhT~azmcw zK2${{YJy$ArD16Ae!EQ7NZPHKp;xaRD4a{NvQJYsnwGPQgMgra;7%ao6Sq~1g*<1h z!cTj(&`wxpcuw|fRe0MV0&0FC5Nisr#*4j0+p?8={#$l?ReQIvMf zrEKJ3VMvzKe-F{n21~blmg{JT#6}77IHEakvGDGiE-iCWAP%GdtrlTf#%!s+ef(

Q?%=;R=mNTVo`lLnfW2%laM89h4-?ozDuYtJp2Le*E;ZR>Fe0E&qP`f&-?H8FS?131+TNBV}N6yyUb)u&8 zTn3~Bo>eqa3O6~1S)95LZ=)rr$KEWHBWPSEkYo^`17CrkdW1Ym_LRQiV=3cY9lb!o5OAK_S2LiZO3DbYwm zf0tN$_w$&L&3?J`*iN(F{TR5n_?2rg&HYAICE^kD&-of=CM6m!&;%=O+u12-n}O3g zCNn?kgpNO`;2>NwZ&^*^%73NRdYgerOLmoH1otyUDQ6VXRQG<{QMmYYYKE;ne+I~aWaE2vC9RByR z@bB{>jG5Q0n9Pa;zFMDunR_Q(Fpi{W^9VD z*BUPnC7aXSGGPnbP(t-Z|HRW(0*?OBU`JL;g@J$s{E@4?F+j?pH1@8%9*` zONWxx3jMcN@Vm-muPdW{=Hf%uZ*eBvzJJ5yeSO@llU4W_Mg-yyB%v-l1KVo+x@k?_BYM?}u{cS@S4Ik6GRsBS!KcI@hza@REDSv^xg&waaAHaDB@TY+vF1^La0C6#ZMYyx}2h#T!*uRwF zwT3tdkOur6u6q`NHAjziwQYkwpfok5HMG_2c`ElD5QB@TE!h{+i35Cm`aeTrd~0eh z#KN3pNkB@#*p{d3-a5SM387n&x`g4adA)i66o#M&RUy~SPu>exkn-7yt%M{kgOZ2D z#pp9!kTXlCu*6Ed58md2gf<*_E-Q-Pgt$oI-c`F9OPN7itBIk!ztz;s;vw! z(y(?9^|@XNohk0|3Q4G@y7mJoe^vV?1phuv6FaiG8Azlms-E-(Esd)LDWYmbDccki zwf~d#SCye%%nor8dqrHreOyW`a>ItSC`Y*@Roy2l_o;yc!F~TVG%0?!)oYQ;pKKg% z*7a4M=UIJs`O|lJ5x%7s&&_)ig_hqDLlt3%U>J1i|B7MJhU_HR->Ox_wV64w#Nnsb z;(k9DhxZ(8p&4uP0mkzbX}`}5`=bIaRmAabb=*=|Jgk|Gw~@2sqh5FH?6U(ypCc&? zKt5BBwh*J=h_Wojh=1t9^cOX!$+C=wD)`wUsQk+@!X@Wiepxkbyr*{2ASS`P7-*Zy zANk?Q4kZ+&-U60W?zsOnx--&Y#N=nF5oM+Zwbl0|NgfXCxW06Py~QO$tc1KRt(E&= zM&a)ShALri3ACdtXTEfIEznuH!D+cZtsz5I0g+MxWwXG>UZ3QNzk3>3L7;LYDPZfFG zKiP397S`vk0*egGv$K+ zZ13>RpoHU?;bYDD|7`2>rY-{LGPwrUk+oi{FM)||A&7vuAfN*ZSa_}R4h9OepM*~7 z9}V~sfDo*shpH_gqtCx+Bc=Q}f4!HYn=UqeRB{)MeC! z=D~U9&Za?BNkcyJdBcfv=>15qKq$42ix<#Ot$c-182d| zb6R;;S$rBZuQwI}onjeBRd;?NmW)Xdg}B43&-Lfx&v{U;o?Ma;V{F01Z*zKVURSFc z%r>V`o82nBOmH4F+`3$^ccB*D-4s3w-aBCrhnw;7IqOse%LRuo1X!ZC;4}9jxljEt zQtj<)BO!+;WmrsLN{HW(Nw)=zoS=#h8T*9J%h1~qV!l4E_JkCkGszjVkG%73>;1-m zL#d`_6S(;D0bi2?_Wd8$3N^#P%STD(z#!EL3{*{Rf_JPGd4BBphXC%_z@vA;%}3U} z$@WH?c785T65#Xq6|Jk_4WNChdGPPJ_Fuj@6V&7XcDarAk$%q5!j{IJY#;4Ye~A<F1l!l{ zfWe!!T-IPjZ+Cp!K`~WMr? zh#vv<*E-KRqa3pdB?-~Z=a9~ed6Lg#7fxn(2FaFKVQe&e+W~nik{~{y@w;*d?6RH? zMN_b3hY!V+b$*2Kl@yYTpo!x)w-g5^>yn?;#nm``9&w@=sd9oU!w!duH8YX>2$x&_ z_GZc5ePT9Wv3qp4XrHcu!r?sM57&bED=S-h=I^QenXEU)!P7Fl#0%cAIw~FE_2fV1 zalw&>UmG4WLMT$OQ?f>_S0Hj^gx2uJzb3xq+^Gc;eTk8H+2dB+<|JPjqJG8=p;jRQ z73S;em(Vdho1^VjSmfR?`ctM8_At*@ zndT>nW@y8~+4?uvPB$-i#HPCPBZ*0uv^4VDTO|(FK%-=8A@U4~G-Od#j@sh);=rM}HF1^$=7mdf(wKHte=Wa9jQi&p>srzZu~9k#tOg8)`_;5Z|tN-xLbfA0dI)_v~4K z{v(uu>}~&=g6xm5Hdy@QGx}~&09>HHZhXj6B>((1UbZ?E!pUxMq9qNrEe@mN$qH4D zl>cJ0O~zR>ZKBgzq!d+(r&vs%M6G2|Nw#=qJ=wK=PG^hH7k;lNZcxRgi=UJT!HSyCrykc#*)k2LE zZ2#E}&3tQe*Y^+j8rMNj5+D5~HcOwgSS%>pDJwADs);@CNXgmZ$CtDwS3W;iq<@>V zFM9XBx4_l-A4``PkNR_J#95@SUH{}~()dtF{A{~H?_#5L^fMAhj&rxhRqpjo zXx@Rw;RHG@+64aA%1sHJg7u~$mLI2@in#Kb2hG=-p2!IO5mA%|FlPk*joBdiVx?h+L<7cGV zSt)1o0IfJru1!v}#>K-Y{*fW==UJn^wt=Nnb+QBYu*!gm?r$4uzWxDs$i4xuZrO|v zziyc}eib=|Q*AWn%o!qe1z~*M(3=k2ufTvTHv#GDZP~JfHvbZUt{NU? zVA|A_c`oq$70rREi?H6+oL_Uwd1Y;L=6PimwmH3hAj#ye;~53_(4*D%TI0bY)6{3X zGNm0n@$i5z&GIMK9>ay9-F|U&HJ(Cs$KU4ahc3SNS48sxn;^r(xZy_y0#`m$;p15G z^j427V;N(23Qy%v6z}yRW%JUaIiyh7FK`gYudz@6e9@PBk!o@w2XU5Cwr5Yh zpixl0$5QQ_UzLb3Ic6OITvc$hD9T`!5&-Ub3Az}c!?(PUz6j%FU&6(u~w zaaJ>LZ%ylr9%IF#OR0_1M5A=exa;Ji#$fFnurg4a#p6@8$xEB?iMMIJT6*P3qDzF{ zm+G_c?fU#bruKxr+yiSzJIh%M?(ryH3x`o6#sv<>_uMTI$g8vkSXY3_#PA}lEqlCH z8VRFzG{)c|PX!Jl4W)X4fs~<@K5FA@RlPUD2G@oEQIA_VP&DT&p!_%fJL(|07#Pmc zEDBKRDqDlNW&kvIq8c!Qsn#+@;=M7Rp;(ItsAy9cSXlPgyNq^MTSSidWiwfyN+#!?bRp_eZq4syQ-1tS_6%kmmii zj_ybOf)D0(Y8->N-3Y);xC|S5FWZcfPb_S4uw>HMJBqJMQ~oG*1+6kAl8jfqZ!7H2 z^y>5$ALuXdlVY*vt(V<+IKUh~{~1LQm9tv zBDeKUkWEqRoG$+Uq>XlPQLgs5)t;%TXb&AoGN$(&6D1~Z{kZ=4rGOR0FEKv=-1G?x zUB9>9GKIa6D9TE{2xgBQelDqV7_%RH@7>R}+^Vcn6Q_;cUE57tlS6Me9Vt2E1tvrV z_X3sgIQuZwc}^MHqR491Bs9;%ix#Ne2F9;pio4Ww04(hqLT`R%@()FT7dkR9@a?;* zXuuK)fC*&6(DDQ4X(D6J_ncJ<92`}=CR@50*5s18hcMN@@~<_wyr^(9ctP>USj=lz&y@1Zx8v2pze#bh zhE=ETNWN&~XUrM#PPYK{a`r}O>`JYszga8S#*1wP-2)p5?ICiWj8HG#L8u&0aN_pPFGzs5Z%e z)5##-FZEIL#RyR^@zqVo?_d$XYZ)p=TtRV8I5Pe;&D2Rmq@3it(|<)}rAaqEcE2QQ zAUvqiiQts~tZI`RZYIN2yg~Bp-l}o1IxFe-)y=h`1h(coEAls#H+rJnqljrke)Y6_ z-jaIM=BaREM!Dbr=oA5UCz$zOrM-#1(QMPFI;ZNQtKU|;LSX~Ob!48I|dAWP`) z2MX){HbHGpgl;Jjg2qh3MWFaw(uq}cL=5=VW^!I4n}^KjptlW|zxWi-gya{bT-Toa zzAgx1X7?5UoUum>)&5ncOVc&XIy+T}CS-q1`KJ%`(WyRJFeHn@ohO@|5*k(5ARf5) z@^|r=FpQaz&TTY%Bvx6=NO%)=H~J2}C4CA0OsrL2pSnvM^Wa<8DU3I{a@myb%}F7@ z?PfFjbV=4qYh$2$uaC<3+T5_VS{S5PzIwNG#-dq?GbY$BD1f<|VA0E(R|{qEQu=FRf@jpS)dY0(-K zX{=b*h)rIuU9P%`w~Asi$Pm_5PuurYZn|N04E06I_cfUTJ-3vCbkS%|B1LA}Oo;{j zy`#?iL1gn$n9}(dotMOqV?;^PwYc;PJy7)BRDHzZWro5D(RX7HNwQJIrfZ(50*1Rr zA%bvP%hjsFvDO9MdcB}&nzt$A!)jy-Qj*GzK0-KkcMKiSBQ#NC5F=u&D3D=lq)}XJK2IG>XaD&m?Ijdn>C&817$Q^8S?*I{(l9r z+8$jn>_`d%E~%#pb0}*<=)88>TQ;@xm@r5MvlO%-EdGgD^yf5Lruk{yRPJ8SEk)j^ z2JBrjk-yC7gu}$FH!7(dxHvo&-$spOdU!EBODjwsFVayEM874O7fbb$h)`3YMEXip z1*fIFzPK57>8qYQ?`TIw<=SLxS1YEPB>1+%ou!sbX`SFP^B`uH?kCtR^xnLd++OmY z#oH?SrO+D|yuWuWzAEcv-3X(fd{C*~kp8f-^S=_GZ?>c=l)stD!Km}ouzKXM#a5HU z>Rd=RT%adXT$IOQchJS{w>@YP(IkA71WfvH)R?T#lExjRr#kK5m?u;mJ^T1Xgnf}f zRWS^*GIYXA&VAr#%Ifq0qvtPrm~bZfNGyS=reanRHKGD9Fr1Cd*1}FB+-eQ8>|`0W zcC_CJ%zV1-QLwgyjJ0|<)zi42Z&zmD-qS~$H} zHI4-4uyAS|>O9)M1XvZh{xD|o9~RmNI-bz-UID9NKo|ctiXQ```;Vc&uYU>n-NnHP zuUb=p`{yG#_$lrQ8e*v>HY*{d&o6(bZ{spJy`tfX{=f0ZbCsJw5j*Gq#2>HD_95Re zR*lyKrn-X6Pc z!keIRN1Uqd@g~KO!pL-ym$@l{aj2aKnQ!NtOQ&{8OI!19D+Ywr9SGAC6*A_`Gg2i= z``9`1s=iM13*J&a!O#xDx5S)IEUI~GSeL8+?1(RSQqA{oSq*(*89CZybpW_}7~~&Y z?=jnkMIsnu$&D3ba&BA84a&F8q-1MuS;nR_14tD|@tF%XtKIAWi9Os|fjvYo#%vvU z&<6+==F4Nz*)4Ub4P0$6uxj%V=ij=358hi-Sv*2k7G=BL#98D6p4hx}hh=?!KWT4< zNWMo`Un|0XEFvnNo2Ww1Zl=nq7wLa@KTK`_x~1o`{PbnN4_YB<8)`Onb2kfnPd$cx zpu{pw=K$>nb~aUHaTK;V-k-6$DZIu|(NfiN?{+(CAYnqi91w|fSd+U;)oJF1gJKFK0Cc( zfbL)Ls&@pL`uCGn9sw=B1i2fqi;m3;aFi`LV{V79ro0kCXi~94$=jQiV9(R zou9Uo-cU2Q5L2>m+K>)M4o9SX+FAa|Jv#+Xe#gG8sB9e$`wbdS2n-2|5ZYB(_IdY# zMf@(iOwde`{_h<6d?YzRTEb)x6ib;hSHf~!f$T_&66O%5LJvF-u`Puw!0APFhE*+m z?F@gs>gYbwjXQ`kSnS;j-Tzg7$FOLE%~ttW=UT_7b44sQ9tdqS`gFK>t`)pm-qCcqh&f&p0%K zQS%ZXov9woSXYAC2unM8tqvGILk<@Mod^3r<>VQB^Zt&=T6;-o>r>3arqTIu(%P#^ zlAYDU>eUC6Xc(91hM<&>mk>b{{Jzuu>v?aMBZh=E!ic5p6jhEGBEFa2* zL9!T=XeCDOWQ)ZKerYOhh|>G@>B+~13W1)iT*>5{4NvdXaQcvLOOX^7Dr|*3mi2Su z8smHOkTuQt(QD4fF?kNwz0A>Vxxb(PBiUkDh$-s9g?N|T{8^~pI$%8js8x?vuK>On z*s{PCa0pW8$4#2dTxopGTNKjz1Ns)#czyQ%S(mvu4>)ClP(6X~FE4V0;7Jk3S4#1} zc=1Z;pH~7GAf@ySRc((smN=p(>I2^= z|3BkqD?(h)!BgC_@8jEm*HgF0f27_%r#N135 zq5qEsz?kthfjZ*znrW*yslmj(vzFCvoBM#jIyMe)@4|OREk}^uVFCYpCT$|4boxhl zZO|Y$iAkfNKY_<&_i}8rBRvH0XL( zQ2c8}9U&3qttl#6%aREygnF>ynvi_rtbgQla`iWs(isGNv&s{jNt}{ZjwSU^U&}n& zJ6jFaJtus@9g-Z``}t4MV293NfwwhH)_k^1(aQkuMzf?ec`NGF6SrX1f-Nge<`h=7 z74v4rpg?(W#oQ~Is>1eHa~NgK=*q|?9{9YjdFInO z`3oa~((uG95gI`?j<4@`{jE+&0*{~}&x*)e4>M@TdrW+q#T8wb(4dRcw5s{mmGuvU ze5yE5d-SH?_LnEm0&b2h=rPZdl}QiNgez}0NigpC?+kGj8!{P8-rciw1fBHx49dqa z$1+Zk#fi2tTGVeA3vh)K2XI+`o9;Ecc&Q+qO zuI{*0l3H&Rh6GqNa9nR6JJ}Dj`AmpNi|6#nT_>O)jrtz(kroJsZfzJY)Ym1)e9V(S ztDhwwzU=@GxE;h4c-O!s@1sYjw~s6#5A{GKQ()iJrm$|$lc2Yk?7c$wsT;C5tsZw$ zmYTjT+>cL@F7ResdB$~E7VEUUZO1f_Of@4!Eh=-XRiSe~rljnda?_2YsVRLUul)#> z1H%zSxm?}+l!MblPsk0QnqJmnE|z>5Rpz4>d5#;yvo2Jk0r4O|4E0r;`diz_wfsY| zu85^)f=;rv^Ou2tzmmSXQM{S#Ly=Ps+H;@w8$t>rG!C8OC)ZgOtp-r*J`&U*$T4S7 zfF?KcG97NSd~wbp@+5b}IhGVn2H2Fw_wy?4mFqRUV@a~WSStUSah0yU_aqNZx_h0# zEZ$8>z_ZRbVcq{>P(x>bTWUMVPWh^I=zc+L*r<0yvORcl<$XjaqcF{iz&EYVID)YB zU}i!#uK>*T5Q7pd|}@27>*T>|WMm{<73PATA@%@=gu6y5$ZklKkby*my6A z%te%Bvp@rXgSOv#_M6C2Hsxq^6`H&&6umC^>?&B@30k16%;dzibj_B8j79h|``CZz zohM3TC8l=tAS~Y}8WBWN!B%56Q9Hx9qr4_lk=;z`m2Vmxu#BwoW{fm2J3nDqDT&u5 z`$sg$xcFmUkXUXGnTiXUK;Ivx@?6L^@hG$x303Kk7o)Eh1gToHvO}$Tlq;nBmBMnl zp(ZJ^+GIcSYJ=~8ylhWG*Ly4p;ouGo;A)Q~2t_w~?^f)XTBsrZS)W*Io zC_HIXispTZ*4N$`jdI-ssl>rOMu1x3HRMHie^EVXNcs^b(`NmK(*k9CpW5A9=y#D?T{OU zoF&aGLBsXFi8Y*$q6)B2)PKDSuCo5VP__bRl8FMXQit^RLQt0sczr$6Q^|(IPH*jt z^8{tj+9Tx!I1sX5r_qJKrviKg!(0ei(FluOr|yOIT?b{qV9?m9+>iyijW-xJao+&t zGT-5n@=9|}Od{Y`4c84vnAI$DG1YQ>?$?;IE>pQ_`}VAfr; z3qc6|RypSKHfDMY+#fEfz<^K#00)e zvi=Qt-x#|34!r9M2ZF87a921CVEh4QDAP04eGe8|yx-)&?lKw2bSY{+uD1SezM_4= zK#uf;7H5i45&}?X(H6D-D?7XV1lxke9GH&#{I;9`oNox&r~W$v{5eO%zGv~57pH3f U{~o92r2uGH)!&g|ij?600NnVF&j0`b diff --git a/Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.19.4.tar.gz b/Ansible/ansible_collections/jfrog/platform/jfrog-platform-7.19.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e05c07d080f2dd1bfa14bf04749526270c903598 GIT binary patch literal 57763 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ⅅ+jiP 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 ToB)qq0m#kBUVKP&7)bvGMox%= literal 0 HcmV?d00001 diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/defaults/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/defaults/main.yml index 853f884..d1fa1bb 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/defaults/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/defaults/main.yml @@ -1,7 +1,8 @@ --- # defaults file for artifactory -# indicates where this collection was downloaded from (galaxy, automation_hub, standalone) -ansible_marketplace: standalone + +# The version of artifactory to install +artifactory_version: 7.19.4 # Set this to true when SSL is enabled (to use artifactory_nginx_ssl role), default to false (implies artifactory uses artifactory_nginx role ) artifactory_nginx_ssl_enabled: false @@ -30,9 +31,6 @@ artifactory_taskAffinity: any # The location where Artifactory should install. jfrog_home_directory: /opt/jfrog -# The location where Artifactory should store data. -artifactory_file_store_dir: /data - # Pick the Artifactory flavour to install, can be also cpp-ce, jcr, pro. artifactory_flavour: pro @@ -42,7 +40,8 @@ artifactory_tar: https://releases.jfrog.io/artifactory/artifactory-pro/org/artif artifactory_home: "{{ jfrog_home_directory }}/artifactory" artifactory_untar_home: "{{ jfrog_home_directory }}/artifactory-{{ artifactory_flavour }}-{{ artifactory_version }}" -postgres_driver_download_url: https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.20/postgresql-42.2.20.jar +postgres_driver_version: 42.2.20 +postgres_driver_download_url: https://repo1.maven.org/maven2/org/postgresql/postgresql/{{ postgres_driver_version }}/postgresql-{{ postgres_driver_version }}.jar artifactory_user: artifactory artifactory_group: artifactory @@ -59,6 +58,7 @@ artifactory_upgrade_only: false artifactory_admin_username: admin artifactory_admin_password: password +artifactory_service_file : /lib/systemd/system/artifactory.service # Provide binarystore XML content below with 2-space indentation artifactory_binarystore: |- @@ -71,6 +71,8 @@ artifactory_binarystore: |- artifactory_systemyaml: |- configVersion: 1 shared: + security: + joinKey: "{{ join_key }}" extraJavaOpts: "{{ artifactory_extra_java_opts }}" node: id: {{ ansible_hostname }} @@ -86,3 +88,6 @@ artifactory_systemyaml: |- router: entrypoints: internalPort: 8046 + +# Note: artifactory_systemyaml_override is by default false, if you want to change default artifactory_systemyaml +artifactory_systemyaml_override: false diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/meta/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/meta/main.yml index e604dfc..76ebd4b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/meta/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/meta/main.yml @@ -1,6 +1,6 @@ galaxy_info: author: "JFrog Maintainers Team " - description: "The artifactory role installs the Artifactory Pro software onto the host. Per the Vars below, it will configure a node as primary or secondary. This role uses secondary roles artifactory_nginx to install nginx." + description: "The artifactory role installs the Artifactory Pro software onto the host." company: JFrog issue_tracker_url: "https://github.com/jfrog/JFrog-Cloud-Installers/issues" diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/install.yml b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/install.yml index ee33f09..cec6fb7 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/install.yml @@ -5,12 +5,16 @@ - name: install nginx include_role: name: artifactory_nginx - when: artifactory_nginx_enabled == true + when: + - artifactory_nginx_enabled | bool + - not artifactory_nginx_ssl_enabled | bool - name: install nginx with SSL include_role: name: artifactory_nginx_ssl - when: artifactory_nginx_ssl_enabled == true + when: + - not artifactory_nginx_enabled | bool + - artifactory_nginx_ssl_enabled | bool - name: Ensure group artifactory exist become: yes @@ -55,7 +59,7 @@ command: "cp -r {{ artifactory_untar_home }}/. {{ artifactory_home }}" when: not app_dir_check.stat.exists -- name: Create required directories +- name: Create required directories become: yes file: path: "{{ item }}" @@ -64,40 +68,37 @@ owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" loop: - - "{{ artifactory_file_store_dir }}" - "{{ artifactory_home }}/var/data" - "{{ artifactory_home }}/var/etc" - "{{ artifactory_home }}/var/etc/security/" - "{{ artifactory_home }}/var/etc/artifactory/info/" +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ artifactory_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ artifactory_system_yaml_template }}" dest: "{{ artifactory_home }}/var/etc/system.yaml" + when: + - artifactory_systemyaml is defined + - artifactory_systemyaml|length > 0 + - artifactory_systemyaml_override or (not systemyaml.stat.exists) notify: restart artifactory - name: Configure master key become: yes copy: dest: "{{ artifactory_home }}/var/etc/security/master.key" - content: | - {{ master_key }} + content: "{{ master_key }}" owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" mode: 0640 -- name: Configure join key - become: yes - copy: - dest: "{{ artifactory_home }}/var/etc/security/join.key" - content: | - {{ join_key }} - owner: "{{ artifactory_user }}" - group: "{{ artifactory_group }}" - mode: 0640 - notify: restart artifactory - - name: Configure installer info become: yes template: @@ -110,6 +111,9 @@ template: src: binarystore.xml.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/binarystore.xml" + when: + - artifactory_binarystore is defined + - artifactory_binarystore|length > 0 notify: restart artifactory - name: Configure single license @@ -117,17 +121,27 @@ template: src: artifactory.lic.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/artifactory.lic" - when: artifactory_single_license is defined + when: + - artifactory_single_license is defined + - artifactory_single_license|length > 0 notify: restart artifactory -- name: Configure HA licenses +- name: Configure HA licenses become: yes template: src: artifactory.cluster.license.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/artifactory.cluster.license" - when: artifactory_licenses is defined + when: + - artifactory_licenses is defined + - artifactory_licenses|length > 0 notify: restart artifactory +- name: Check if database driver exists + become: yes + stat: + path: "{{ artifactory_home }}/app/artifactory/tomcat/lib/jf_postgresql-{{ postgres_driver_version }}.jar" + register: database_driver + - name: Download database driver become: yes get_url: @@ -135,13 +149,17 @@ dest: "{{ artifactory_home }}/var/bootstrap/artifactory/tomcat/lib" owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" - when: postgres_driver_download_url is defined + when: + - postgres_driver_download_url is defined + - not database_driver.stat.exists notify: restart artifactory - name: Create artifactory service become: yes shell: "{{ artifactory_home }}/app/bin/installService.sh" - + args: + creates: "{{ artifactory_service_file }}" + - name: Ensure permissions are correct become: yes file: @@ -153,9 +171,10 @@ - name: Restart artifactory meta: flush_handlers -- name : Wait for artifactory to be fully deployed +- name : Wait for artifactory to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/upgrade.yml b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/upgrade.yml index 547c41d..514363b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/upgrade.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/tasks/upgrade.yml @@ -2,18 +2,6 @@ - debug: msg: "Performing upgrade of Artifactory version to : {{ artifactory_version }} " -- name: Stop artifactory - become: yes - systemd: - name: "{{ artifactory_daemon }}" - state: stopped - -- name: Ensure jfrog_home_directory exists - become: yes - file: - path: "{{ jfrog_home_directory }}" - state: directory - - name: Download artifactory for upgrade become: yes unarchive: @@ -28,41 +16,67 @@ until: downloadartifactory is succeeded retries: 3 +- name: Stop artifactory + become: yes + systemd: + name: "{{ artifactory_daemon }}" + state: stopped + when: downloadartifactory.changed + +- name: Ensure jfrog_home_directory exists + become: yes + file: + path: "{{ jfrog_home_directory }}" + state: directory + - name: Delete artifactory app directory become: yes file: path: "{{ artifactory_home }}/app" state: absent + when: downloadartifactory.changed - name: Copy new app to artifactory app become: yes command: "cp -r {{ artifactory_untar_home }}/app/. {{ artifactory_home }}/app" - -- name: Configure join key - become: yes - copy: - dest: "{{ artifactory_home }}/var/etc/security/join.key" - content: | - {{ join_key }} - owner: "{{ artifactory_user }}" - group: "{{ artifactory_group }}" - mode: 0640 - notify: restart artifactory + when: downloadartifactory.changed - name: Configure single license become: yes template: src: artifactory.lic.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/artifactory.lic" - when: artifactory_single_license is defined + when: + - artifactory_single_license is defined + - artifactory_single_license|length > 0 notify: restart artifactory -- name: Configure HA licenses +- name: Configure HA licenses become: yes template: src: artifactory.cluster.license.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/artifactory.cluster.license" - when: artifactory_licenses is defined + when: + - artifactory_licenses is defined + - artifactory_licenses|length > 0 + notify: restart artifactory + +- name: Check if database driver exists + become: yes + stat: + path: "{{ artifactory_home }}/app/artifactory/tomcat/lib/jf_postgresql-{{ postgres_driver_version }}.jar" + register: database_driver + +- name: Download database driver + become: yes + get_url: + url: "{{ postgres_driver_download_url }}" + dest: "{{ artifactory_home }}/var/bootstrap/artifactory/tomcat/lib" + owner: "{{ artifactory_user }}" + group: "{{ artifactory_group }}" + when: + - postgres_driver_download_url is defined + - not database_driver.stat.exists notify: restart artifactory - name: Configure installer info @@ -77,13 +91,26 @@ template: src: binarystore.xml.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/binarystore.xml" + when: + - artifactory_binarystore is defined + - artifactory_binarystore|length > 0 notify: restart artifactory +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ artifactory_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ artifactory_system_yaml_template }}" dest: "{{ artifactory_home }}/var/etc/system.yaml" + when: + - artifactory_systemyaml is defined + - artifactory_systemyaml|length > 0 + - artifactory_systemyaml_override or (not systemyaml.stat.exists) notify: restart artifactory - name: Ensure permissions are correct @@ -97,9 +124,10 @@ - name: Restart artifactory meta: flush_handlers -- name : Wait for artifactory to be fully deployed +- name : Wait for artifactory to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.cluster.license.j2 b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.cluster.license.j2 index 8fa3367..e07edcc 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.cluster.license.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.cluster.license.j2 @@ -1,3 +1 @@ -{% if (artifactory_licenses) and (artifactory_licenses|length > 0) %} -{{ artifactory_licenses }} -{% endif %} +{{ artifactory_licenses }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.lic.j2 b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.lic.j2 index 49fa0ca..2366f39 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.lic.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/artifactory.lic.j2 @@ -1,3 +1 @@ -{% if (artifactory_single_license) and (artifactory_single_license|length > 0) %} -{{ artifactory_single_license }} -{% endif %} +{{ artifactory_single_license }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/binarystore.xml.j2 b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/binarystore.xml.j2 index 50c4625..a1f6621 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/binarystore.xml.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/binarystore.xml.j2 @@ -1,3 +1 @@ -{% if (artifactory_binarystore) and (artifactory_binarystore|length > 0) %} -{{ artifactory_binarystore }} -{% endif %} \ No newline at end of file +{{ artifactory_binarystore }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/system.yaml.j2 b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/system.yaml.j2 index fb8c0ed..5bc476c 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/system.yaml.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/templates/system.yaml.j2 @@ -1,3 +1 @@ -{% if (artifactory_systemyaml) and (artifactory_systemyaml|length > 0) %} -{{ artifactory_systemyaml }} -{% endif %} \ No newline at end of file +{{ artifactory_systemyaml }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/artifactory/vars/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/vars/main.yml new file mode 100644 index 0000000..64c6a7d --- /dev/null +++ b/Ansible/ansible_collections/jfrog/platform/roles/artifactory/vars/main.yml @@ -0,0 +1,6 @@ +--- +# platform collection version +platform_collection_version: 7.19.4 + +# indicates where this collection was downloaded from (galaxy, automation_hub, standalone) +ansible_marketplace: galaxy \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/distribution/defaults/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/distribution/defaults/main.yml index 1fc0c31..aca0d96 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/distribution/defaults/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/distribution/defaults/main.yml @@ -1,7 +1,8 @@ --- # defaults file for distribution -# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) -ansible_marketplace: standalone + +# The version of distribution to install +distribution_version: 2.7.1 # whether to enable HA distribution_ha_enabled: false @@ -21,6 +22,7 @@ distribution_home: "{{ jfrog_home_directory }}/distribution" distribution_install_script_path: "{{ distribution_home }}/app/bin" distribution_thirdparty_path: "{{ distribution_home }}/app/third-party" distribution_archive_service_cmd: "{{ distribution_install_script_path }}/installService.sh" +distribution_service_file: /lib/systemd/system/distribution.service #distribution users and groups distribution_user: distribution @@ -64,3 +66,6 @@ distribution_systemyaml: |- router: entrypoints: internalPort: 8046 + +# Note: distribution_systemyaml_override is by default false, if you want to change default distribution_systemyaml +distribution_systemyaml_override: false diff --git a/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/install.yml b/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/install.yml index 7e6124b..4499cdc 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/install.yml @@ -9,7 +9,7 @@ become: yes when: ansible_os_family == 'Redhat' -- name: Install expect dependency +- name: Install expect dependency apt: name: expect state: present @@ -17,7 +17,7 @@ become: yes when: ansible_os_family == 'Debian' -- name: Ensure group jfdistribution exist +- name: Ensure group distribution exist become: yes group: name: "{{ distribution_group }}" @@ -59,7 +59,7 @@ command: "cp -r {{ distribution_untar_home }}/. {{ distribution_home }}" when: not app_dir_check.stat.exists -- name: Create required directories +- name: Create required directories become: yes file: path: "{{ item }}" @@ -77,8 +77,7 @@ become: yes copy: dest: "{{ distribution_home }}/var/etc/security/master.key" - content: | - {{ master_key }} + content: "{{ master_key }}" owner: "{{ distribution_user }}" group: "{{ distribution_group }}" mode: 0640 @@ -98,10 +97,10 @@ exp_executable_cmd: "./install.sh -u {{ distribution_user }} -g {{ distribution_group }}" exp_dir: "{{ distribution_install_script_path }}" exp_scenarios: "{{ distribution_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ distribution_thirdparty_path }}/yq" + environment: + YQ_PATH: "{{ distribution_thirdparty_path }}/yq" when: install_wrapper_script.stat.exists - name: Configure redis config @@ -111,11 +110,21 @@ dest: "{{ distribution_home }}/var/etc/redis/redis.conf" notify: restart distribution +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ distribution_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ distribution_system_yaml_template }}" dest: "{{ distribution_home }}/var/etc/system.yaml" + when: + - distribution_systemyaml is defined + - distribution_systemyaml|length > 0 + - distribution_systemyaml_override or (not systemyaml.stat.exists) notify: restart distribution - name: Configure installer info @@ -133,7 +142,6 @@ recurse: yes owner: "{{ distribution_user }}" group: "{{ distribution_group }}" - mode: '0755' - name: Install Distribution as a service become: yes @@ -141,15 +149,25 @@ {{ distribution_archive_service_cmd }} args: chdir: "{{ distribution_install_script_path }}" + creates: "{{ distribution_service_file }}" register: check_service_status_result - ignore_errors: yes + +- name: Update distribution permissions + become: yes + file: + path: "{{ distribution_home }}" + state: directory + recurse: yes + owner: "{{ distribution_user }}" + group: "{{ distribution_group }}" - name: Restart distribution meta: flush_handlers -- name : Wait for distribution to be fully deployed +- name : Wait for distribution to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/upgrade.yml b/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/upgrade.yml index 4e83e9e..e71f3c9 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/upgrade.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/distribution/tasks/upgrade.yml @@ -2,12 +2,6 @@ - debug: msg: "Performing upgrade of Distribution version to {{ distribution_version }} " -- name: Stop distribution - become: yes - systemd: - name: "{{ distribution_daemon }}" - state: stopped - - name: Download distribution for upgrade become: yes unarchive: @@ -21,21 +15,31 @@ until: downloaddistribution is succeeded retries: 3 +- name: Stop distribution + become: yes + systemd: + name: "{{ distribution_daemon }}" + state: stopped + when: downloaddistribution.changed + - name: Delete distribution app become: yes file: path: "{{ distribution_home }}/app" state: absent + when: downloaddistribution.changed - name: Copy new app to distribution app become: yes command: "cp -r {{ distribution_untar_home }}/app/. {{ distribution_home }}/app" + when: downloaddistribution.changed - name: Check if install.sh wrapper script exist become: yes stat: path: "{{ distribution_install_script_path }}/install.sh" register: install_wrapper_script + when: downloaddistribution.changed - name: Include interactive installer scripts include_vars: script/archive.yml @@ -46,11 +50,13 @@ exp_executable_cmd: "./install.sh -u {{ distribution_user }} -g {{ distribution_group }}" exp_dir: "{{ distribution_install_script_path }}" exp_scenarios: "{{ distribution_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ distribution_thirdparty_path }}/yq" - when: install_wrapper_script.stat.exists + environment: + YQ_PATH: "{{ distribution_thirdparty_path }}/yq" + when: + - install_wrapper_script.stat.exists + - downloaddistribution.changed - name: Ensure {{ distribution_home }}/var/etc/redis exists become: yes @@ -74,14 +80,24 @@ dest: "{{ distribution_home }}/var/etc/info/installer-info.json" notify: restart distribution +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ distribution_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ distribution_system_yaml_template }}" dest: "{{ distribution_home }}/var/etc/system.yaml" + when: + - distribution_systemyaml is defined + - distribution_systemyaml|length > 0 + - distribution_systemyaml_override or (not systemyaml.stat.exists) notify: restart distribution -- name: Update Distribution base dir owner and group +- name: Update distribution permissions become: yes file: path: "{{ distribution_home }}" @@ -89,23 +105,14 @@ recurse: yes owner: "{{ distribution_user }}" group: "{{ distribution_group }}" - mode: '0755' - -- name: Install Distribution as a service - become: yes - shell: | - {{ distribution_archive_service_cmd }} - args: - chdir: "{{ distribution_install_script_path }}" - register: check_service_status_result - ignore_errors: yes - name: Restart distribution meta: flush_handlers -- name : Wait for distribution to be fully deployed +- name : Wait for distribution to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/distribution/templates/system.yaml.j2 b/Ansible/ansible_collections/jfrog/platform/roles/distribution/templates/system.yaml.j2 index a4cfba4..e2f91f7 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/distribution/templates/system.yaml.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/distribution/templates/system.yaml.j2 @@ -1,3 +1 @@ -{% if (distribution_systemyaml) and (distribution_systemyaml|length > 0) %} -{{ distribution_systemyaml }} -{% endif %} \ No newline at end of file +{{ distribution_systemyaml }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/distribution/vars/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/distribution/vars/main.yml index cd21505..f44ee2c 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/distribution/vars/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/distribution/vars/main.yml @@ -1,2 +1,6 @@ --- +# platform collection version +platform_collection_version: 7.19.4 +# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) +ansible_marketplace: galaxy diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/defaults/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/defaults/main.yml index 22940bd..fd8fbfe 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/defaults/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/defaults/main.yml @@ -1,7 +1,8 @@ --- # defaults file for mc -# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) -ansible_marketplace: standalone + +# The version of missioncontrol to install +missioncontrol_version: 4.7.4 # whether to enable HA mc_ha_enabled: false @@ -12,16 +13,16 @@ mc_ha_node_type : master jfrog_home_directory: /opt/jfrog # The remote mc download file -mc_tar: https://releases.jfrog.io/artifactory/jfrog-mc/linux/{{ missionControl_version }}/jfrog-mc-{{ missionControl_version }}-linux.tar.gz - +mc_tar: https://releases.jfrog.io/artifactory/jfrog-mc/linux/{{ missioncontrol_version }}/jfrog-mc-{{ missioncontrol_version }}-linux.tar.gz #The mc install directory -mc_untar_home: "{{ jfrog_home_directory }}/jfrog-mc-{{ missionControl_version }}-linux" +mc_untar_home: "{{ jfrog_home_directory }}/jfrog-mc-{{ missioncontrol_version }}-linux" mc_home: "{{ jfrog_home_directory }}/mc" mc_install_script_path: "{{ mc_home }}/app/bin" mc_thirdparty_path: "{{ mc_home }}/app/third-party" mc_archive_service_cmd: "{{ mc_install_script_path }}/installService.sh" +mc_service_file : /lib/systemd/system/mc.service #mc users and groups mc_user: jfmc @@ -94,3 +95,6 @@ mc_systemyaml: |- router: entrypoints: internalPort: 8046 + +# Note: mc_systemyaml_override is by default false, if you want to change default mc_systemyaml +mc_systemyaml_override: false diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/meta/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/meta/main.yml index 2a11e72..c70b8e9 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/meta/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/meta/main.yml @@ -1,6 +1,6 @@ galaxy_info: author: "JFrog Maintainers Team " - description: "The missionControl role will install missionControl software onto the host. An Artifactory server and Postgress database is required." + description: "The missioncontrol role will install missioncontrol software onto the host. An Artifactory server and Postgress database is required." company: JFrog issue_tracker_url: "https://github.com/jfrog/JFrog-Cloud-Installers/issues" @@ -10,7 +10,7 @@ galaxy_info: min_ansible_version: 2.9 galaxy_tags: - - missionControl + - missioncontrol - jfrog dependencies: [] \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/install.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/install.yml index 14b2c30..4a8c75b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/install.yml @@ -9,7 +9,7 @@ state: present when: ansible_os_family == 'Redhat' -- name: Install expect dependency +- name: Install expect dependency become: yes apt: name: expect @@ -59,7 +59,7 @@ command: "cp -r {{ mc_untar_home }}/. {{ mc_home }}" when: not app_dir_check.stat.exists -- name: Create required directories +- name: Create required directories become: yes file: path: "{{ item }}" @@ -76,8 +76,7 @@ become: yes copy: dest: "{{ mc_home }}/var/etc/security/master.key" - content: | - {{ master_key }} + content: "{{ master_key }}" owner: "{{ mc_user }}" group: "{{ mc_group }}" mode: 0640 @@ -100,10 +99,10 @@ exp_executable_cmd: "./install.sh -u {{ mc_user }} -g {{ mc_group }}" exp_dir: "{{ mc_install_script_path }}" exp_scenarios: "{{ mc_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ mc_thirdparty_path }}/yq" + environment: + YQ_PATH: "{{ mc_thirdparty_path }}/yq" when: install_wrapper_script.stat.exists - name: Configure installer info @@ -113,11 +112,21 @@ dest: "{{ mc_home }}/var/etc/info/installer-info.json" notify: restart missioncontrol +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ mc_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ mc_system_yaml_template }}" dest: "{{ mc_home }}/var/etc/system.yaml" + when: + - mc_systemyaml is defined + - mc_systemyaml|length > 0 + - mc_systemyaml_override or (not systemyaml.stat.exists) notify: restart missioncontrol - name: Update correct permissions @@ -128,7 +137,6 @@ recurse: yes owner: "{{ mc_user }}" group: "{{ mc_group }}" - mode: '0755' - name: Install mc as a service become: yes @@ -136,15 +144,16 @@ {{ mc_archive_service_cmd }} args: chdir: "{{ mc_install_script_path }}" + creates: "{{ mc_service_file }}" register: check_service_status_result - ignore_errors: yes - name: Restart missioncontrol meta: flush_handlers -- name : Wait for missionControl to be fully deployed +- name : Wait for missionControl to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 - delay: 5 \ No newline at end of file + delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-elasticsearch.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-elasticsearch.yml index 768e508..1ef44b9 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-elasticsearch.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-elasticsearch.yml @@ -16,7 +16,7 @@ shell: /bin/bash state: present -- name: Create required directories +- name: Create required directories become: yes file: path: "{{ item }}" @@ -69,16 +69,15 @@ when: check_elasticsearch_package_result.matched > 0 - name: Ensure /usr/share/elasticsearch exists + become: yes file: path: "{{ mc_es_home }}" state: directory owner: elasticsearch group: elasticsearch - become: yes - name: Extract elasticsearch package become: yes - become_user: elasticsearch ignore_errors: yes unarchive: src: "{{ mc_elasticsearch_package }}" @@ -88,18 +87,21 @@ - --strip-components=1 owner: elasticsearch group: elasticsearch + creates: "{{ mc_es_java_home }}" register: unarchive_result when: check_elasticsearch_package_result.matched > 0 - name: Copy elasticsearch config files to ES_PATH_CONF dir become: yes command: "cp -r {{ mc_es_home }}/config/. {{ mc_es_conf_base }}/" + when: unarchive_result.changed - name: Remove elasticsearch config dir become: yes file: path: "{{ mc_es_home }}/config" state: absent + when: unarchive_result.changed - name: Generate HA elasticsearch.yml template file become: yes @@ -150,7 +152,7 @@ - "{{ mc_es_data_dir }}" - "{{ mc_es_log_dir }}" - "{{ mc_es_home }}" - + - name: Start elasticsearch become: yes become_user: elasticsearch @@ -176,4 +178,4 @@ environment: JAVA_HOME: "{{ mc_es_java_home }}" register: install_searchguard_result - when: check_searchguard_bundle_result.matched == 1 \ No newline at end of file + when: check_searchguard_bundle_result.matched == 1 diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-searchguard.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-searchguard.yml index 54fcaaf..92e206b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-searchguard.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/setup-searchguard.yml @@ -1,31 +1,18 @@ -- name: Copy elasticsearch certificate +- name: Copy elasticsearch cert files become: yes copy: mode: 0600 - src: files/searchguard/localhost.pem - dest: "{{ mc_es_conf_base }}/localhost.pem" - owner: elasticsearch - group: elasticsearch - -- name: Copy elasticsearch private key - become: yes - copy: - mode: 0600 - src: files/searchguard/localhost.key - dest: "{{ mc_es_conf_base }}/localhost.key" - owner: elasticsearch - group: elasticsearch - -- name: Copy searchguard root ca - become: yes - copy: - mode: 0600 - src: files/searchguard/root-ca.pem - dest: "{{ mc_es_conf_base }}/root-ca.pem" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_conf_base }}/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "localhost.pem" + - "localhost.key" + - "root-ca.pem" - name: Find searchguard bundle + become: yes find: paths: "{{ mc_home }}/app/third-party/elasticsearch/" patterns: "^search-guard-.+\\.zip$" @@ -46,50 +33,30 @@ register: install_searchguard_result when: check_searchguard_bundle_result.matched == 1 -- name: Copy searchguard admin certificate +- name: Copy searchguard certificate files become: yes copy: mode: 0600 - src: files/searchguard/sgadmin.pem - dest: "{{ mc_es_searchgaurd_home }}/tools/sgadmin.pem" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_searchgaurd_home }}/tools/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "sgadmin.pem" + - "sgadmin.key" + - "root-ca.pem" -- name: Copy searchguard admin private key +- name: Copy SG roles files become: yes copy: mode: 0600 - src: files/searchguard/sgadmin.key - dest: "{{ mc_es_searchgaurd_home }}/tools/sgadmin.key" - owner: elasticsearch - group: elasticsearch - -- name: Copy searchguard root ca - become: yes - copy: - mode: 0600 - src: files/searchguard/root-ca.pem - dest: "{{ mc_es_searchgaurd_home }}/tools/root-ca.pem" - owner: elasticsearch - group: elasticsearch - -- name: Copy roles template - become: yes - copy: - mode: 0600 - src: files/searchguard/sg_roles.yml - dest: "{{ mc_es_searchgaurd_home }}/sgconfig/sg_roles.yml" - owner: elasticsearch - group: elasticsearch - -- name: Copy roles template - become: yes - copy: - mode: 0600 - src: files/searchguard/sg_roles_mapping.yml - dest: "{{ mc_es_searchgaurd_home }}/sgconfig/sg_roles_mapping.yml" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_searchgaurd_home }}/sgconfig/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "sg_roles.yml" + - "sg_roles_mapping.yml" - name: Check execution bit become: yes @@ -97,4 +64,4 @@ path: "{{ mc_es_searchgaurd_home }}/tools/sgadmin.sh" owner: elasticsearch group: elasticsearch - mode: 0700 + mode: 0700 \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-elasticsearch.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-elasticsearch.yml index 527284e..fd51ce7 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-elasticsearch.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-elasticsearch.yml @@ -65,7 +65,6 @@ - name: Extract elasticsearch package become: yes - become_user: elasticsearch ignore_errors: yes unarchive: src: "{{ mc_elasticsearch_package }}" diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-searchguard.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-searchguard.yml index cde3228..e8f0009 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-searchguard.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade-searchguard.yml @@ -1,58 +1,27 @@ - name: Create elasticsearch config path folder become: yes file: - path: "{{ mc_es_conf_base }}/searchguard" + path: "{{ mc_es_conf_base }}" state: directory mode: 0755 owner: elasticsearch group: elasticsearch -- name: Copy elasticsearch certificate +- name: Copy elasticsearch cert files become: yes copy: mode: 0600 - src: files/searchguard/localhost.pem - dest: "{{ mc_es_conf_base }}/localhost.pem" - owner: elasticsearch - group: elasticsearch - -- name: Copy elasticsearch private key - become: yes - copy: - mode: 0600 - src: files/searchguard/localhost.key - dest: "{{ mc_es_conf_base }}/localhost.key" - owner: elasticsearch - group: elasticsearch - -- name: Copy searchguard admin certificate - become: yes - copy: - mode: 0600 - src: files/searchguard/sgadmin.pem - dest: "{{ mc_es_conf_base }}/searchguard/sgadmin.pem" - owner: elasticsearch - group: elasticsearch - -- name: Copy searchguard admin private key - become: yes - copy: - mode: 0600 - src: files/searchguard/sgadmin.key - dest: "{{ mc_es_conf_base }}/searchguard/sgadmin.key" - owner: elasticsearch - group: elasticsearch - -- name: Copy searchguard root ca - become: yes - copy: - mode: 0600 - src: files/searchguard/root-ca.pem - dest: "{{ mc_es_conf_base }}/root-ca.pem" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_conf_base }}/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "localhost.pem" + - "localhost.key" + - "root-ca.pem" - name: Find searchguard bundle + become: yes find: paths: "{{ mc_home }}/app/third-party/elasticsearch/" patterns: "^search-guard-.+\\.zip$" @@ -66,35 +35,42 @@ ignore_errors: yes shell: | {{ mc_es_script_path }}/elasticsearch-plugin install \ - -b file://{{ check_searchguard_bundle_result.files[0].path }} + -b file://{{ check_searchguard_bundle_result.files[0].path }} environment: JAVA_HOME: "{{ mc_es_java_home }}" ES_PATH_CONF: "{{ mc_es_conf_base }}/" register: install_searchguard_result when: check_searchguard_bundle_result.matched == 1 -- name: Copy roles template +- name: Copy searchguard cert files become: yes copy: mode: 0600 - src: files/searchguard/sg_roles.yml - dest: "{{ mc_es_home }}/plugins/search-guard-7/sgconfig/sg_roles.yml" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_searchgaurd_home }}/tools/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "sgadmin.pem" + - "sgadmin.key" + - "root-ca.pem" -- name: Copy roles template +- name: Copy SG roles files become: yes copy: mode: 0600 - src: files/searchguard/sg_roles_mapping.yml - dest: "{{ mc_es_home }}/plugins/search-guard-7/sgconfig/sg_roles_mapping.yml" + src: "files/searchguard/{{ item }}" + dest: "{{ mc_es_searchgaurd_home }}/sgconfig/{{ item }}" owner: elasticsearch group: elasticsearch + loop: + - "sg_roles.yml" + - "sg_roles_mapping.yml" - name: Check execution bit become: yes file: - path: "{{ mc_es_home }}/plugins/search-guard-7/tools/sgadmin.sh" + path: "{{ mc_es_searchgaurd_home }}/tools/sgadmin.sh" owner: elasticsearch group: elasticsearch mode: 0700 diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade.yml index b988568..28e8a87 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/tasks/upgrade.yml @@ -2,12 +2,6 @@ - debug: msg: "Performing Upgrade of missionControl version - {{ missioncontrol_version }}" -- name: Stop mc service - become: yes - systemd: - name: "{{ mc_daemon }}" - state: stopped - - name: Download mc for upgrade unarchive: src: "{{ mc_tar }}" @@ -21,30 +15,42 @@ until: downloadmc is succeeded retries: 3 +- name: Stop mc service + become: yes + systemd: + name: "{{ mc_daemon }}" + state: stopped + when: downloadmc.changed + - name: Delete current app folder become: yes file: path: "{{ mc_home }}/app" state: absent + when: downloadmc.changed - name: Copy new app to mc app command: "cp -r {{ mc_untar_home }}/app/. {{ mc_home }}/app" become: yes + when: downloadmc.changed - name: Delete untar directory file: path: "{{ mc_untar_home }}" state: absent become: yes + when: downloadmc.changed - name: Upgrade elasticsearch import_tasks: upgrade-elasticsearch.yml + when: downloadmc.changed - name: Check if install.sh wrapper script exist become: yes stat: path: "{{ mc_install_script_path }}/install.sh" register: upgrade_wrapper_script + when: downloadmc.changed - name: Include interactive installer scripts include_vars: script/archive.yml @@ -55,11 +61,13 @@ exp_executable_cmd: "./install.sh -u {{ mc_user }} -g {{ mc_group }}" exp_dir: "{{ mc_install_script_path }}" exp_scenarios: "{{ mc_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ mc_thirdparty_path }}/yq" - when: upgrade_wrapper_script.stat.exists + environment: + YQ_PATH: "{{ mc_thirdparty_path }}/yq" + when: + - upgrade_wrapper_script.stat.exists + - downloadmc.changed - name: Configure installer info become: yes @@ -68,11 +76,21 @@ dest: "{{ mc_home }}/var/etc/info/installer-info.json" notify: restart missioncontrol +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ mc_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml + become: yes template: src: "{{ mc_system_yaml_template }}" dest: "{{ mc_home }}/var/etc/system.yaml" - become: yes + when: + - mc_systemyaml is defined + - mc_systemyaml|length > 0 + - mc_systemyaml_override or (not systemyaml.stat.exists) notify: restart missioncontrol - name: Update correct permissions @@ -83,14 +101,14 @@ recurse: yes owner: "{{ mc_user }}" group: "{{ mc_group }}" - mode: '0755' - name: Restart missioncontrol meta: flush_handlers -- name : Wait for missionControl to be fully deployed +- name : Wait for missionControl to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 - delay: 5 \ No newline at end of file + delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/installer-info.json.j2 b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/installer-info.json.j2 index 5e02d5b..b99ddbe 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/installer-info.json.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/installer-info.json.j2 @@ -1,6 +1,6 @@ {{ ansible_managed | comment }} { - "productId": "Ansible_MissionControl/{{ platform_collection_version }}-{{ missionControl_version }}", + "productId": "Ansible_Missioncontrol/{{ platform_collection_version }}-{{ missioncontrol_version }}", "features": [ { "featureId": "Channel/{{ ansible_marketplace }}" diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/system.yaml.j2 b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/system.yaml.j2 index 5c51aae..09ad5eb 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/system.yaml.j2 +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/templates/system.yaml.j2 @@ -1,3 +1 @@ -{% if (mc_systemyaml) and (mc_systemyaml|length > 0) %} -{{ mc_systemyaml }} -{% endif %} \ No newline at end of file +{{ mc_systemyaml }} \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/vars/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/vars/main.yml index ed97d53..dafb8b2 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/vars/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/missioncontrol/vars/main.yml @@ -1 +1,6 @@ --- +# platform collection version +platform_collection_version: 7.19.4 + +# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) +ansible_marketplace: galaxy \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/Debian.yml b/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/Debian.yml index 948ac74..08f2d3f 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/Debian.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/Debian.yml @@ -12,15 +12,15 @@ - name: add postgres apt key become: yes apt_key: - url: https://www.postgresql.org/media/keys/ACCC4CF8.asc - id: "0x7FCC7D46ACCC4CF8" + url: "{{ postgres_apt_key_url }}" + id: "{{ postgres_apt_key_id }}" validate_certs: no state: present - name: register APT repository become: yes apt_repository: - repo: deb http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-pgdg main + repo: "{{ postgres_apt_repository_repo }}" state: present filename: pgdg diff --git a/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/main.yml index 59612e5..92b4d95 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/postgres/tasks/main.yml @@ -4,7 +4,7 @@ - name: perform installation include_tasks: "{{ ansible_os_family }}.yml" - + - name: Set PostgreSQL environment variables. become: yes template: @@ -96,7 +96,7 @@ become: yes become_user: postgres postgresql_privs: - database: "{{ mc_db_name}}" + database: "{{ mc_db_name }}" privs: ALL type: schema roles: "{{ mc_db_user }}" diff --git a/Ansible/ansible_collections/jfrog/platform/roles/postgres/vars/Debian.yml b/Ansible/ansible_collections/jfrog/platform/roles/postgres/vars/Debian.yml index 122f95f..8c2321d 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/postgres/vars/Debian.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/postgres/vars/Debian.yml @@ -4,3 +4,6 @@ postgresql_bin_path: "/usr/lib/postgresql/{{ postgres_version }}/bin" postgresql_config_path: "/etc/postgresql/{{ postgres_version }}/main" postgresql_daemon: postgresql@{{ postgres_version}}-main postgresql_external_pid_file: "/var/run/postgresql/{{ postgres_version }}-main.pid" +postgres_apt_key_url: "https://www.postgresql.org/media/keys/ACCC4CF8.asc" +postgres_apt_key_id: "0x7FCC7D46ACCC4CF8" +postgres_apt_repository_repo: "deb http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-pgdg main" \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/platform/roles/xray/defaults/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/xray/defaults/main.yml index afafb02..82be97b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/xray/defaults/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/xray/defaults/main.yml @@ -1,7 +1,8 @@ --- # defaults file for xray -# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) -ansible_marketplace: standalone + +# The version of xray to install +xray_version: 3.25.1 # whether to enable HA xray_ha_enabled: false @@ -21,6 +22,7 @@ xray_home: "{{ jfrog_home_directory }}/xray" xray_install_script_path: "{{ xray_home }}/app/bin" xray_thirdparty_path: "{{ xray_home }}/app/third-party" xray_archive_service_cmd: "{{ xray_install_script_path }}/installService.sh" +xray_service_file : /lib/systemd/system/xray.service #xray users and groups xray_user: xray @@ -102,3 +104,6 @@ xray_systemyaml: |- router: entrypoints: internalPort: 8046 + +# Note: xray_systemyaml_override is by default false, if you want to change default xray_systemyaml +xray_systemyaml_override: false diff --git a/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/install.yml b/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/install.yml index d279367..0b48c79 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/install.yml @@ -62,7 +62,7 @@ command: "cp -r {{ xray_untar_home }}/. {{ xray_home }}" when: not app_dir_check.stat.exists -- name: Create required directories +- name: Create required directories become: yes file: path: "{{ item }}" @@ -79,8 +79,7 @@ become: yes copy: dest: "{{ xray_home }}/var/etc/security/master.key" - content: | - {{ master_key }} + content: "{{ master_key }}" owner: "{{ xray_user }}" group: "{{ xray_group }}" mode: 0640 @@ -108,12 +107,11 @@ exp_executable_cmd: "./install.sh -u {{ xray_user }} -g {{ xray_group }}" exp_dir: "{{ xray_install_script_path }}" exp_scenarios: "{{ xray_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ xray_thirdparty_path }}/yq" + environment: + YQ_PATH: "{{ xray_thirdparty_path }}/yq" when: install_wrapper_script.stat.exists - ignore_errors: yes - name: Configure rabbitmq config become: yes @@ -122,11 +120,21 @@ dest: "{{ xray_home }}/app/bin/rabbitmq/rabbitmq.conf" notify: restart xray +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ xray_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ xray_system_yaml_template }}" dest: "{{ xray_home }}/var/etc/system.yaml" + when: + - xray_systemyaml is defined + - xray_systemyaml|length > 0 + - xray_systemyaml_override or (not systemyaml.stat.exists) notify: restart xray - name: Configure installer info @@ -151,15 +159,16 @@ {{ xray_archive_service_cmd }} args: chdir: "{{ xray_install_script_path }}" + creates: "{{ xray_service_file }}" register: check_service_status_result - ignore_errors: yes - name: Restart xray meta: flush_handlers -- name : Wait for xray to be fully deployed +- name : Wait for xray to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/upgrade.yml b/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/upgrade.yml index 3db9b00..3c68a5b 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/upgrade.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/xray/tasks/upgrade.yml @@ -2,12 +2,6 @@ - debug: msg: "Performing upgrade of Xray version to {{ xray_version }}..." -- name: stop xray - become: yes - systemd: - name: "{{ xray_daemon }}" - state: stopped - - name: download xray for upgrade become: yes unarchive: @@ -17,28 +11,40 @@ owner: "{{ xray_user }}" group: "{{ xray_group }}" creates: "{{ xray_untar_home }}" - register: downloadxray until: downloadxray is succeeded retries: 3 +- name: stop xray + become: yes + systemd: + name: "{{ xray_daemon }}" + state: stopped + when: downloadxray.changed + - name: Delete xray app become: yes file: path: "{{ xray_home }}/app" state: absent + when: downloadxray.changed - name: Copy new app to xray app become: yes command: "cp -r {{ xray_untar_home }}/app/. {{ xray_home }}/app" + when: downloadxray.changed - name: Upgrade rabbitmq import_tasks: rabbitmq/upgrade/RedHat.yml - when: ansible_os_family == 'RedHat' + when: + - ansible_os_family == 'RedHat' + - downloadxray.changed - name: Upgrade rabbitmq import_tasks: rabbitmq/upgrade/Debian.yml - when: ansible_os_family == 'Debian' + when: + - ansible_os_family == 'Debian' + - downloadxray.changed - name: Check if install.sh wrapper script exist become: yes @@ -55,25 +61,38 @@ exp_executable_cmd: "./install.sh -u {{ xray_user }} -g {{ xray_group }}" exp_dir: "{{ xray_install_script_path }}" exp_scenarios: "{{ xray_installer_scenario['main'] }}" - args: + args: apply: - environment: - YQ_PATH: "{{ xray_thirdparty_path }}/yq" - when: install_wrapper_script.stat.exists - ignore_errors: yes + environment: + YQ_PATH: "{{ xray_thirdparty_path }}/yq" + when: + - install_wrapper_script.stat.exists + - downloadxray.changed - name: Configure rabbitmq config become: yes template: src: "rabbitmq.conf.j2" dest: "{{ xray_home }}/app/bin/rabbitmq/rabbitmq.conf" + when: + - downloadxray.changed notify: restart xray +- name: Check if systemyaml exists + become: yes + stat: + path: "{{ xray_home }}/var/etc/system.yaml" + register: systemyaml + - name: Configure systemyaml become: yes template: src: "{{ xray_system_yaml_template }}" dest: "{{ xray_home }}/var/etc/system.yaml" + when: + - xray_systemyaml is defined + - xray_systemyaml|length > 0 + - xray_systemyaml_override or (not systemyaml.stat.exists) notify: restart xray - name: configure installer info @@ -92,21 +111,13 @@ group: "{{ xray_group }}" recurse: yes -- name: Install xray as a service - become: yes - shell: | - {{ xray_archive_service_cmd }} - args: - chdir: "{{ xray_install_script_path }}" - register: check_service_status_result - ignore_errors: yes - - name: Restart xray meta: flush_handlers -- name : wait for xray to be fully deployed +- name : wait for xray to be fully deployed uri: url=http://127.0.0.1:8082/router/api/v1/system/health timeout=130 register: result until: result.status == 200 retries: 25 - delay: 5 \ No newline at end of file + delay: 5 + when: not ansible_check_mode diff --git a/Ansible/ansible_collections/jfrog/platform/roles/xray/vars/main.yml b/Ansible/ansible_collections/jfrog/platform/roles/xray/vars/main.yml index 55363e6..dafb8b2 100644 --- a/Ansible/ansible_collections/jfrog/platform/roles/xray/vars/main.yml +++ b/Ansible/ansible_collections/jfrog/platform/roles/xray/vars/main.yml @@ -1,2 +1,6 @@ --- -# vars file for xray \ No newline at end of file +# platform collection version +platform_collection_version: 7.19.4 + +# indicates were this collection was downlaoded from (galaxy, automation_hub, standalone) +ansible_marketplace: galaxy \ No newline at end of file