diff --git a/Ansible/artifactory7/README.md b/Ansible/artifactory7/README.md deleted file mode 100644 index d2cda81..0000000 --- a/Ansible/artifactory7/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# rt7ansible -This repo contains the Ansible collection for JFrog Artifactory Pro 7 roles. These roles allow you to provision Artifactory for High-Availability using a Primary node and multiple Secondary nodes. Additionally, a Postgresql role is provided for installing an Artifactory Postgresql database. - -## Roles Provided -### artifactory -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 and artifactory-java to install nginx and java dependencies. - -### artifactory-nginx-ssl -The artifactory-nginx-ssl role installs and configures nginx for SSL. - -### artifactory-postgres -The artifactory-postgres role will install Postgresql software and configure an artifactory database and user. - -## Vars Required -The following Vars must be configured. - -### all -* ansible_user: The SSH user to access the hosts. eg. "ubuntu" -* ansible_ssh_private_key_file: The SSH key to use. eg. "/Users/jefff/.ssh/jeff-ec2-us-east.pem" -* db_user: The Artifactory database user to configure. eg. "artifactory" -* db_password: The Artifactory database password to configure. "Art1fact0ry" -* server_name: This is the server name. eg. "artifactory.54.175.51.178.xip.io" - -### artifactory -* master_key: This is the Artifactory Master Key. -* join_key: This is the Artifactory Join Key. -* db_download_url: This is the download URL for the JDBC driver for your database. eg. "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" -* db_type: This is the database type. eg. "postgresql" -* db_driver: This is the JDBC driver class. eg. "org.postgresql.Driver" -* db_url: This is the JDBC database url. eg. "jdbc:postgresql://10.0.0.120:5432/artifactory" - -### primary -* artifactory_is_primary: For the primary node this must be set to **true**. -* artifactory_license1 - 5: These are the cluster licenses. - -### secondary -* artifactory_is_primary: For the secondary node(s) this must be set to **false**. - -### SSL Config (Used with artifactory-nginx-ssl role) -* certificate: This is the SSL cert. -* certificate_key: This is the SSL private key. - -### Example Inventory YAML -An example inventory YAM is [here](hosts.yml). - -### Example Playbook -An playbook is [here](rt7provision.yml). - -## Executing a Playbook -``` -ansible-playbook -i hosts.yml rt7provision.yml -``` diff --git a/Ansible/artifactory7/ansible.cfg b/Ansible/artifactory7/ansible.cfg deleted file mode 100644 index fd33dd1..0000000 --- a/Ansible/artifactory7/ansible.cfg +++ /dev/null @@ -1,8 +0,0 @@ -[defaults] -# Installs collections into [current dir]/ansible_collections/namespace/collection_name -collections_paths = ./ - -# Installs roles into [current dir]/roles/namespace.rolename -roles_path = ./jfrog/rt7ansible/roles - -host_key_checking = false \ No newline at end of file diff --git a/Ansible/artifactory7/hosts.yml b/Ansible/artifactory7/hosts.yml deleted file mode 100644 index cb62a86..0000000 --- a/Ansible/artifactory7/hosts.yml +++ /dev/null @@ -1,125 +0,0 @@ ---- -all: - vars: - ansible_user: "ubuntu" - ansible_ssh_private_key_file: "/Users/jefff/.ssh/jeff-ansible-ec2.pem" - db_user: "artifactory" - db_password: "Art1fAct0ry" - children: - database: - hosts: - 100.26.167.170: - artifactory: - vars: - master_key: "c97b862469de0d94fbb7d48130637a5a" - join_key: "9bcca98f375c0728d907cc6ee39d4f02" - db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" - db_type: "postgresql" - db_driver: "org.postgresql.Driver" - db_url: "jdbc:postgresql://10.0.0.160:5432/artifactory" - server_name: "ec2-100-25-104-198.compute-1.amazonaws.com" - certificate: | - -----BEGIN CERTIFICATE----- - MIIF8zCCA9ugAwIBAgIJAK/iP1hhhVNKMA0GCSqGSIb3DQEBCwUAMHUxCzAJBgNV - BAYTAlVTMQswCQYDVQQIDAJXQTEQMA4GA1UEBwwHU2VhdHRsZTESMBAGA1UECgwJ - Q2xvdWRCZWVzMTMwMQYDVQQDDCplYzItMTAwLTI1LTEwNC0xOTguY29tcHV0ZS0x - LmFtYXpvbmF3cy5jb20wHhcNMjAwNDI5MDM1OTIxWhcNMjIwODAyMDM1OTIxWjB1 - MQswCQYDVQQGEwJVUzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQ - BgNVBAoMCUNsb3VkQmVlczEzMDEGA1UEAwwqZWMyLTEwMC0yNS0xMDQtMTk4LmNv - bXB1dGUtMS5hbWF6b25hd3MuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC - CgKCAgEAn92BnDtr7fUbtGF0uPmsk7OWDtyY+ElLvq9Borp10AUtLllXGB4Ap6Xf - HoZy943wi+d+pVf3S/oElnAsRlbEUwOSLSiBzxOef94sVe+f4FX9IhCnMsQQJSSy - QlpLEYzPvLXa6Z3dYgGqHIvJUtrrVeT1s81swZ7Mh7BLIrjg0yMykemiDst1HM+1 - fo0tuNQUO4AUjNNOWcNCLQiIXUIztdTRSEqDmZ8LfTv4IRV4mewE8HdT1PkmF+55 - FIKZZWxL7+jTuRUU4QAEOcxmrK5b69+npVvLPeo8w9swwrqpZM0XG3xpe4Djtw61 - DpASS1iOWmbdYOvMUq+7535UU9aE7cifEgMvtJ1n0BT5JCvYMmSb9QbL5iD6pKfA - PwA/SEA4sH5ppUYB+gMeh7DCMtRO0Ac6BcQ5LxJovrelG4BCpFd9rU/fcIsKxvSC - 4XrNqpK8UDdb3zjS9vBE2cbjqJVj37D2NsNY9NBc+UyNRrfssRZkzcEEqzXFWBrZ - 30YZ9Dwd2h2mtxNn4/L/j3wJDwfLctsWPtv+FJaCZ9j750YWkIA35ry6eq0yifxk - 3dm7mXkize3W3upCFEqjUOmVtaJsKi38dFLgIddEOM+JyRpQEULTZ4V0ZHYAWd9C - 1s+7tinypx3yhOHmLvbKQZZu5oF9BrGYCVqfghTjR1XxLPTV66MCAwEAAaOBhTCB - gjBhBgNVHREEWjBYgiplYzItMTAwLTI1LTEwNC0xOTguY29tcHV0ZS0xLmFtYXpv - bmF3cy5jb22CKmVjMi0xMDAtMjUtMTA0LTE5OC5jb21wdXRlLTEuYW1hem9uYXdz - LmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQEL - BQADggIBAB/qktMXhgiIz68+KxnQFwgx7xsjTzsfG8USfdkBqoj+vFbIkuk6U4t0 - DQZbRzPeK/RxrkYKxVt5TO2bdgpXaV9stud1jd5cDqvb7F8Q9/D56BVHCjJ9AmLM - qH1GUl+4txM+rRP93zpmpY804SZa8CqljF4nP7QqqxbCrkExOAADd9+D0wAKBSMl - kswoG6AK45POYg6a+qZI4qWJv4W5lx1HuDP/e4W7J0FIKiWcUHsgLHWvRa5rEzNW - kofZ3vJ0XXmO7fs9WuB0DllY+Vim25Xjfs+iS4Qa02GF9Bz11e9cv34b6l92levy - O+2ntCsh77+NBRFF74GGyWqqvsjhm6AI3A0i7efXybKeCIEQ1g+/18gDT+OHRrU3 - zqfXIRZmmLAEG9xeWzQiNVZj/QX+6WWjFG4+BkUqrjRqD5b8G64XfmzPXwndMaLR - ZIGbAEWur9128GMyNeq+G1PpDJZOS5iFlqY8Wn0b5g8PaKpCpORSwdLOxdPthSeE - E4a/S1H3FfXGPYRjupkIRBLUF7XEBlU27Q8kzB7UYxJfzw6Pa05Pn3IO8IQtsYyu - Dq9V9Fbw3eE0lSWd+HkeYjA0GiXVXFY0qbJwV0tEgEEboMs0Z+gRykrmD2JN15Mn - e/FHoOCfDqjzeFHCmc+pBWUnibiFE5hIWP4ofAAKg24CMzaqDxLg - -----END CERTIFICATE----- - certificate_key: | - -----BEGIN PRIVATE KEY----- - MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCf3YGcO2vt9Ru0 - YXS4+ayTs5YO3Jj4SUu+r0GiunXQBS0uWVcYHgCnpd8ehnL3jfCL536lV/dL+gSW - cCxGVsRTA5ItKIHPE55/3ixV75/gVf0iEKcyxBAlJLJCWksRjM+8tdrpnd1iAaoc - i8lS2utV5PWzzWzBnsyHsEsiuODTIzKR6aIOy3Ucz7V+jS241BQ7gBSM005Zw0It - CIhdQjO11NFISoOZnwt9O/ghFXiZ7ATwd1PU+SYX7nkUgpllbEvv6NO5FRThAAQ5 - zGasrlvr36elW8s96jzD2zDCuqlkzRcbfGl7gOO3DrUOkBJLWI5aZt1g68xSr7vn - flRT1oTtyJ8SAy+0nWfQFPkkK9gyZJv1BsvmIPqkp8A/AD9IQDiwfmmlRgH6Ax6H - sMIy1E7QBzoFxDkvEmi+t6UbgEKkV32tT99wiwrG9ILhes2qkrxQN1vfONL28ETZ - xuOolWPfsPY2w1j00Fz5TI1Gt+yxFmTNwQSrNcVYGtnfRhn0PB3aHaa3E2fj8v+P - fAkPB8ty2xY+2/4UloJn2PvnRhaQgDfmvLp6rTKJ/GTd2buZeSLN7dbe6kIUSqNQ - 6ZW1omwqLfx0UuAh10Q4z4nJGlARQtNnhXRkdgBZ30LWz7u2KfKnHfKE4eYu9spB - lm7mgX0GsZgJWp+CFONHVfEs9NXrowIDAQABAoICACCo80rExQcHVVKjumHz+DLw - tI5yuPm4l7XsPh+NsnX+KL3YWLe/oWietZeZ5jD3GZarg68p6obmHDvTzOfN4CwJ - hbqeFO8GVhJPhIVGAEanqqBkAJSZg6bi+Vwe8Ek0mFg4WvHxY4IbTvKoCEhaG0wg - C6ZhKH/h/m0WMjN0y9G21iUDMy2MmW96a9zf4OBqy3tgblJa9R3Xi1SB8sICvWe/ - g8YeGwaufH1oXAf+R/ZCRrwN1N2kzQiEms365HXZCyaHTYH5cZuKElLwlGVg9byZ - o7lfqIUMrr9gr3SJCARk9fySjUZDDcKfSZQhEOu9us9zRnT/l22pI11m7Ll4EQ3k - jGSOz4+LSZdS4mnD3vGCCUtS5tz9uJ4IU1CErLeNb3Mb4LvbUBo97SyXf4s7TLdv - O889e+tDR39qLYt94Dtl9On/td8j+AsgXr5AbQH7Ha7Y6rKmKOL1Hos2w0GycwXL - 1g4Y6FpC35Ao93GI8VgBupJBI8jZa84CLV1ZVkNb0X1gp1ExA08Pji5OsQNn2Mww - 2PJ0+1gKXBBeO8IakNAPmi3/CK+FFQ6B4v5VwjgDJM+gUtV7Jrtp7xoodGzQTuhw - jY045PghFgAVafDWKwRqG6EC0fKz1TOLdTSoqpWvIy7ElP6/5XNquWH9eML2h3PZ - K+1H9fFaEk0+Qjv5LwDhAoIBAQDNYZReYNk60e+Lgd+VDL/qdgtknoG06mZpUBVL - 3IBHVwa6l8iw0DnxL97slketzVSWqR8oYO5JOMj3OQ24TDE0rB2cPY6v4OdzSxOT - 2Ki6+QEJ7ybLPUVoEvchglcQ2xfvh8f3so1ULR4c64gZCvB55iq/2ylmOTADcUwa - KK7OWJzaK4JWk1VYjw4pmVGcxK/wM587FUkxEJjgqychjPNAlpFlUr2Sp8Fy1on2 - 6OcqbB4afXqCCxNzi0dlEEWb4RXxhWEIkBaQVKE3X3aWYwH2yGW1f+ilgIF0MT0o - mDPE7x1s75pQvXZftyXS1B/7OSwyKpejtrmQIoWaYcMIrrixAoIBAQDHRB+bXENT - RIJSol8acVOZM/pq0iI8bGg2ud/JR5tmcKcLKP9SwKTSwFI3LUMbMAkLb0wwSmyp - s3SLMTo1VdqrCzqHS465gi/0XLamGLJghE8bzflTHLfIwQ0CrXcdFJUSGivlDVgR - 5riMnuyisGd4v34gk2n2xQMEjILAzOkTqPTyx+ZlXXTBYfUT9vmcbdZoYy6IueRu - JGpL7O/SfpbMEDMmhWIsLdQzo7MlwI5MGPgKNx0NBtQpqf+yx+nOmlxjDMCbKxCv - 4lHMP4p6XmSb3m+Iz0QLi1k33qSI4szL5uqxTX9rbl6vCTqRyDwlbrubVAF2TEdX - p7QND3UF9z6TAoIBAD6sW1ldloyjicT5sd/LDzmeIiXnVM9/hBb5EDahKCgc/3mr - XdvO/w+BuzZZObBo6zo6i76Hrc98W59NsskdvxpCt5p5EnTLXfXJ4ESKphrAZ7e/ - WghFP0veFboNC0KiiTBYMAZ/Xy9jwT+0BEkYFIAuY7c+Sujd5K/4P+/voEBpvBu7 - kT+YIEAxD3JUThpXzxSuvBWMjlRBq1VMBVnwqD56dA4GbME3HgpMO7e0JO7GJX2R - 8vOCK8JjqzrE92j1C/wy5oR1a91JZhT+tbJ4rh2/04HKcZUnnNl3OSGNKKcdDM60 - Y1PmLRxSSGGIx+Wi8cCxTKrx1LiOQFT3Jkwc/VECggEBAJjaSOSEAaD+DHoW050V - EWuT06PdTSXMgqR4MJHVu/74qyqEaFayL7z6ihaJQdC5KDb9SRRCAtiqL9wWBvCi - yvopwtvFudXTZ7Wq6PDAQRSIaaaKeZankNMOQ0yqg5RrFW6tZL5vXf9dXHOB9UNW - zghx2+5hJgeFWKtEnYgHp0LNeBhD/xgCeG1fFwAZk5/LIY0xh6CZ+AAFLwTO26g8 - MrCWPKZv6r646O4zxFhRPNZi0OIFJOO5OUY8gUhC0bcJ8ZSJU7Wzczl4AgcLNs5n - WgW2uxfW5ft1CRsyTkQytaYznBQlvnhKUZczHRp23qxYJNEhv31fRdqXaiYalUne - PsECggEAOJZJwvvxi74HZI5rkdJBN3fXfo1zaZuTs+wDUXhcQreLy3sBSoX3eSVm - grnrIBsxw3oDqp+Mg++aCrr4GM2Jiymbogg1aN11MT7oFLhKWLKW6JrUT9Av4KYp - LFbXCuaEgMk60bKNbNcAI378gEHq8I352q/ezWnQys/PtVuUx3VwsPnuvUypEAuL - 90RgMx7g46Q3GC7TQmlqNyaEDaVGY2PYSQZjNje8TTf7pJopue/9KF1cTyN2pgpz - i6ZGjYpEzFf484iIOxv1HWndfvcQg6y+rw1n08sR8bh759YFrv8fz/vxou7m9BUL - wE0kp6bIPqO7luLz5sqjxGiSRTiWSQ== - -----END PRIVATE KEY----- - children: - primary: - hosts: - 100.25.104.198: - vars: - artifactory_is_primary: true - artifactory_license1: cHJvZHVjdHM6CiAgYXJ0aWZhY3Rvcnk6CiAgICBwcm9kdWN0OiBaWGh3YVhKbGN6b2dNakF5TUMwd055MHdNbFF3TURvd01Eb3dNRm9LYVdRNklHSTJaakk0TURsakxXVXhNakV0TkdOa01TMWlNRGczTFdVMk5tSmlNVGxrTlRjMlpRcHZkMjVsY2pvZ1NrWnliMmNnVkVWVFZBcHdjbTl3WlhKMGFXVnpPaUI3ZlFwemFXZHVZWFIxY21VNklHNTFiR3dLZEhKcFlXdzZJSFJ5ZFdVS2RIbHdaVG9nVkZKSlFVd0tkbUZzYVdSR2NtOXRPaUF5TURJd0xUQXhMVEF5VkRJeE9qQXdPalE1TGpBd09Gb0sKICAgIHNpZ25hdHVyZTogU20vVlV1a3dnVTRlaEtHVmpwbE9XUHB5SzJpcS9pUVdjNklPOXdhNCtYdUR6SERrTFlPRFpkdm80bWxtU0d3NFVlak1mUXRiczFQbW8rTndnZERJbHVHQWpzMXZsbEpuVU5mRzZNQmYxTG5OMTg3RnpmNUswL0Q2WWFuUWI2Q1FYQ0x3T1FxK1VNYWpOcVh2eURoU1RDZHE3VjJtcXl6bDQ2bGFoWDB6VXQvYmM2UnQyNGFZS3ZSc2hxcmZ5eFNLWVY0YXBFeXJuRnZsYWZ5aFVaalJseGxubDJlUkRlVEI1cFZibXRSb2pTVU9oNExNMDg1Rm96QTB4dUxOdkEwbUhDYmtnTWlFRHdaOHJoK3F5SDYvUEFiaEdBWmlQbWY5WVZnM3FydUJkc1p6UmNiTytEUmIwZnZKeXB3NmVIVW4vd0dZd0daTkZEdmJZUlhGYjVaSkRRPT0KdmVyc2lvbjogMQo= - artifactory_license2: cHJvZHVjdHM6CiAgYXJ0aWZhY3Rvcnk6CiAgICBwcm9kdWN0OiBaWGh3YVhKbGN6b2dNakF5TUMwd055MHdNbFF3TURvd01Eb3dNRm9LYVdRNklHWTJaVGsyTXpSaExUa3laR0V0TkRSbE9DMDVPVFkyTFRGallUQTNNakk0WVRObE1ncHZkMjVsY2pvZ1NrWnliMmNnVkVWVFZBcHdjbTl3WlhKMGFXVnpPaUI3ZlFwemFXZHVZWFIxY21VNklHNTFiR3dLZEhKcFlXdzZJSFJ5ZFdVS2RIbHdaVG9nVkZKSlFVd0tkbUZzYVdSR2NtOXRPaUF5TURJd0xUQXhMVEF5VkRJeE9qQXdPalE1TGpBeU5sb0sKICAgIHNpZ25hdHVyZTogaTh0Vys0T3ZUVDErUTBpSmZPalgyOTRUa0YyTFhhYWtsbDZRSlJSYVVZVlpVejhaVTlKRXB3RWZaMnZPYTdvVkQ4ZUJGSTArSVRjQTZBNFVJcCsrZjJleTJIdVdDNU50NFFiTWxPSS9sdzY1Yk9SNHdsN0tML1EvVURsb3gzaENvVkRaSFpTVDdzdGVoVkJHVzdBMUVaVXBGc3hhaHZzaWNxSHJSMzNudGhyWGY0TllrS2g1TmVWYlhFYTRFSWgrak1ycnhsM1ZmODZHMm8vSDR1Y2dxb2dxYjZDSUk0TUhMYWE0Wk9BU0ZGVkpaWU1KZkxjS3ZDSzVxMlJ5bDUwVFR1aVQ5UVJld21yamFTS1ByamRsNk52ckFYTDEzd2xjSmFGd2FnTDJSblYzd3VTVTNqWkg1Z3ZEQzJscjJtZGh1eVdKbjBFRXhnMGZBTFVtM1VXNHRnPT0KdmVyc2lvbjogMQo= - artifactory_license3: cHJvZHVjdHM6CiAgYXJ0aWZhY3Rvcnk6CiAgICBwcm9kdWN0OiBaWGh3YVhKbGN6b2dNakF5TUMwd055MHdNbFF3TURvd01Eb3dNRm9LYVdRNklHSm1ZMk00TVRReUxUYzBNamt0TkRFd1l5MDVZV1prTFRFM09UWXlaV016TWpJNFpBcHZkMjVsY2pvZ1NrWnliMmNnVkVWVFZBcHdjbTl3WlhKMGFXVnpPaUI3ZlFwemFXZHVZWFIxY21VNklHNTFiR3dLZEhKcFlXdzZJSFJ5ZFdVS2RIbHdaVG9nVkZKSlFVd0tkbUZzYVdSR2NtOXRPaUF5TURJd0xUQXhMVEF5VkRJeE9qQXdPalE1TGpBME5Gb0sKICAgIHNpZ25hdHVyZToga2JiUUJ0NW55WkpiOERtZTJCR0F5eXRNOEkyZ1dWQW8yRlBLVEFUKzQyY3NMaGcwcjJCL0xtNnZmOGRML3g5WVluNTA0d1ZEVnd2ZGFBbG5kamJONjZzSXJieWptN2Q4VVpzUXMyL3lUdlk2b3VzMVdibU8rTER2SVpGbDFkQ2hHTnc5Rk82NmhPT0lYdUpxU3BUczdYMVlnMS9vZ1pUbS9ZQnJQamlWb1duVVJJUENhSzhWYStSRDhUREExTXdwZitrNXdhQ3h1QWt0b1FwdVJYVUQzUlFXTGdyd1BxZEhXUnhHN2NTZWh0ZjU0dEJmRHNLUzMvUUVQQXNjSXI5RVM5ZFRzVzlSL1NBZFBVLzRsUWE0aFpOdVprS2d5aXdoOE1ybnlxYWRKVXRhSzUvRnAyTHMxSk5NQVg2NERqbU1kdURrS1I0NGlPQVFGeGcwTjlURE5RPT0KdmVyc2lvbjogMQo= - artifactory_license4: cHJvZHVjdHM6CiAgYXJ0aWZhY3Rvcnk6CiAgICBwcm9kdWN0OiBaWGh3YVhKbGN6b2dNakF5TUMwd055MHdNbFF3TURvd01Eb3dNRm9LYVdRNklEWmhPVE0yWW1NMExUQTROVGd0TkRCak5pMDRNemd3TFdNNE9XSmlaVGsxWlROak1RcHZkMjVsY2pvZ1NrWnliMmNnVkVWVFZBcHdjbTl3WlhKMGFXVnpPaUI3ZlFwemFXZHVZWFIxY21VNklHNTFiR3dLZEhKcFlXdzZJSFJ5ZFdVS2RIbHdaVG9nVkZKSlFVd0tkbUZzYVdSR2NtOXRPaUF5TURJd0xUQXhMVEF5VkRJeE9qQXdPalE1TGpBMk1sb0sKICAgIHNpZ25hdHVyZTogZmRlTG95bzc1VTdKYW1JZ00ycVAwMUZWbEE5cHZXbUJXbGNqamJnNGZTQ0UzcVExSDNtTDlkdkJmYTZMTmV1QmxXTTdtWkdTTEhzZzlnc1ZabmduZFR2emFndEtHY3VndlpRQ3puamFERU1QL2JiU3VYWW52UEVDRGFBek5hVm9lakM5VWxialUzK0xPZSt5MC9xU1NiMFlXdDBGSGxydEZObGVlWDFWSGdqN3MwdzRYS1lJWDFBWGdhVTY4ODZZZWdvOTJrSHB1cjIrUmQrUUNLaHAwTzIxdGliVlFMSjZrSEQyZXlKa3J1R0JmWmVhdlZVbkNrVTR6ck1lTlhjNlI4RVlqUGFFTGVZMm02VFBGZWc5OG5JRjVFOS9LZ0VBYUNEeG1CZ3RFaWR0UVJCNVBMa2RxSm53VWxPR1d1UjB3UldBODV5eFhkWTJwdWRJc2lRdXh3PT0KdmVyc2lvbjogMQo= - artifactory_license5: cHJvZHVjdHM6CiAgYXJ0aWZhY3Rvcnk6CiAgICBwcm9kdWN0OiBaWGh3YVhKbGN6b2dNakF5TUMwd055MHdNbFF3TURvd01Eb3dNRm9LYVdRNklEY3pPR1prWWpVM0xXRXhZbVV0TkRZM015MWhabUV3TFRobFlUUmtZVFZrTnpnd01RcHZkMjVsY2pvZ1NrWnliMmNnVkVWVFZBcHdjbTl3WlhKMGFXVnpPaUI3ZlFwemFXZHVZWFIxY21VNklHNTFiR3dLZEhKcFlXdzZJSFJ5ZFdVS2RIbHdaVG9nVkZKSlFVd0tkbUZzYVdSR2NtOXRPaUF5TURJd0xUQXhMVEF5VkRJeE9qQXdPalE1TGpBM09Wb0sKICAgIHNpZ25hdHVyZTogYytEdkJWNXdiRlRnUEFxT0VFWDU0S3IwQWlMWUVNNTJuRHNUcGI4OHNXdmIxTGl1YlRvdXA0NXNMVU9aTnZvVlFuM2szREw4MTFQdHU1WUM5T3dVNXdTNDVkTkQrZHNLREN3eTE4T0c3SU05ZHZ6bml2RU5mb2xsL2VFMTNtazZVS0RLQmhXUkxlYjVvM0tIbkZGRTRTZ004UVNRNGFsWnA5cjA3aUJTUVRrVkxPVnliTUJtSFpkMVJlSmUwcTN0TXZGUVNFNTJHU3FzaURkZ0lVQTVjL1lUQVVnclRoc1lCRVpJQmJCTXVITnNSay9rZHRobmRHWitsQnB0bzlHR25HQ3EzZ0lOQU94Q2tHSnlvMWpGK28xMi9tR3Q1NnVocXVJN2s3SzMzMUpvMGl1L2VWWkxOWEtGNjl5OEE2K0dyMnVheExEajQwaGYwU0pHZ3FESVdBPT0KdmVyc2lvbjogMQo= -# secondary: -# hosts: -# 54.160.107.157: -# 35.153.79.44: -# vars: -# artifactory_is_primary: false diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.travis.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.travis.yml deleted file mode 100644 index 0a639b7..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -language: python -services: docker - -env: - global: - - ROLE_NAME: java - matrix: - - MOLECULE_DISTRO: centos8 - - MOLECULE_DISTRO: centos7 - - MOLECULE_DISTRO: centos6 - - MOLECULE_DISTRO: fedora31 - - MOLECULE_DISTRO: ubuntu1804 - - MOLECULE_DISTRO: ubuntu1604 - - MOLECULE_DISTRO: debian10 - - MOLECULE_DISTRO: debian9 - -install: - # Install test dependencies. - - pip install molecule yamllint ansible-lint docker - -before_script: - # Use actual Ansible Galaxy role name for the project directory. - - cd ../ - - mv ansible-role-$ROLE_NAME geerlingguy.$ROLE_NAME - - cd geerlingguy.$ROLE_NAME - -script: - # Run tests. - - molecule test - -notifications: - webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.yamllint b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.yamllint deleted file mode 100644 index a3dbc38..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/.yamllint +++ /dev/null @@ -1,6 +0,0 @@ ---- -extends: default -rules: - line-length: - max: 120 - level: warning diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/defaults/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/defaults/main.yml deleted file mode 100644 index 3f51462..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/defaults/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Set java_packages if you would like to use a different version than the -# default for the OS (see defaults per OS in `vars` directory). -# java_packages: [] - -java_home: "" diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/meta/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/meta/main.yml deleted file mode 100644 index 20b9f75..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/meta/main.yml +++ /dev/null @@ -1,42 +0,0 @@ ---- -dependencies: [] - -galaxy_info: - role_name: java - author: geerlingguy - description: Java for Linux - company: "Midwestern Mac, LLC" - license: "license (BSD, MIT)" - min_ansible_version: 2.4 - platforms: - - name: EL - versions: - - 6 - - 7 - - 8 - - name: Fedora - versions: - - all - - name: Debian - versions: - - wheezy - - jessie - - stretch - - buster - - name: Ubuntu - versions: - - precise - - trusty - - xenial - - bionic - - name: FreeBSD - versions: - - 10.2 - galaxy_tags: - - development - - system - - web - - java - - jdk - - openjdk - - oracle diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/main.yml deleted file mode 100644 index b2a6ded..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/main.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- -- name: Include OS-specific variables for Fedora or FreeBSD. - include_vars: "{{ ansible_distribution }}.yml" - when: ansible_distribution == 'FreeBSD' or ansible_distribution == 'Fedora' - -- name: Include version-specific variables for CentOS/RHEL. - include_vars: "RedHat-{{ ansible_distribution_version.split('.')[0] }}.yml" - when: ansible_distribution == 'CentOS' or - ansible_distribution == 'Red Hat Enterprise Linux' or - ansible_distribution == 'RedHat' - -- name: Include version-specific variables for Ubuntu. - include_vars: "{{ ansible_distribution }}-{{ ansible_distribution_version.split('.')[0] }}.yml" - when: ansible_distribution == 'Ubuntu' - -- name: Include version-specific variables for Debian. - include_vars: "{{ ansible_distribution|title }}-{{ ansible_distribution_version.split('.')[0] }}.yml" - when: ansible_os_family == 'Debian' - -- name: Define java_packages. - set_fact: - java_packages: "{{ __java_packages | list }}" - when: java_packages is not defined - -# Setup/install tasks. -- include_tasks: setup-RedHat.yml - when: ansible_os_family == 'RedHat' - -- include_tasks: setup-Debian.yml - when: ansible_os_family == 'Debian' - -- include_tasks: setup-FreeBSD.yml - when: ansible_os_family == 'FreeBSD' - -# Environment setup. -- name: Set JAVA_HOME if configured. - template: - src: java_home.sh.j2 - dest: /etc/profile.d/java_home.sh - mode: 0644 - when: java_home is defined and java_home diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-Debian.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-Debian.yml deleted file mode 100644 index ac77b7a..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-Debian.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -# See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199 and -# https://github.com/geerlingguy/ansible-role-java/issues/64 -- name: Ensure 'man' directory exists. - file: - path: /usr/share/man/man1 - state: directory - recurse: true - when: - - ansible_distribution == 'Ubuntu' - - ansible_distribution_version == '18.04' - -- name: Ensure Java is installed. - apt: - update_cache: yes - name: "{{ java_packages }}" - state: present - become: true diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-FreeBSD.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-FreeBSD.yml deleted file mode 100644 index ca356b3..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-FreeBSD.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Ensure Java is installed. - pkgng: - name: "{{ java_packages }}" - state: present - become: true - -- name: ensure proc is mounted - mount: name=/proc fstype=procfs src=proc opts=rw state=mounted - -- name: ensure fdesc is mounted - mount: name=/dev/fd fstype=fdescfs src=fdesc opts=rw state=mounted diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-RedHat.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-RedHat.yml deleted file mode 100644 index cdd912d..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/tasks/setup-RedHat.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- name: Ensure Java is installed. - package: - name: "{{ java_packages }}" - state: present - become: true diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/templates/java_home.sh.j2 b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/templates/java_home.sh.j2 deleted file mode 100644 index 4859c4a..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/templates/java_home.sh.j2 +++ /dev/null @@ -1 +0,0 @@ -export JAVA_HOME={{ java_home }} diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-10.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-10.yml deleted file mode 100644 index bd058c2..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-10.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-11-jdk -__java_packages: - - openjdk-11-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-8.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-8.yml deleted file mode 100644 index 8d620e4..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-8.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-6-jdk -# - openjdk-7-jdk -__java_packages: - - openjdk-7-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-9.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-9.yml deleted file mode 100644 index 17e49bf..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Debian-9.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-8-jdk -__java_packages: - - openjdk-8-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Fedora.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Fedora.yml deleted file mode 100644 index 47c5a01..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Fedora.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# JDK version options include: -# - java -# - java-1.8.0-openjdk -__java_packages: - - java-1.8.0-openjdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/FreeBSD.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/FreeBSD.yml deleted file mode 100644 index 0d712eb..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/FreeBSD.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options for FreeBSD include: -# - openjdk -# - openjdk6 -# - openjdk8 -__java_packages: - - openjdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-6.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-6.yml deleted file mode 100644 index 70694b7..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-6.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java -# - java-1.6.0-openjdk -# - java-1.7.0-openjdk -__java_packages: - - java-1.7.0-openjdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-7.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-7.yml deleted file mode 100644 index 64db579..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-7.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -# JDK version options include: -# - java -# - java-1.6.0-openjdk -# - java-1.7.0-openjdk -# - java-1.8.0-openjdk -__java_packages: - - java-1.8.0-openjdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-8.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-8.yml deleted file mode 100644 index d49b6f4..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/RedHat-8.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java-1.8.0-openjdk -# - java-11-openjdk -# - java-latest-openjdk -__java_packages: - - java-11-openjdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-12.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-12.yml deleted file mode 100644 index 8d620e4..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-12.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-6-jdk -# - openjdk-7-jdk -__java_packages: - - openjdk-7-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-14.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-14.yml deleted file mode 100644 index 8d620e4..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-14.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-6-jdk -# - openjdk-7-jdk -__java_packages: - - openjdk-7-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-16.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-16.yml deleted file mode 100644 index 0a0bd82..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-16.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-8-jdk -# - openjdk-9-jdk -__java_packages: - - openjdk-8-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-18.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-18.yml deleted file mode 100644 index bd058c2..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-java/vars/Ubuntu-18.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# JDK version options include: -# - java -# - openjdk-11-jdk -__java_packages: - - openjdk-11-jdk diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/vars/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/vars/main.yml deleted file mode 100644 index 86ad0fd..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/vars/main.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -artifactory_tar: https://dl.bintray.com/jfrog/artifactory-pro/org/artifactory/pro/jfrog-artifactory-pro/{{ artifactory_version }}/jfrog-artifactory-pro-{{ artifactory_version }}-linux.tar.gz -artifactory_home: "{{ artifactory_download_directory }}/artifactory-{{ artifactory_flavour }}-{{ artifactory_version }}" - -artifactory_user: artifactory -artifactory_group: artifactory - -# Set the parameters required for the service. -service_list: - - name: artifactory - description: Start script for Artifactory - start_command: "{{ artifactory_home }}/bin/artifactory.sh start" - stop_command: "{{ artifactory_home }}/bin/artifactory.sh stop" - type: forking - status_pattern: artifactory - user_name: "{{ artifactory_user }}" - group_name: "{{ artifactory_group }}" diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/README.md b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/README.md deleted file mode 100644 index 225dd44..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/README.md +++ /dev/null @@ -1,38 +0,0 @@ -Role Name -========= - -A brief description of the role goes here. - -Requirements ------------- - -Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. - -Role Variables --------------- - -A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. - -Dependencies ------------- - -A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. - -Example Playbook ----------------- - -Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: - - - hosts: servers - roles: - - { role: username.rolename, x: 42 } - -License -------- - -BSD - -Author Information ------------------- - -An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/defaults/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/defaults/main.yml deleted file mode 100644 index 6667258..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# defaults file for xray-postgres \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/handlers/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/handlers/main.yml deleted file mode 100644 index 2770023..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/handlers/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# handlers file for xray-postgres \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tasks/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tasks/main.yml deleted file mode 100644 index c76e6e4..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tasks/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# tasks file for xray-postgres \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tests/test.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tests/test.yml deleted file mode 100644 index 642a7c9..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tests/test.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -- hosts: localhost - remote_user: root - roles: - - xray-postgres \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/vars/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/vars/main.yml deleted file mode 100644 index 10cff70..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/vars/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# vars file for xray-postgres \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/.travis.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/.travis.yml deleted file mode 100644 index 36bbf62..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -language: python -python: "2.7" - -# Use the new container infrastructure -sudo: false - -# Install ansible -addons: - apt: - packages: - - python-pip - -install: - # Install ansible - - pip install ansible - - # Check ansible version - - ansible --version - - # Create ansible.cfg with correct roles_path - - printf '[defaults]\nroles_path=../' >ansible.cfg - -script: - # Basic role syntax check - - ansible-playbook tests/test.yml -i tests/inventory --syntax-check - -notifications: - webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/README.md b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/README.md deleted file mode 100644 index 225dd44..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/README.md +++ /dev/null @@ -1,38 +0,0 @@ -Role Name -========= - -A brief description of the role goes here. - -Requirements ------------- - -Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. - -Role Variables --------------- - -A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. - -Dependencies ------------- - -A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. - -Example Playbook ----------------- - -Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: - - - hosts: servers - roles: - - { role: username.rolename, x: 42 } - -License -------- - -BSD - -Author Information ------------------- - -An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/defaults/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/defaults/main.yml deleted file mode 100644 index 8e55c59..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# defaults file for xray \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/meta/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/meta/main.yml deleted file mode 100644 index 227ad9c..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/meta/main.yml +++ /dev/null @@ -1,53 +0,0 @@ -galaxy_info: - author: your name - description: your role description - company: your company (optional) - - # If the issue tracker for your role is not on github, uncomment the - # next line and provide a value - # issue_tracker_url: http://example.com/issue/tracker - - # Choose a valid license ID from https://spdx.org - some suggested licenses: - # - BSD-3-Clause (default) - # - MIT - # - GPL-2.0-or-later - # - GPL-3.0-only - # - Apache-2.0 - # - CC-BY-4.0 - license: license (GPL-2.0-or-later, MIT, etc) - - min_ansible_version: 2.9 - - # If this a Container Enabled role, provide the minimum Ansible Container version. - # min_ansible_container_version: - - # - # Provide a list of supported platforms, and for each platform a list of versions. - # If you don't wish to enumerate all versions for a particular platform, use 'all'. - # To view available platforms and versions (or releases), visit: - # https://galaxy.ansible.com/api/v1/platforms/ - # - # platforms: - # - name: Fedora - # versions: - # - all - # - 25 - # - name: SomePlatform - # versions: - # - all - # - 1.0 - # - 7 - # - 99.99 - - galaxy_tags: [] - # List tags for your role here, one per line. A tag is a keyword that describes - # and categorizes the role. Users find roles by searching for tags. Be sure to - # remove the '[]' above, if you add tags to this list. - # - # NOTE: A tag is limited to a single word comprised of alphanumeric characters. - # Maximum 20 tags per role. - -dependencies: [] - # List your role dependencies here, one per line. Be sure to remove the '[]' above, - # if you add dependencies to this list. - \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tasks/main.yml b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tasks/main.yml deleted file mode 100644 index cf85f8b..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tasks/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# tasks file for xray \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tests/inventory b/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tests/inventory deleted file mode 100644 index 878877b..0000000 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tests/inventory +++ /dev/null @@ -1,2 +0,0 @@ -localhost - diff --git a/Ansible/artifactory7/rt7provision.yml b/Ansible/artifactory7/rt7provision.yml deleted file mode 100644 index 8acff9e..0000000 --- a/Ansible/artifactory7/rt7provision.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- hosts: database - gather_facts: true - roles: - - jfrog/rt7ansible/roles/artifactory-postgres - -- hosts: primary:secondary - gather_facts: true - roles: - - jfrog/rt7ansible/roles/artifactory - - jfrog/rt7ansible/roles/artifactory-nginx-ssl \ No newline at end of file diff --git a/Ansible/awsPipelines.yaml b/Ansible/awsPipelines.yaml new file mode 100644 index 0000000..3141c08 --- /dev/null +++ b/Ansible/awsPipelines.yaml @@ -0,0 +1,54 @@ +resources: + - name: ansibleRepo + type: GitRepo + configuration: + gitProvider: jefferyfryGithub + path: jefferyfry/JFrog-Cloud-Installers +pipelines: + - name: ansible_aws_automation_pipeline + steps: + - name: execute_aws_ansible_playbook + type: Bash + configuration: + runtime: + type: image + image: + auto: + language: java + versions: + - "8" + integrations: + - name: ansibleAwsKeys + - name: ansibleEnvVars + - name: ansiblePrivateKey + inputResources: + - name: ansibleRepo + execution: + onStart: + - echo "Executing AWS Ansible playbook..." + onExecute: + - sudo apt-get update + - sudo apt-get install gnupg2 + - sudo apt-get install software-properties-common + - sudo apt-add-repository --yes --update ppa:ansible/ansible + - sudo apt -y --allow-unauthenticated install ansible + - sudo pip install packaging + - sudo pip install boto3 botocore + - cd ../dependencyState/resources/ansibleRepo + - echo 'Setting environment variables...' + - export artifactory_license1="$int_ansibleEnvVars_artifactory_license1" + - export artifactory_license2="$int_ansibleEnvVars_artifactory_license2" + - export artifactory_license3="$int_ansibleEnvVars_artifactory_license3" + - export master_key="$int_ansibleEnvVars_master_key" + - export join_key="$int_ansibleEnvVars_join_key" + - export ssh_public_key_name="$int_ansibleEnvVars_ssh_public_key_name" + - export cfn_template="$int_ansibleEnvVars_cfn_template" + - export stack_name="$int_ansibleEnvVars_stack_name" + - export AWS_ACCESS_KEY_ID="$int_ansibleEnvVars_AWS_ACCESS_KEY_ID" + - export AWS_SECRET_KEY="$int_ansibleEnvVars_AWS_SECRET_KEY" + - printenv + - eval $(ssh-agent -s) + - ssh-add <(echo "$int_ansiblePrivateKey_key") + - ansible-playbook Ansible/test/aws/playbook.yaml + onComplete: + - echo "AWS Ansible playbook complete." \ No newline at end of file diff --git a/Ansible/azurePipelines.yaml b/Ansible/azurePipelines.yaml new file mode 100644 index 0000000..f857fe6 --- /dev/null +++ b/Ansible/azurePipelines.yaml @@ -0,0 +1,57 @@ +resources: + - name: ansibleRepo + type: GitRepo + configuration: + gitProvider: jefferyfryGithub + path: jefferyfry/JFrog-Cloud-Installers +pipelines: + - name: ansible_azure_automation_pipeline + steps: + - name: execute_azure_ansible_playbook + type: Bash + configuration: + runtime: + type: image + image: + auto: + language: java + versions: + - "8" + integrations: + - name: ansibleAzureKeys + - name: ansibleEnvVars + - name: ansiblePrivateKey + inputResources: + - name: ansibleRepo + execution: + onStart: + - echo "Executing Azure Ansible playbook..." + onExecute: + - sudo apt-get update + - sudo apt-get install gnupg2 + - sudo apt-get install software-properties-common + - sudo apt-add-repository --yes --update ppa:ansible/ansible + - sudo apt -y --allow-unauthenticated install ansible + - sudo pip install packaging + - sudo pip install msrestazure + - sudo pip install ansible[azure] + - cd ../dependencyState/resources/ansibleRepo + - echo 'Setting environment variables...' + - export artifactory_license1="$int_ansibleEnvVars_artifactory_license1" + - export artifactory_license2="$int_ansibleEnvVars_artifactory_license2" + - export artifactory_license3="$int_ansibleEnvVars_artifactory_license3" + - export master_key="$int_ansibleEnvVars_master_key" + - export join_key="$int_ansibleEnvVars_join_key" + - export ssh_public_key="$int_ansibleEnvVars_ssh_public_key" + - export arm_template="$int_ansibleEnvVars_arm_template" + - export azure_resource_group="$int_ansibleEnvVars_azure_resource_group" + - export clientId="$int_ansibleAzureKeys_appId" + - export clientSecret="$int_ansibleAzureKeys_password" + - export tenantId="$int_ansibleAzureKeys_tenant" + - printenv + - eval $(ssh-agent -s) + - ssh-add <(echo "$int_ansiblePrivateKey_key") + - az login --service-principal -u "$clientId" -p "$clientSecret" --tenant "$tenantId" + - ansible-playbook Ansible/test/azure/playbook.yaml + onComplete: + - echo "Azure Ansible playbook complete." \ No newline at end of file diff --git a/Ansible/artifactory7/.ansible-lint b/Ansible/collection/.ansible-lint similarity index 100% rename from Ansible/artifactory7/.ansible-lint rename to Ansible/collection/.ansible-lint diff --git a/Ansible/artifactory7/.yamllint b/Ansible/collection/.yamllint similarity index 100% rename from Ansible/artifactory7/.yamllint rename to Ansible/collection/.yamllint diff --git a/Ansible/collection/README.md b/Ansible/collection/README.md new file mode 100644 index 0000000..2ab5fa1 --- /dev/null +++ b/Ansible/collection/README.md @@ -0,0 +1,77 @@ +# Ansible +This repo contains the Ansible collection for JFrog roles. These roles allow you to provision Artifactory for High-Availability using a Primary node and multiple Secondary nodes. Additionally, a Postgresql role is provided for installing an Artifactory Postgresql database. + +## Roles Provided +### artifactory +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. + +### artifactory-nginx-ssl +The artifactory-nginx-ssl role installs and configures nginx for SSL. + +### postgres +The postgres role will install Postgresql software and configure a database and user to support an Artifactory or Xray server. + +### xray +The xray role will install Xray software onto the host. An Artifactory server and Postgress database is required. + +## Vars Required +The following Vars must be configured. + +### databsase vars +* db_users: This is a list of database users to create. eg. db_users: - { db_user: "artifactory", db_password: "Art1fAct0ry" } +* dbs: This is the database to create. eg. dbs: - { db_name: "artifactory", db_owner: "artifactory" } + +### artifactory vars +* artifactory_version: The version of Artifactory to install. eg. "7.4.1" +* master_key: This is the Artifactory Master Key. +* join_key: This is the Artifactory Join Key. +* db_download_url: This is the download URL for the JDBC driver for your database. eg. "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" +* db_type: This is the database type. eg. "postgresql" +* db_driver: This is the JDBC driver class. eg. "org.postgresql.Driver" +* db_url: This is the JDBC database url. eg. "jdbc:postgresql://10.0.0.120:5432/artifactory" +* db_user: The database user to configure. eg. "artifactory" +* db_password: The database password to configure. "Art1fact0ry" +* server_name: This is the server name. eg. "artifactory.54.175.51.178.xip.io" + +### primary vars +* artifactory_is_primary: For the primary node this must be set to **true**. +* artifactory_license1 - 5: These are the cluster licenses. + +### secondary vars +* artifactory_is_primary: For the secondary node(s) this must be set to **false**. + +### ssl vars (Used with artifactory-nginx-ssl role) +* certificate: This is the SSL cert. +* certificate_key: This is the SSL private key. + +### xray vars +* xray_version: The version of Artifactory to install. eg. "3.3.0" +* jfrog_url: This is the URL to the Artifactory base URL. eg. "http://ec2-54-237-207-135.compute-1.amazonaws.com" +* master_key: This is the Artifactory Master Key. +* join_key: This is the Artifactory Join Key. +* db_type: This is the database type. eg. "postgresql" +* db_driver: This is the JDBC driver class. eg. "org.postgresql.Driver" +* db_url: This is the database url. eg. "postgres://10.0.0.59:5432/xraydb?sslmode=disable" +* db_user: The database user to configure. eg. "xray" +* db_password: The database password to configure. "xray" + +## Example Inventory and Playbooks +Example playbooks are located in the [project](../project) directory. This directory contains several example inventory and plaaybooks for different Artifactory, HA and Xray architectures. + +## Executing a Playbook +``` +ansible-playbook -i + +eg. + ansible-playbook -i example-playbooks/rt-xray-ha/hosts.yml example-playbooks/rt-xray-ha/playbook.yml +``` + +## Bastion Hosts +In many cases, you may want to run this Ansible collection through a Bastion host to provision JFrog servers. You can include the following Var for a host or group of hosts: + +``` +ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A user@host -W %h:%p"' + +eg. +ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' +``` \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/galaxy.yml b/Ansible/collection/jfrog/ansible/galaxy.yml similarity index 99% rename from Ansible/artifactory7/jfrog/rt7ansible/galaxy.yml rename to Ansible/collection/jfrog/ansible/galaxy.yml index 3bba7ee..2b44148 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/galaxy.yml +++ b/Ansible/collection/jfrog/ansible/galaxy.yml @@ -6,7 +6,7 @@ namespace: jfrog # The name of the collection. Has the same character restrictions as 'namespace' -name: rt7ansible +name: ansible # The version of the collection. Must be compatible with semantic versioning version: 1.0.0 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/plugins/README.md b/Ansible/collection/jfrog/ansible/plugins/README.md similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/plugins/README.md rename to Ansible/collection/jfrog/ansible/plugins/README.md diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/.travis.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/.travis.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/.travis.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/.travis.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/defaults/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/defaults/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/defaults/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/defaults/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/handlers/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/handlers/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/handlers/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/handlers/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/meta/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/meta/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/meta/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/meta/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tasks/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tasks/main.yml similarity index 88% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tasks/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tasks/main.yml index c0e955d..ba37c53 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tasks/main.yml +++ b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tasks/main.yml @@ -7,35 +7,35 @@ owner: root group: root mode: '0755' - become: true + become: yes - name: ensure nginx dir exists file: path: "/var/opt/jfrog/nginx/ssl" state: directory - become: true + become: yes - name: configure certificate template: src: certificate.pem.j2 dest: "/var/opt/jfrog/nginx/ssl/cert.pem" - become: true + become: yes - name: ensure pki exists file: path: "/etc/pki/tls" state: directory - become: true + become: yes - name: configure key template: src: certificate.key.j2 dest: "/etc/pki/tls/cert.key" - become: true + become: yes - name: restart nginx service: name: nginx state: restarted enabled: yes - become: true \ No newline at end of file + become: yes \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/artifactory.conf.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/artifactory.conf.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/artifactory.conf.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/artifactory.conf.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/certificate.key.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/certificate.key.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/certificate.key.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/certificate.key.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/certificate.pem.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/certificate.pem.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/templates/certificate.pem.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/templates/certificate.pem.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tests/inventory b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tests/inventory similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tests/inventory rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tests/inventory diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tests/test.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tests/test.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/tests/test.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/tests/test.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/vars/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/vars/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx-ssl/vars/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx-ssl/vars/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/.travis.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/.travis.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/.travis.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/.travis.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/defaults/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/defaults/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/defaults/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/defaults/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/files/nginx.conf b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/files/nginx.conf similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/files/nginx.conf rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/files/nginx.conf diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/handlers/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/handlers/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/handlers/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/handlers/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/meta/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/meta/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/meta/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/meta/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tasks/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tasks/main.yml similarity index 78% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tasks/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tasks/main.yml index 01dce50..5146b14 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tasks/main.yml +++ b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tasks/main.yml @@ -1,10 +1,13 @@ --- -# tasks file for artifactory-nginx - name: install nginx package: name: nginx state: present - become: true + register: package_res + retries: 5 + delay: 60 + become: yes + until: package_res is success - name: configure main nginx conf file. copy: @@ -13,7 +16,7 @@ owner: root group: root mode: '0755' - become: true + become: yes - name: configure the artifactory nginx conf template: @@ -22,11 +25,11 @@ owner: root group: root mode: '0755' - become: true + become: yes - name: restart nginx service: name: nginx state: restarted enabled: yes - become: true \ No newline at end of file + become: yes diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/templates/artifactory.conf.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/templates/artifactory.conf.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/templates/artifactory.conf.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/templates/artifactory.conf.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tests/inventory b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tests/inventory similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tests/inventory rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tests/inventory diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tests/test.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tests/test.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/tests/test.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/tests/test.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/vars/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory-nginx/vars/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-nginx/vars/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory-nginx/vars/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/.travis.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/.travis.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/.travis.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/.travis.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/defaults/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/defaults/main.yml similarity index 55% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/defaults/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/defaults/main.yml index 02e5cc3..dd8cac9 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/defaults/main.yml +++ b/Ansible/collection/jfrog/ansible/roles/artifactory/defaults/main.yml @@ -6,11 +6,18 @@ ansible_marketplace: standalone # The version of Artifactory to install artifactory_version: 7.4.1 +# licenses +artifactory_license1: +artifactory_license2: +artifactory_license3: +artifactory_license4: +artifactory_license5: + # whether to enable HA artifactory_ha_enabled: true # value for whether a host is primary. this should be set in host vars -artifactory_is_primary: false +artifactory_is_primary: true # The location where Artifactory should install. artifactory_download_directory: /opt/jfrog @@ -24,6 +31,21 @@ artifactory_file_store_dir: /data # https://dl.bintray.com/jfrog/artifactory-pro/org/artifactory/pro/jfrog-artifactory-pro/{{ artifactory_version }}/jfrog-artifactory-pro-{{ artifactory_version }}-linux.tar.gz artifactory_flavour: pro -java_version: java-1.8.0 - extra_java_opts: -server -Xms2g -Xmx14g -Xss256k -XX:+UseG1GC + +artifactory_tar: https://dl.bintray.com/jfrog/artifactory-pro/org/artifactory/pro/jfrog-artifactory-pro/{{ artifactory_version }}/jfrog-artifactory-pro-{{ artifactory_version }}-linux.tar.gz +artifactory_home: "{{ artifactory_download_directory }}/artifactory-{{ artifactory_flavour }}-{{ artifactory_version }}" + +artifactory_user: artifactory +artifactory_group: artifactory + +# Set the parameters required for the service. +service_list: + - name: artifactory + description: Start script for Artifactory + start_command: "{{ artifactory_home }}/bin/artifactory.sh start" + stop_command: "{{ artifactory_home }}/bin/artifactory.sh stop" + type: forking + status_pattern: artifactory + user_name: "{{ artifactory_user }}" + group_name: "{{ artifactory_group }}" diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/handlers/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/handlers/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/handlers/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/handlers/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/exception.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/meta/exception.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/exception.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/meta/exception.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/meta/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/meta/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/preferences.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/meta/preferences.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/preferences.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/meta/preferences.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/version.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/meta/version.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/meta/version.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/meta/version.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/tasks/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/tasks/main.yml similarity index 84% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/tasks/main.yml rename to Ansible/collection/jfrog/ansible/roles/artifactory/tasks/main.yml index 2568e2d..a23a047 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/tasks/main.yml +++ b/Ansible/collection/jfrog/ansible/roles/artifactory/tasks/main.yml @@ -1,9 +1,5 @@ --- # tasks file for artifactory -- name: install java - include_role: - name: artifactory-java - - name: install nginx include_role: name: artifactory-nginx @@ -12,20 +8,20 @@ group: name: "{{ artifactory_group }}" state: present - become: true + become: yes - name: create user for artifactory user: name: "{{ artifactory_user }}" group: "{{ artifactory_group }}" system: yes - become: true + become: yes - name: ensure artifactory_download_directory exists file: path: "{{ artifactory_download_directory }}" state: directory - become: true + become: yes - name: download artifactory unarchive: @@ -35,7 +31,7 @@ owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" creates: "{{ artifactory_home }}" - become: true + become: yes register: downloadartifactory until: downloadartifactory is succeeded retries: 3 @@ -46,33 +42,41 @@ state: directory owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" - become: true + become: yes - name: ensure etc exists file: - path: "{{ artifactory_home }}/etc" + path: "{{ artifactory_home }}/var/etc" state: directory owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" - become: true + become: yes - name: configure system yaml template: src: system.yaml.j2 dest: "{{ artifactory_home }}/var/etc/system.yaml" - become: true + become: yes + +- name: ensure {{ artifactory_home }}/var/etc/security/ exists + file: + path: "{{ artifactory_home }}/var/etc/security/" + state: directory + owner: "{{ artifactory_user }}" + group: "{{ artifactory_group }}" + become: yes - name: configure master key template: src: master.key.j2 dest: "{{ artifactory_home }}/var/etc/security/master.key" - become: true + become: yes - name: configure join key template: src: join.key.j2 dest: "{{ artifactory_home }}/var/etc/security/join.key" - become: true + become: yes - name: ensure {{ artifactory_home }}/var/etc/info/ exists file: @@ -80,25 +84,25 @@ state: directory owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" - become: true + become: yes - name: configure installer info template: src: installer-info.json.j2 dest: "{{ artifactory_home }}/var/etc/info/installer-info.json" - become: true + become: yes - name: configure binary store template: src: binarystore.xml.j2 dest: "{{ artifactory_home }}/var/etc/binarystore.xml" - become: true + become: yes - name: configure cluster license template: src: artifactory.cluster.license.j2 dest: "{{ artifactory_home }}/var/etc/artifactory/artifactory.cluster.license" - become: true + become: yes when: artifactory_is_primary == true - name: download database driver @@ -107,17 +111,17 @@ dest: "{{ artifactory_home }}/var/bootstrap/artifactory/tomcat/lib" owner: "{{ artifactory_user }}" group: "{{ artifactory_group }}" - become: true + become: yes - name: create artifactory service shell: "{{ artifactory_home }}/app/bin/installService.sh" - become: true + become: yes - name: start and enable the primary node service: name: artifactory - state: started - become: true + state: restarted + become: yes when: artifactory_is_primary == true - name: random wait before restarting to prevent secondary nodes from hitting DB first @@ -128,6 +132,6 @@ - name: start and enable the secondary nodes service: name: artifactory - state: started - become: true + state: restarted + become: yes when: artifactory_is_primary == false diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/artifactory.cluster.license.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/artifactory.cluster.license.j2 similarity index 78% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/artifactory.cluster.license.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/artifactory.cluster.license.j2 index 54c879a..3f674f6 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/artifactory.cluster.license.j2 +++ b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/artifactory.cluster.license.j2 @@ -19,8 +19,13 @@ {% endif %} {% if artifactory_license4 %} - {% if artifactory_license4|length %} {{ artifactory_license4 }} {% endif %} -{% endif %} \ No newline at end of file +{% endif %} +{% if artifactory_license5 %} + +{% if artifactory_license5|length %} +{{ artifactory_license5 }} +{% endif %} +{% endif %} diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/binarystore.xml.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/binarystore.xml.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/binarystore.xml.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/binarystore.xml.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/installer-info.json.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/installer-info.json.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/installer-info.json.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/installer-info.json.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/join.key.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/join.key.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/join.key.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/join.key.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/master.key.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/master.key.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/master.key.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/master.key.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/system.yaml.j2 b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/system.yaml.j2 similarity index 96% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/system.yaml.j2 rename to Ansible/collection/jfrog/ansible/roles/artifactory/templates/system.yaml.j2 index 5b30963..419a0c3 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory/templates/system.yaml.j2 +++ b/Ansible/collection/jfrog/ansible/roles/artifactory/templates/system.yaml.j2 @@ -23,7 +23,7 @@ shared: primary: {{ artifactory_is_primary }} ## Sets this node as part of HA installation - haEnabled: {{ true }} + haEnabled: {{ artifactory_ha_enabled }} ## Database Configuration database: diff --git a/Ansible/collection/jfrog/ansible/roles/artifactory/vars/main.yml b/Ansible/collection/jfrog/ansible/roles/artifactory/vars/main.yml new file mode 100644 index 0000000..cd21505 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/artifactory/vars/main.yml @@ -0,0 +1,2 @@ +--- + diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/.travis.yml b/Ansible/collection/jfrog/ansible/roles/postgres/.travis.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/.travis.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/.travis.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/defaults/main.yml b/Ansible/collection/jfrog/ansible/roles/postgres/defaults/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/defaults/main.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/defaults/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/handlers/main.yml b/Ansible/collection/jfrog/ansible/roles/postgres/handlers/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/handlers/main.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/handlers/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/meta/main.yml b/Ansible/collection/jfrog/ansible/roles/postgres/meta/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/meta/main.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/meta/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/Debian.yml b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/Debian.yml similarity index 70% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/Debian.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/tasks/Debian.yml index 7ab9455..611332e 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/Debian.yml +++ b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/Debian.yml @@ -1,27 +1,29 @@ --- +- name: install python2 psycopg2 + apt: + name: python-psycopg2 + update_cache: yes + become: yes -- name: install ansible-related package - yum: - name: - - python3-psycopg2 - - sudo - - wget - state: present - become: True +- name: install python3 psycopg2 + apt: + name: python3-psycopg2 + update_cache: yes + become: yes - name: add postgres apt key apt_key: url: https://www.postgresql.org/media/keys/ACCC4CF8.asc id: "0x7FCC7D46ACCC4CF8" state: present - become: True + become: yes - name: register APT repository apt_repository: repo: deb http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-pgdg main state: present filename: pgdg - become: True + become: yes - name: install postgres packages apt: @@ -30,4 +32,4 @@ - postgresql-server-dev-{{ postgres_server_version }} - postgresql-contrib-{{ postgres_server_version }} state: present - become: True + become: yes diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/RedHat.yml b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/RedHat.yml similarity index 88% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/RedHat.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/tasks/RedHat.yml index 4be0aed..a30eba9 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/RedHat.yml +++ b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/RedHat.yml @@ -5,9 +5,9 @@ when: > # not for Fedora ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux' - become: True + become: yes -- name: install ansible-related package +- name: install python2 psycopg2 yum: name: - python-psycopg2 @@ -15,7 +15,15 @@ - wget - perl state: present - become: True + +- name: install python3 psycopg2 + yum: + name: + - python3-psycopg2 + - sudo + - wget + - perl + state: present - name: fixup some locale issues lineinfile: @@ -52,7 +60,7 @@ yum: name: "{{ base }}/{{ postgres_server_version }}/redhat/rhel-{{ ver }}-x86_64/{{ latest_version.stdout }}" state: present - become: True + become: yes - name: install postgres packages yum: @@ -61,4 +69,4 @@ - postgresql{{ postgres_server_pkg_version }}-contrib - postgresql{{ postgres_server_pkg_version }}-devel state: present - become: True + become: yes diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/main.yml b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/main.yml similarity index 72% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/main.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/tasks/main.yml index 4fad4e1..c267ba9 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/tasks/main.yml +++ b/Ansible/collection/jfrog/ansible/roles/postgres/tasks/main.yml @@ -2,23 +2,11 @@ - name: define distribution-specific variables include_vars: "{{ ansible_os_family }}.yml" -#- name: define postgres version-specific variables -# include_vars: "{{ lookup('first_found', params) }}" -# vars: -# params: -# files: -# - "{{ ansible_os_family }}_pg-{{ postgres_server_version }}.yml" -# - "{{ ansible_os_family }}_pg-default.yml" -# paths: -# - "vars" -# skip: true -# ignore_errors: true - - name: create directory for bind mount if necessary file: path: "{{ postgres_server_bind_mount_var_lib_pgsql_target }}" state: directory - become: true + become: yes when: postgres_server_bind_mount_var_lib_pgsql @@ -29,7 +17,7 @@ opts: bind state: mounted fstype: none - become: true + become: yes when: postgres_server_bind_mount_var_lib_pgsql - name: perform installation @@ -40,7 +28,7 @@ dest: /etc/profile.d/postgres-path.sh mode: a=rx content: "export PATH=$PATH:/usr/pgsql-{{ postgres_server_version }}/bin" - become: true + become: yes - name: initialize PostgreSQL database cluster environment: @@ -71,37 +59,47 @@ name: "{{ postgres_server_service_name }}" state: started enabled: yes - become: true + become: yes -- name: Create artifactory users +- name: Hold until Postgresql is up and running + wait_for: + port: 5432 + +- name: Create users become_user: postgres - become: true + become: yes postgresql_user: - name: "{{ db_user }}" - password: "{{ db_password }}" + name: "{{ item.db_user }}" + password: "{{ item.db_password }}" conn_limit: "-1" + loop: "{{ db_users|default([]) }}" no_log: true # secret passwords -- name: Create a artifactory database +- name: Create a database become_user: postgres - become: true + become: yes postgresql_db: - name: artifactory - owner: "{{ db_user }}" + name: "{{ item.db_name }}" + owner: "{{ item.db_owner }}" encoding: UTF-8 + loop: "{{ dbs|default([]) }}" -- name: Grant privs to artifactory on artifactory db +- name: Grant privs on db become_user: postgres - become: true + become: yes postgresql_privs: - database: artifactory - role: artifactory + database: "{{ item.db_name }}" + role: "{{ item.db_owner }}" state: present privs: ALL type: database + loop: "{{ dbs|default([]) }}" - name: restart postgres service: name: "{{ postgres_server_service_name }}" state: restarted - become: true \ No newline at end of file + become: yes + +- debug: + msg: "Restarted postgres service {{ postgres_server_service_name }}" \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/templates/pg_hba.conf.j2 b/Ansible/collection/jfrog/ansible/roles/postgres/templates/pg_hba.conf.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/templates/pg_hba.conf.j2 rename to Ansible/collection/jfrog/ansible/roles/postgres/templates/pg_hba.conf.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/templates/postgresql.conf.j2 b/Ansible/collection/jfrog/ansible/roles/postgres/templates/postgresql.conf.j2 similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/templates/postgresql.conf.j2 rename to Ansible/collection/jfrog/ansible/roles/postgres/templates/postgresql.conf.j2 diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/Debian.yml b/Ansible/collection/jfrog/ansible/roles/postgres/vars/Debian.yml similarity index 95% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/Debian.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/vars/Debian.yml index 7317089..1c1a7f4 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/Debian.yml +++ b/Ansible/collection/jfrog/ansible/roles/postgres/vars/Debian.yml @@ -1,7 +1,7 @@ --- postgres_server_cmd_initdb: /usr/lib/postgresql/{{ postgres_server_version }}/bin/initdb -D -postgres_server_initdb_become: True +postgres_server_initdb_become: yes postgres_server_data_location: /var/lib/postgresql/{{ postgres_server_version }}/main postgres_server_config_location: /etc/postgresql/{{ postgres_server_version }}/main postgres_server_service_name: postgresql@{{ postgres_server_version }}-main diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat.yml b/Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat_pg-9.6.yml b/Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat_pg-9.6.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat_pg-9.6.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat_pg-9.6.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat_pg-default.yml b/Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat_pg-default.yml similarity index 79% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat_pg-default.yml rename to Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat_pg-default.yml index 337fd62..3d974c2 100644 --- a/Ansible/artifactory7/jfrog/rt7ansible/roles/artifactory-postgres/vars/RedHat_pg-default.yml +++ b/Ansible/collection/jfrog/ansible/roles/postgres/vars/RedHat_pg-default.yml @@ -1,4 +1,4 @@ --- postgres_server_cmd_initdb: /usr/pgsql-{{ postgres_server_version }}/bin/initdb -D /var/lib/pgsql/{{ postgres_server_version }}/data -postgres_server_initdb_become: true +postgres_server_initdb_become: yes diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/.travis.yml b/Ansible/collection/jfrog/ansible/roles/xray/.travis.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/.travis.yml rename to Ansible/collection/jfrog/ansible/roles/xray/.travis.yml diff --git a/Ansible/collection/jfrog/ansible/roles/xray/defaults/main.yml b/Ansible/collection/jfrog/ansible/roles/xray/defaults/main.yml new file mode 100644 index 0000000..b8aad42 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/defaults/main.yml @@ -0,0 +1,23 @@ +--- +# 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.3.0 + +# whether to enable HA +xray_ha_enabled: true + +# The location where xray should install. +xray_download_directory: /opt/jfrog + +# The remote xray download file +xray_tar: https://bintray.com/standAloneDownload/downloadArtifact?agree=true&artifactPath=/jfrog/jfrog-xray/xray-linux/{{ xray_version }}/jfrog-xray-{{ xray_version }}-linux.tar.gz&callback_id=anonymous&product=xray + +#The xray install directory +xray_home: "{{ xray_download_directory }}/jfrog-xray-{{ xray_version }}-linux" + +#xray users and groups +xray_user: xray +xray_group: xray diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/handlers/main.yml b/Ansible/collection/jfrog/ansible/roles/xray/handlers/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray/handlers/main.yml rename to Ansible/collection/jfrog/ansible/roles/xray/handlers/main.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/meta/main.yml b/Ansible/collection/jfrog/ansible/roles/xray/meta/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/meta/main.yml rename to Ansible/collection/jfrog/ansible/roles/xray/meta/main.yml diff --git a/Ansible/collection/jfrog/ansible/roles/xray/tasks/Debian.yml b/Ansible/collection/jfrog/ansible/roles/xray/tasks/Debian.yml new file mode 100644 index 0000000..420c2d0 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/tasks/Debian.yml @@ -0,0 +1,37 @@ +--- +- name: Install db5.3-util + apt: + deb: "{{ xray_home }}/app/third-party/misc/db5.3-util_5.3.28-3ubuntu3_amd64.deb" + ignore_errors: yes + become: yes + +- name: Install db-util + apt: + deb: "{{ xray_home }}/app/third-party/misc/db-util_1_3a5.3.21exp1ubuntu1_all.deb" + ignore_errors: yes + become: yes + +- name: Install libssl + apt: + deb: "{{ xray_home }}/app/third-party/rabbitmq/libssl1.1_1.1.0j-1_deb9u1_amd64.deb" + ignore_errors: yes + become: yes + +- name: Install socat + apt: + deb: "{{ xray_home }}/app/third-party/rabbitmq/socat_1.7.3.1-2+deb9u1_amd64.deb" + become: yes + +- name: Install libwxbase3.0-0v5 + apt: + name: libwxbase3.0-0v5 + update_cache: yes + state: present + ignore_errors: yes + become: yes + +- name: Install erlang + apt: + deb: "{{ xray_home }}/app/third-party/rabbitmq/esl-erlang_21.2.1-1~ubuntu~xenial_amd64.deb" + become: yes + diff --git a/Ansible/collection/jfrog/ansible/roles/xray/tasks/RedHat.yml b/Ansible/collection/jfrog/ansible/roles/xray/tasks/RedHat.yml new file mode 100644 index 0000000..8d24eb7 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/tasks/RedHat.yml @@ -0,0 +1,16 @@ +--- +- name: Install db-utl + yum: + name: "{{ xray_home }}/app/third-party/misc/db4-utils-4.7.25-20.el6_7.x86_64.rpm" + state: present + +- name: Install socat + yum: + name: "{{ xray_home }}/app/third-party/rabbitmq/socat-1.7.3.2-2.el7.x86_64.rpm" + state: present + +- name: Install erlang + yum: + name: "{{ xray_home }}/app/third-party/rabbitmq/erlang-21.1.4-1.el7.centos.x86_64.rpm" + state: present + diff --git a/Ansible/collection/jfrog/ansible/roles/xray/tasks/main.yml b/Ansible/collection/jfrog/ansible/roles/xray/tasks/main.yml new file mode 100644 index 0000000..16810f6 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/tasks/main.yml @@ -0,0 +1,93 @@ +--- +- name: create group for xray + group: + name: "{{ xray_group }}" + state: present + become: yes + +- name: create user for xray + user: + name: "{{ xray_user }}" + group: "{{ xray_group }}" + system: yes + become: yes + +- name: ensure xray_download_directory exists + file: + path: "{{ xray_download_directory }}" + state: directory + become: yes + +- name: download xray + unarchive: + src: "{{ xray_tar }}" + dest: "{{ xray_download_directory }}" + remote_src: yes + owner: "{{ xray_user }}" + group: "{{ xray_group }}" + creates: "{{ xray_home }}" + become: yes + register: downloadxray + until: downloadxray is succeeded + retries: 3 + +- name: perform prerequisite installation + include_tasks: "{{ ansible_os_family }}.yml" + +- name: ensure etc exists + file: + path: "{{ xray_home }}/var/etc" + state: directory + owner: "{{ xray_user }}" + group: "{{ xray_group }}" + become: yes + +- name: configure system yaml + template: + src: system.yaml.j2 + dest: "{{ xray_home }}/var/etc/system.yaml" + become: yes + +- name: ensure {{ xray_home }}/var/etc/security/ exists + file: + path: "{{ xray_home }}/var/etc/security/" + state: directory + owner: "{{ xray_user }}" + group: "{{ xray_group }}" + become: yes + +- name: configure master key + template: + src: master.key.j2 + dest: "{{ xray_home }}/var/etc/security/master.key" + become: yes + +- name: configure join key + template: + src: join.key.j2 + dest: "{{ xray_home }}/var/etc/security/join.key" + become: yes + +- name: ensure {{ xray_home }}/var/etc/info/ exists + file: + path: "{{ xray_home }}/var/etc/info/" + state: directory + owner: "{{ xray_user }}" + group: "{{ xray_group }}" + become: yes + +- name: configure installer info + template: + src: installer-info.json.j2 + dest: "{{ xray_home }}/var/etc/info/installer-info.json" + become: yes + +- name: create xray service + shell: "{{ xray_home }}/app/bin/installService.sh" + become: yes + +- name: start and enable xray + service: + name: xray + state: restarted + become: yes \ No newline at end of file diff --git a/Ansible/collection/jfrog/ansible/roles/xray/templates/installer-info.json.j2 b/Ansible/collection/jfrog/ansible/roles/xray/templates/installer-info.json.j2 new file mode 100644 index 0000000..35bf1d0 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/templates/installer-info.json.j2 @@ -0,0 +1,8 @@ +{ + "productId": "Ansible_{{ ansible_marketplace }}_xray-{{xray_version}}/1.0.0", + "features": [ + { + "featureId": "Partner/ACC-006973" + } + ] +} \ No newline at end of file diff --git a/Ansible/collection/jfrog/ansible/roles/xray/templates/join.key.j2 b/Ansible/collection/jfrog/ansible/roles/xray/templates/join.key.j2 new file mode 100644 index 0000000..17d05d2 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/templates/join.key.j2 @@ -0,0 +1 @@ +{{ join_key }} \ No newline at end of file diff --git a/Ansible/collection/jfrog/ansible/roles/xray/templates/master.key.j2 b/Ansible/collection/jfrog/ansible/roles/xray/templates/master.key.j2 new file mode 100644 index 0000000..0462a64 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/templates/master.key.j2 @@ -0,0 +1 @@ +{{ master_key }} \ No newline at end of file diff --git a/Ansible/collection/jfrog/ansible/roles/xray/templates/system.yaml.j2 b/Ansible/collection/jfrog/ansible/roles/xray/templates/system.yaml.j2 new file mode 100644 index 0000000..206eb77 --- /dev/null +++ b/Ansible/collection/jfrog/ansible/roles/xray/templates/system.yaml.j2 @@ -0,0 +1,36 @@ +## @formatter:off +## JFROG ARTIFACTORY SYSTEM CONFIGURATION FILE +## HOW TO USE: comment-out any field and keep the correct yaml indentation by deleting only the leading '#' character. +configVersion: 1 + +## NOTE: JFROG_HOME is a place holder for the JFrog root directory containing the deployed product, the home directory for all JFrog products. +## Replace JFROG_HOME with the real path! For example, in RPM install, JFROG_HOME=/opt/jfrog + +## NOTE: Sensitive information such as passwords and join key are encrypted on first read. +## NOTE: The provided commented key and value is the default. + +## SHARED CONFIGURATIONS +## A shared section for keys across all services in this config +shared: + ## Base URL of the JFrog Platform Deployment (JPD) + ## This is the URL to the machine where JFrog Artifactory is deployed, or the load balancer pointing to it. It is recommended to use DNS names rather than direct IPs. + ## Examples: "http://jfrog.acme.com" or "http://10.20.30.40:8082" + jfrogUrl: {{ jfrog_url }} + + ## Node Settings + node: + ## A unique id to identify this node. + ## Default: auto generated at startup. + id: {{ ansible_machine_id }} + + ## Database Configuration + database: + ## One of: mysql, oracle, mssql, postgresql, mariadb + ## Default: Embedded derby + + ## Example for mysql/postgresql + type: "{{ db_type }}" + driver: "{{ db_driver }}" + url: "{{ db_url }}" + username: "{{ db_user }}" + password: "{{ db_password }}" \ No newline at end of file diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tests/inventory b/Ansible/collection/jfrog/ansible/roles/xray/tests/inventory similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray-postgres/tests/inventory rename to Ansible/collection/jfrog/ansible/roles/xray/tests/inventory diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tests/test.yml b/Ansible/collection/jfrog/ansible/roles/xray/tests/test.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray/tests/test.yml rename to Ansible/collection/jfrog/ansible/roles/xray/tests/test.yml diff --git a/Ansible/artifactory7/jfrog/rt7ansible/roles/xray/vars/main.yml b/Ansible/collection/jfrog/ansible/roles/xray/vars/main.yml similarity index 100% rename from Ansible/artifactory7/jfrog/rt7ansible/roles/xray/vars/main.yml rename to Ansible/collection/jfrog/ansible/roles/xray/vars/main.yml diff --git a/Ansible/infra/aws/lb-rt-xray-ha.json b/Ansible/infra/aws/lb-rt-xray-ha.json new file mode 100644 index 0000000..867e1df --- /dev/null +++ b/Ansible/infra/aws/lb-rt-xray-ha.json @@ -0,0 +1,769 @@ +{ + "Description": "This template deploys a VPC, with a pair of public and private subnets spread across two Availability Zones. It deploys an internet gateway, with a default route on the public subnets. It deploys a pair of NAT gateways (one in each AZ), and default routes for them in the private subnets.", + "Parameters": { + "SSHKeyName": { + "Description": "Name of the ec2 key you need one to use this template", + "Type": "AWS::EC2::KeyPair::KeyName", + "Default": "choose-key" + }, + "EnvironmentName": { + "Description": "An environment name that is prefixed to resource names", + "Type": "String", + "Default": "Ansible" + }, + "VpcCIDR": { + "Description": "Please enter the IP range (CIDR notation) for this VPC", + "Type": "String", + "Default": "10.192.0.0/16" + }, + "PublicSubnet1CIDR": { + "Description": "Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone", + "Type": "String", + "Default": "10.192.10.0/24" + }, + "PublicSubnet2CIDR": { + "Description": "Please enter the IP range (CIDR notation) for the public subnet in the second Availability Zone", + "Type": "String", + "Default": "10.192.11.0/24" + }, + "PrivateSubnet1CIDR": { + "Description": "Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone", + "Type": "String", + "Default": "10.192.20.0/24" + }, + "PrivateSubnet2CIDR": { + "Description": "Please enter the IP range (CIDR notation) for the private subnet in the second Availability Zone", + "Type": "String", + "Default": "10.192.21.0/24" + } + }, + "Mappings": { + "RegionToAmazonAMI": { + "us-east-1": { + "HVM64": "ami-03e33c1cefd1d3d74" + }, + "us-east-2": { + "HVM64": "ami-07d9419c80dc1113c" + }, + "us-west-1": { + "HVM64": "ami-0ee1a20d6b0c6a347" + }, + "us-west-2": { + "HVM64": "ami-0813245c0939ab3ca" + } + } + }, + "Resources": { + "VPC": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": { + "Ref": "VpcCIDR" + }, + "EnableDnsSupport": true, + "EnableDnsHostnames": true, + "Tags": [ + { + "Key": "Name", + "Value": { + "Ref": "EnvironmentName" + } + } + ] + } + }, + "InternetGateway": { + "Type": "AWS::EC2::InternetGateway", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": { + "Ref": "EnvironmentName" + } + } + ] + } + }, + "InternetGatewayAttachment": { + "Type": "AWS::EC2::VPCGatewayAttachment", + "Properties": { + "InternetGatewayId": { + "Ref": "InternetGateway" + }, + "VpcId": { + "Ref": "VPC" + } + } + }, + "PublicSubnet1": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": { + "Ref": "PublicSubnet1CIDR" + }, + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Public Subnet (AZ1)" + } + } + ] + } + }, + "PublicSubnet2": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": { + "Ref": "PublicSubnet2CIDR" + }, + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Public Subnet (AZ2)" + } + } + ] + } + }, + "PrivateSubnet1": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": { + "Ref": "PrivateSubnet1CIDR" + }, + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Private Subnet (AZ1)" + } + } + ] + } + }, + "PrivateSubnet2": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "AvailabilityZone": { + "Fn::Select": [ + 1, + { + "Fn::GetAZs": "" + } + ] + }, + "CidrBlock": { + "Ref": "PrivateSubnet2CIDR" + }, + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Private Subnet (AZ2)" + } + } + ] + } + }, + "NatGateway1EIP": { + "Type": "AWS::EC2::EIP", + "DependsOn": "InternetGatewayAttachment", + "Properties": { + "Domain": "vpc" + } + }, + "NatGateway2EIP": { + "Type": "AWS::EC2::EIP", + "DependsOn": "InternetGatewayAttachment", + "Properties": { + "Domain": "vpc" + } + }, + "NatGateway1": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "NatGateway1EIP", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "PublicSubnet1" + } + } + }, + "NatGateway2": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "NatGateway2EIP", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "PublicSubnet2" + } + } + }, + "PublicRouteTable": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Public Routes" + } + } + ] + } + }, + "DefaultPublicRoute": { + "Type": "AWS::EC2::Route", + "DependsOn": "InternetGatewayAttachment", + "Properties": { + "RouteTableId": { + "Ref": "PublicRouteTable" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "InternetGateway" + } + } + }, + "PublicSubnet1RouteTableAssociation": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "PublicRouteTable" + }, + "SubnetId": { + "Ref": "PublicSubnet1" + } + } + }, + "PublicSubnet2RouteTableAssociation": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "PublicRouteTable" + }, + "SubnetId": { + "Ref": "PublicSubnet2" + } + } + }, + "PrivateRouteTable1": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Private Routes (AZ1)" + } + } + ] + } + }, + "DefaultPrivateRoute1": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "PrivateRouteTable1" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "NatGateway1" + } + } + }, + "PrivateSubnet1RouteTableAssociation": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "PrivateRouteTable1" + }, + "SubnetId": { + "Ref": "PrivateSubnet1" + } + } + }, + "PrivateRouteTable2": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "VPC" + }, + "Tags": [ + { + "Key": "Name", + "Value": { + "Fn::Sub": "${EnvironmentName} Private Routes (AZ2)" + } + } + ] + } + }, + "DefaultPrivateRoute2": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "PrivateRouteTable2" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "NatGateway2" + } + } + }, + "PrivateSubnet2RouteTableAssociation": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "PrivateRouteTable2" + }, + "SubnetId": { + "Ref": "PrivateSubnet2" + } + } + }, + "EC2SecurityGroup": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "SSH, Port 80, Database", + "VpcId": { + "Ref": "VPC" + }, + "SecurityGroupIngress": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "CidrIp": "0.0.0.0/0" + }, + { + "IpProtocol": "tcp", + "FromPort": 5432, + "ToPort": 5432, + "CidrIp": "0.0.0.0/0" + }, + { + "IpProtocol": "tcp", + "FromPort": 8082, + "ToPort": 8082, + "CidrIp": "0.0.0.0/0" + }, + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "SourceSecurityGroupId": { + "Ref": "ELBSecurityGroup" + } + } + ] + } + }, + "ELBSecurityGroup": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "SSH and Port 80", + "VpcId": { + "Ref": "VPC" + }, + "SecurityGroupIngress": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "CidrIp": "0.0.0.0/0" + } + ] + } + }, + "BastionInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "RegionToAmazonAMI", + { + "Ref": "AWS::Region" + }, + "HVM64" + ] + }, + "InstanceInitiatedShutdownBehavior": "stop", + "InstanceType": "t2.medium", + "KeyName": { + "Ref": "SSHKeyName" + }, + "Monitoring": "true", + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": "true", + "DeviceIndex": "0", + "GroupSet": [ + { + "Ref": "EC2SecurityGroup" + } + ], + "SubnetId": { + "Ref": "PublicSubnet1" + } + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "bastion" + } + ], + "Tenancy": "default" + } + }, + "RTPriInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "RegionToAmazonAMI", + { + "Ref": "AWS::Region" + }, + "HVM64" + ] + }, + "InstanceInitiatedShutdownBehavior": "stop", + "InstanceType": "t2.medium", + "KeyName": { + "Ref": "SSHKeyName" + }, + "Monitoring": "true", + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": "false", + "DeviceIndex": "0", + "GroupSet": [ + { + "Ref": "EC2SecurityGroup" + } + ], + "SubnetId": { + "Ref": "PrivateSubnet1" + } + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "rtprimary" + } + ], + "Tenancy": "default" + } + }, + "RTSecInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "RegionToAmazonAMI", + { + "Ref": "AWS::Region" + }, + "HVM64" + ] + }, + "InstanceInitiatedShutdownBehavior": "stop", + "InstanceType": "t2.medium", + "KeyName": { + "Ref": "SSHKeyName" + }, + "Monitoring": "true", + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": "false", + "DeviceIndex": "0", + "GroupSet": [ + { + "Ref": "EC2SecurityGroup" + } + ], + "SubnetId": { + "Ref": "PrivateSubnet2" + } + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "rtsecondary" + } + ], + "Tenancy": "default" + } + }, + "XrayInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "RegionToAmazonAMI", + { + "Ref": "AWS::Region" + }, + "HVM64" + ] + }, + "InstanceInitiatedShutdownBehavior": "stop", + "InstanceType": "t2.medium", + "KeyName": { + "Ref": "SSHKeyName" + }, + "Monitoring": "true", + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": "false", + "DeviceIndex": "0", + "GroupSet": [ + { + "Ref": "EC2SecurityGroup" + } + ], + "SubnetId": { + "Ref": "PrivateSubnet1" + } + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "xray" + } + ], + "Tenancy": "default" + } + }, + "DBInstance": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": { + "Fn::FindInMap": [ + "RegionToAmazonAMI", + { + "Ref": "AWS::Region" + }, + "HVM64" + ] + }, + "InstanceInitiatedShutdownBehavior": "stop", + "InstanceType": "t2.medium", + "KeyName": { + "Ref": "SSHKeyName" + }, + "Monitoring": "true", + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": "false", + "DeviceIndex": "0", + "GroupSet": [ + { + "Ref": "EC2SecurityGroup" + } + ], + "SubnetId": { + "Ref": "PrivateSubnet1" + } + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "database" + } + ], + "Tenancy": "default" + } + }, + "EC2TargetGroup": { + "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", + "Properties": { + "HealthCheckIntervalSeconds": 30, + "HealthCheckProtocol": "HTTP", + "HealthCheckTimeoutSeconds": 15, + "HealthyThresholdCount": 2, + "Matcher": { + "HttpCode": "200,302" + }, + "Name": "EC2TargetGroup", + "Port": 80, + "Protocol": "HTTP", + "TargetGroupAttributes": [ + { + "Key": "deregistration_delay.timeout_seconds", + "Value": "20" + } + ], + "Targets": [ + { + "Id": { + "Ref": "RTPriInstance" + } + }, + { + "Id": { + "Ref": "RTSecInstance" + }, + "Port": 80 + } + ], + "UnhealthyThresholdCount": 3, + "VpcId": { + "Ref": "VPC" + }, + "Tags": [ + { + "Key": "Name", + "Value": "EC2TargetGroup" + }, + { + "Key": "Port", + "Value": 80 + } + ] + } + }, + "ALBListener": { + "Type": "AWS::ElasticLoadBalancingV2::Listener", + "Properties": { + "DefaultActions": [ + { + "Type": "forward", + "TargetGroupArn": { + "Ref": "EC2TargetGroup" + } + } + ], + "LoadBalancerArn": { + "Ref": "ApplicationLoadBalancer" + }, + "Port": 80, + "Protocol": "HTTP" + } + }, + "ApplicationLoadBalancer": { + "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", + "Properties": { + "Scheme": "internet-facing", + "Subnets": [ + { + "Ref": "PublicSubnet1" + }, + { + "Ref": "PublicSubnet2" + } + ], + "SecurityGroups": [ + { + "Ref": "ELBSecurityGroup" + } + ] + } + } + }, + + "Outputs": { + "VPC": { + "Description": "Virtual Private Cloud", + "Value": { + "Ref": "VPC" + } + }, + "ALBHostName": { + "Description": "Application Load Balancer Hostname", + "Value": { + "Fn::GetAtt": [ + "ApplicationLoadBalancer", + "DNSName" + ] + } + }, + "BastionInstancePublic": { + "Description": "Bastion", + "Value": { "Fn::GetAtt" : [ "BastionInstance", "PublicIp" ]} + }, + "BastionInstancePrivate": { + "Description": "Bastion", + "Value": { "Fn::GetAtt" : [ "BastionInstance", "PrivateIp" ]} + }, + "RTPriInstancePrivate": { + "Description": "RTPriInstance", + "Value": { "Fn::GetAtt" : [ "RTPriInstance", "PrivateIp" ]} + }, + "RTSecInstancePrivate": { + "Description": "RTSecInstance", + "Value": { "Fn::GetAtt" : [ "RTSecInstance", "PrivateIp" ]} + }, + "XrayInstancePrivate": { + "Description": "XrayInstance", + "Value": { "Fn::GetAtt" : [ "XrayInstance", "PrivateIp" ]} + }, + "DBInstancePrivate": { + "Description": "DBInstance", + "Value": { "Fn::GetAtt" : [ "DBInstance", "PrivateIp" ]} + } + } +} \ No newline at end of file diff --git a/Ansible/infra/azure/lb-rt-xray-ha.json b/Ansible/infra/azure/lb-rt-xray-ha.json new file mode 100644 index 0000000..1211d17 --- /dev/null +++ b/Ansible/infra/azure/lb-rt-xray-ha.json @@ -0,0 +1,679 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "vnetName": { + "type": "string", + "defaultValue": "vnet01", + "metadata": { + "description": "Name of new vnet to deploy into." + } + }, + "vnetAddressRange": { + "type": "string", + "defaultValue": "10.0.0.0/16", + "metadata": { + "description": "IP prefix for available addresses in vnet address space." + } + }, + "subnetAddressRange": { + "type": "string", + "defaultValue": "10.0.0.0/24", + "metadata": { + "description": "Subnet IP prefix MUST be within vnet IP prefix address space." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for all resources." + } + }, + "adminPublicKey": { + "type": "string", + "metadata": { + "description": "The ssh public key for the VMs." + } + }, + "sizeOfDiskInGB": { + "type": "int", + "defaultValue": 128, + "minValue": 128, + "maxValue": 1024, + "metadata": { + "description": "Size of data disk in GB 128-1024" + } + }, + "vmSize": { + "type": "string", + "defaultValue": "Standard_D2s_v3", + "metadata": { + "description": "Size of the VMs" + } + }, + "numberOfArtifactory": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 5, + "metadata": { + "description": "Number of Artifactory servers." + } + }, + "numberOfXray": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 5, + "metadata": { + "description": "Number of Xray servers." + } + }, + "numberOfDb": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 2, + "metadata": { + "description": "Number of database servers." + } + } + }, + "variables": { + "vnetName": "[parameters('vnetName')]", + "vnetAddressRange": "[parameters('vnetAddressRange')]", + "subnetAddressRange": "[parameters('subnetAddressRange')]", + "subnetName": "mainSubnet", + "loadBalancerName": "LB", + "loadBalancerIp": "lbIp", + "numberOfArtifactory": "[parameters('numberOfArtifactory')]", + "numberOfXray": "[parameters('numberOfXray')]", + "numberOfDb": "[parameters('numberOfDb')]", + "availabilitySetName": "availSet", + "vmArtPri": "vmArtPri", + "vmArtSec": "vmArtSec", + "vmXray": "vmXray", + "vmDb": "vmDb", + "storageAccountNameDiag": "[concat('diag',uniqueString(resourceGroup().id))]", + "subnet-id": "[resourceId('Microsoft.Network/virtualNetworks/subnets',variables('vnetName'),variables('subnetName'))]", + "imagePublisher": "Canonical", + "imageOffer": "UbuntuServer", + "imageSku": "16.04-LTS", + "mainNsg": "mainNsg", + "adminUsername": "ubuntu" + }, + "resources": [ + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/publicIPAddresses", + "name": "[variables('loadBalancerIp')]", + "location": "[parameters('location')]", + "properties": { + "publicIPAllocationMethod": "Static" + } + }, + { + "type": "Microsoft.Compute/availabilitySets", + "name": "[variables('availabilitySetName')]", + "apiVersion": "2019-12-01", + "location": "[parameters('location')]", + "sku": { + "name": "Aligned" + }, + "properties": { + "platformFaultDomainCount": 2, + "platformUpdateDomainCount": 2 + } + }, + { + "apiVersion": "2019-06-01", + "type": "Microsoft.Storage/storageAccounts", + "name": "[variables('storageAccountNameDiag')]", + "location": "[parameters('location')]", + "kind": "StorageV2", + "sku": { + "name": "Standard_LRS" + } + }, + { + "comments": "Simple Network Security Group for subnet [Subnet]", + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2019-08-01", + "name": "[variables('mainNsg')]", + "location": "[parameters('location')]", + "properties": { + "securityRules": [ + { + "name": "allow-ssh", + "properties": { + "description": "Allow SSH", + "protocol": "TCP", + "sourcePortRange": "*", + "destinationPortRange": "22", + "sourceAddressPrefix": "*", + "destinationAddressPrefix": "*", + "access": "Allow", + "priority": 100, + "direction": "Inbound", + "sourcePortRanges": [], + "destinationPortRanges": [], + "sourceAddressPrefixes": [], + "destinationAddressPrefixes": [] + } + }, + { + "name": "allow-http", + "properties": { + "description": "Allow HTTP", + "protocol": "TCP", + "sourcePortRange": "*", + "destinationPortRange": "80", + "sourceAddressPrefix": "*", + "destinationAddressPrefix": "*", + "access": "Allow", + "priority": 110, + "direction": "Inbound", + "sourcePortRanges": [], + "destinationPortRanges": [], + "sourceAddressPrefixes": [], + "destinationAddressPrefixes": [] + } + } + ] + } + }, + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/virtualNetworks", + "name": "[variables('vnetName')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Network/networkSecurityGroups', variables('mainNsg'))]" + ], + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[variables('vnetAddressRange')]" + ] + }, + "subnets": [ + { + "name": "[variables('subnetName')]", + "properties": { + "addressPrefix": "[variables('subnetAddressRange')]", + "networkSecurityGroup": { + "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('mainNsg'))]" + } + } + } + ] + } + }, + { + "apiVersion": "2018-10-01", + "name": "[variables('loadBalancerName')]", + "type": "Microsoft.Network/loadBalancers", + "location": "[parameters('location')]", + "dependsOn": [ + "[concat('Microsoft.Network/publicIPAddresses/',variables('loadBalancerIp'))]" + ], + "properties": { + "frontendIpConfigurations": [ + { + "name": "LBFE", + "properties": { + "publicIPAddress": { + "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('loadBalancerIp'))]" + } + } + } + ], + "backendAddressPools": [ + { + "name": "LBArt" + } + ], + "inboundNatRules": [ + { + "name": "ssh", + "properties": { + "frontendIPConfiguration": { + "id": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations',variables('loadBalancerName'),'LBFE')]" + }, + "frontendPort": 22, + "backendPort": 22, + "enableFloatingIP": false, + "idleTimeoutInMinutes": 4, + "protocol": "Tcp", + "enableTcpReset": false + } + } + ], + "loadBalancingRules": [ + { + "properties": { + "frontendIPConfiguration": { + "id": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'), 'LBFE')]" + }, + "backendAddressPool": { + "id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'), 'LBArt')]" + }, + "probe": { + "id": "[resourceId('Microsoft.Network/loadBalancers/probes', variables('loadBalancerName'), 'lbprobe')]" + }, + "protocol": "Tcp", + "frontendPort": 80, + "backendPort": 80, + "idleTimeoutInMinutes": 15 + }, + "name": "lbrule" + } + ], + "probes": [ + { + "properties": { + "protocol": "Tcp", + "port": 80, + "intervalInSeconds": 15, + "numberOfProbes": 2 + }, + "name": "lbprobe" + } + ] + } + }, + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/networkInterfaces", + "name": "[variables('vmArtPri')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[variables('vnetName')]", + "[variables('loadBalancerName')]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "subnet": { + "id": "[variables('subnet-id')]" + }, + "loadBalancerBackendAddressPools": [ + { + "id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools',variables('loadBalancerName'),'LBArt')]" + } + ], + "loadBalancerInboundNatRules": [ + { + "id": "[resourceId('Microsoft.Network/loadBalancers/inboundNatRules', variables('loadBalancerName'), 'ssh')]" + } + ] + } + } + ] + } + }, + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/networkInterfaces", + "name": "[concat(variables('vmArtSec'),copyindex())]", + "copy": { + "name": "netIntLoop", + "count": "[sub(variables('numberOfArtifactory'),1)]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[variables('vnetName')]", + "[variables('loadBalancerName')]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "subnet": { + "id": "[variables('subnet-id')]" + }, + "loadBalancerBackendAddressPools": [ + { + "id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools',variables('loadBalancerName'),'LBArt')]" + } + ] + } + } + ] + } + }, + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/networkInterfaces", + "name": "[concat(variables('vmXray'),copyindex())]", + "copy": { + "name": "netXrLoop", + "count": "[variables('numberOfXray')]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[variables('vnetName')]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "subnet": { + "id": "[variables('subnet-id')]" + } + } + } + ] + } + }, + { + "apiVersion": "2019-08-01", + "type": "Microsoft.Network/networkInterfaces", + "name": "[concat(variables('vmDb'),copyindex())]", + "copy": { + "name": "netDbLoop", + "count": "[variables('numberOfDb')]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[variables('vnetName')]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "subnet": { + "id": "[variables('subnet-id')]" + } + } + } + ] + } + }, + { + "apiVersion": "2019-12-01", + "type": "Microsoft.Compute/virtualMachines", + "name": "[variables('vmArtPri')]", + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]", + "[resourceId('Microsoft.Network/networkInterfaces', variables('vmArtPri'))]", + "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + ], + "properties": { + "availabilitySet": { + "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + }, + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "osProfile": { + "computerName": "[variables('vmArtPri')]", + "adminUsername": "[variables('adminUsername')]", + "linuxConfiguration": { + "disablePasswordAuthentication": true, + "ssh": { + "publicKeys": [ + { + "path": "[concat('/home/', variables('adminUsername'), '/.ssh/authorized_keys')]", + "keyData": "[parameters('adminPublicKey')]" + } + ] + } + } + }, + "storageProfile": { + "imageReference": { + "publisher": "[variables('imagePublisher')]", + "offer": "[variables('imageOffer')]", + "sku": "[variables('imageSku')]", + "version": "latest" + }, + "osDisk": { + "createOption": "FromImage" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('vmArtPri'))]" + } + ] + }, + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true, + "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]" + } + } + } + }, + { + "apiVersion": "2019-12-01", + "type": "Microsoft.Compute/virtualMachines", + "name": "[concat(variables('vmArtSec'), copyindex())]", + "copy": { + "name": "virtualMachineLoop", + "count": "[sub(variables('numberOfArtifactory'),1)]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]", + "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmArtSec'),copyindex()))]", + "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + ], + "properties": { + "availabilitySet": { + "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + }, + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "osProfile": { + "computerName": "[concat(variables('vmArtSec'), copyindex())]", + "adminUsername": "[variables('adminUsername')]", + "linuxConfiguration": { + "disablePasswordAuthentication": true, + "ssh": { + "publicKeys": [ + { + "path": "[concat('/home/', variables('adminUsername'), '/.ssh/authorized_keys')]", + "keyData": "[parameters('adminPublicKey')]" + } + ] + } + } + }, + "storageProfile": { + "imageReference": { + "publisher": "[variables('imagePublisher')]", + "offer": "[variables('imageOffer')]", + "sku": "[variables('imageSku')]", + "version": "latest" + }, + "osDisk": { + "createOption": "FromImage" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmArtSec'),copyindex()))]" + } + ] + }, + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true, + "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]" + } + } + } + }, + { + "apiVersion": "2019-12-01", + "type": "Microsoft.Compute/virtualMachines", + "name": "[concat(variables('vmXray'), copyindex())]", + "copy": { + "name": "virtualMachineLoop", + "count": "[variables('numberOfXray')]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]", + "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmXray'),copyindex()))]", + "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + ], + "properties": { + "availabilitySet": { + "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + }, + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "osProfile": { + "computerName": "[concat(variables('vmXray'), copyindex())]", + "adminUsername": "[variables('adminUsername')]", + "linuxConfiguration": { + "disablePasswordAuthentication": true, + "ssh": { + "publicKeys": [ + { + "path": "[concat('/home/', variables('adminUsername'), '/.ssh/authorized_keys')]", + "keyData": "[parameters('adminPublicKey')]" + } + ] + } + } + }, + "storageProfile": { + "imageReference": { + "publisher": "[variables('imagePublisher')]", + "offer": "[variables('imageOffer')]", + "sku": "[variables('imageSku')]", + "version": "latest" + }, + "osDisk": { + "createOption": "FromImage" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmXray'),copyindex()))]" + } + ] + }, + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true, + "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]" + } + } + } + }, + { + "apiVersion": "2019-12-01", + "type": "Microsoft.Compute/virtualMachines", + "name": "[concat(variables('vmDb'), copyindex())]", + "copy": { + "name": "virtualMachineLoop", + "count": "[variables('numberOfDb')]" + }, + "location": "[parameters('location')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountNameDiag'))]", + "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmDb'),copyindex()))]", + "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + ], + "properties": { + "availabilitySet": { + "id": "[resourceId('Microsoft.Compute/availabilitySets', variables('availabilitySetName'))]" + }, + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "osProfile": { + "computerName": "[concat(variables('vmDb'), copyindex())]", + "adminUsername": "[variables('adminUsername')]", + "linuxConfiguration": { + "disablePasswordAuthentication": true, + "ssh": { + "publicKeys": [ + { + "path": "[concat('/home/', variables('adminUsername'), '/.ssh/authorized_keys')]", + "keyData": "[parameters('adminPublicKey')]" + } + ] + } + } + }, + "storageProfile": { + "imageReference": { + "publisher": "[variables('imagePublisher')]", + "offer": "[variables('imageOffer')]", + "sku": "[variables('imageSku')]", + "version": "latest" + }, + "osDisk": { + "createOption": "FromImage" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmDb'),copyindex()))]" + } + ] + }, + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true, + "storageUri": "[reference(variables('storageAccountNameDiag'), '2019-06-01').primaryEndpoints.blob]" + } + } + } + } + ], + "outputs": { + "lbIp": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('loadBalancerIp'))).ipAddress]" + }, + "vmArtPriIp": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', variables('vmArtPri'))).ipConfigurations[0].properties.privateIPAddress]" + }, + "vmArtSecArrIp": { + "type": "array", + "copy": { + "count": "[sub(variables('numberOfArtifactory'),1)]", + "input": "[reference(resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmArtSec'),copyindex()))).ipConfigurations[0].properties.privateIPAddress]" + } + }, + "vmXrayArrIp": { + "type": "array", + "copy": { + "count": "[variables('numberOfXray')]", + "input": "[reference(resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmXray'),copyindex()))).ipConfigurations[0].properties.privateIPAddress]" + } + }, + "vmDbArrIp": { + "type": "array", + "copy": { + "count": "[variables('numberOfDb')]", + "input": "[reference(resourceId('Microsoft.Network/networkInterfaces', concat(variables('vmDb'),copyindex()))).ipConfigurations[0].properties.privateIPAddress]" + } + } + } +} \ No newline at end of file diff --git a/Ansible/pipelines.yaml b/Ansible/pipelines.yaml new file mode 100644 index 0000000..f857fe6 --- /dev/null +++ b/Ansible/pipelines.yaml @@ -0,0 +1,57 @@ +resources: + - name: ansibleRepo + type: GitRepo + configuration: + gitProvider: jefferyfryGithub + path: jefferyfry/JFrog-Cloud-Installers +pipelines: + - name: ansible_azure_automation_pipeline + steps: + - name: execute_azure_ansible_playbook + type: Bash + configuration: + runtime: + type: image + image: + auto: + language: java + versions: + - "8" + integrations: + - name: ansibleAzureKeys + - name: ansibleEnvVars + - name: ansiblePrivateKey + inputResources: + - name: ansibleRepo + execution: + onStart: + - echo "Executing Azure Ansible playbook..." + onExecute: + - sudo apt-get update + - sudo apt-get install gnupg2 + - sudo apt-get install software-properties-common + - sudo apt-add-repository --yes --update ppa:ansible/ansible + - sudo apt -y --allow-unauthenticated install ansible + - sudo pip install packaging + - sudo pip install msrestazure + - sudo pip install ansible[azure] + - cd ../dependencyState/resources/ansibleRepo + - echo 'Setting environment variables...' + - export artifactory_license1="$int_ansibleEnvVars_artifactory_license1" + - export artifactory_license2="$int_ansibleEnvVars_artifactory_license2" + - export artifactory_license3="$int_ansibleEnvVars_artifactory_license3" + - export master_key="$int_ansibleEnvVars_master_key" + - export join_key="$int_ansibleEnvVars_join_key" + - export ssh_public_key="$int_ansibleEnvVars_ssh_public_key" + - export arm_template="$int_ansibleEnvVars_arm_template" + - export azure_resource_group="$int_ansibleEnvVars_azure_resource_group" + - export clientId="$int_ansibleAzureKeys_appId" + - export clientSecret="$int_ansibleAzureKeys_password" + - export tenantId="$int_ansibleAzureKeys_tenant" + - printenv + - eval $(ssh-agent -s) + - ssh-add <(echo "$int_ansiblePrivateKey_key") + - az login --service-principal -u "$clientId" -p "$clientSecret" --tenant "$tenantId" + - ansible-playbook Ansible/test/azure/playbook.yaml + onComplete: + - echo "Azure Ansible playbook complete." \ No newline at end of file diff --git a/Ansible/project/rt-ha/hosts.yml b/Ansible/project/rt-ha/hosts.yml new file mode 100644 index 0000000..6246c53 --- /dev/null +++ b/Ansible/project/rt-ha/hosts.yml @@ -0,0 +1,51 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + children: + database: + hosts: + #artifactory database + 52.86.32.79: + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + artifactory: + vars: + artifactory_ha_enabled: true + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.160:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "ec2-100-25-104-198.compute-1.amazonaws.com" + certificate: | + -----BEGIN CERTIFICATE----- + x + -----END CERTIFICATE----- + certificate_key: | + -----BEGIN PRIVATE KEY----- + x + -----END PRIVATE KEY----- + children: + primary: + hosts: + 100.25.104.198: + artifactory_is_primary: true + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + secondary: + hosts: + 54.160.107.157: + 35.153.79.44: + vars: + artifactory_is_primary: false + diff --git a/Ansible/project/rt-ha/playbook.yml b/Ansible/project/rt-ha/playbook.yml new file mode 100644 index 0000000..ae9639e --- /dev/null +++ b/Ansible/project/rt-ha/playbook.yml @@ -0,0 +1,11 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: primary:secondary + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory + - jfrog/ansible/roles/artifactory-nginx-ssl \ No newline at end of file diff --git a/Ansible/project/rt-xray-ha-ssh-proxy/hosts.yml b/Ansible/project/rt-xray-ha-ssh-proxy/hosts.yml new file mode 100644 index 0000000..8651299 --- /dev/null +++ b/Ansible/project/rt-xray-ha-ssh-proxy/hosts.yml @@ -0,0 +1,60 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@13.82.225.20 -W %h:%p"' + children: + database: + hosts: + #artifactory database + 10.0.0.6: + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + #xray database + 10.0.0.4: + dbs: + - { db_name: "xraydb", db_owner: "xray" } + db_users: + - { db_user: "xray", db_password: "xray" } + artifactory: + vars: + artifactory_ha_enabled: true + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.6:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "rt.13.82.225.208.xip.io" + children: + primary: + hosts: + 10.0.0.8: + artifactory_is_primary: true + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + secondary: + hosts: + 10.0.0.9: + vars: + artifactory_is_primary: false + xray: + vars: + jfrog_url: http://rt.13.82.225.208.xip.io/ + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "postgres://10.0.0.4:5432/xraydb?sslmode=disable" + db_user: "xray" + db_password: "xray" + hosts: + 10.0.0.5: diff --git a/Ansible/project/rt-xray-ha-ssh-proxy/playbook.yml b/Ansible/project/rt-xray-ha-ssh-proxy/playbook.yml new file mode 100644 index 0000000..e47c473 --- /dev/null +++ b/Ansible/project/rt-xray-ha-ssh-proxy/playbook.yml @@ -0,0 +1,15 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: primary:secondary + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory + +- hosts: xray + gather_facts: true + roles: + - jfrog/ansible/roles/xray \ No newline at end of file diff --git a/Ansible/project/rt-xray-ha/hosts.yml b/Ansible/project/rt-xray-ha/hosts.yml new file mode 100644 index 0000000..0a79555 --- /dev/null +++ b/Ansible/project/rt-xray-ha/hosts.yml @@ -0,0 +1,55 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + children: + database: + hosts: + #artifactory database + 52.86.32.79: + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + #xray database + 100.25.152.93: + dbs: + - { db_name: "xraydb", db_owner: "xray" } + db_users: + - { db_user: "xray", db_password: "xray" } + artifactory: + vars: + artifactory_ha_enabled: true + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.51:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "ec2-18-210-33-94.compute-1.amazonaws.com" + children: + primary: + hosts: + 18.210.33.94: + artifactory_is_primary: true + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + xray: + vars: + jfrog_url: http://ec2-18-210-33-94.compute-1.amazonaws.com + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "postgres://10.0.0.5:5432/xraydb?sslmode=disable" + db_user: "xray" + db_password: "xray" + hosts: +# 34.229.56.166: + 54.237.68.180 diff --git a/Ansible/project/rt-xray-ha/playbook.yml b/Ansible/project/rt-xray-ha/playbook.yml new file mode 100644 index 0000000..1f55bcf --- /dev/null +++ b/Ansible/project/rt-xray-ha/playbook.yml @@ -0,0 +1,15 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: primary + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory + +- hosts: xray + gather_facts: true + roles: + - jfrog/ansible/roles/xray \ No newline at end of file diff --git a/Ansible/project/rt-xray/hosts.yml b/Ansible/project/rt-xray/hosts.yml new file mode 100644 index 0000000..c553954 --- /dev/null +++ b/Ansible/project/rt-xray/hosts.yml @@ -0,0 +1,43 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + children: + database: + hosts: + 34.239.107.0: + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + - { db_name: "xraydb", db_owner: "xray" } + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + - { db_user: "xray", db_password: "xray" } + artifactory: + hosts: + 54.237.207.135: + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.59:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "ec2-54-237-207-135.compute-1.amazonaws.com" + xray: + hosts: + 100.25.104.174: + jfrog_url: "http://ec2-54-237-207-135.compute-1.amazonaws.com" + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "postgres://10.0.0.59:5432/xraydb?sslmode=disable" + db_user: "xray" + db_password: "xray" diff --git a/Ansible/project/rt-xray/playbook.yml b/Ansible/project/rt-xray/playbook.yml new file mode 100644 index 0000000..9dea61f --- /dev/null +++ b/Ansible/project/rt-xray/playbook.yml @@ -0,0 +1,15 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: artifactory + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory + +- hosts: xray + gather_facts: true + roles: + - jfrog/ansible/roles/xray \ No newline at end of file diff --git a/Ansible/project/rt/hosts.yml b/Ansible/project/rt/hosts.yml new file mode 100644 index 0000000..79cf45d --- /dev/null +++ b/Ansible/project/rt/hosts.yml @@ -0,0 +1,31 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + children: + database: + hosts: + 52.86.32.79: + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + primary: + hosts: + 100.25.104.198: + artifactory_is_primary: true + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.160:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "ec2-100-25-104-198.compute-1.amazonaws.com" \ No newline at end of file diff --git a/Ansible/project/rt/playbook.yml b/Ansible/project/rt/playbook.yml new file mode 100644 index 0000000..472706a --- /dev/null +++ b/Ansible/project/rt/playbook.yml @@ -0,0 +1,10 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: primary + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory diff --git a/Ansible/project/ssl/hosts.yml b/Ansible/project/ssl/hosts.yml new file mode 100644 index 0000000..c6c8f9f --- /dev/null +++ b/Ansible/project/ssl/hosts.yml @@ -0,0 +1,39 @@ +--- +all: + vars: + ansible_user: "ubuntu" + ansible_ssh_private_key_file: "/Users/jefff/.ssh/ansible-priv.pem" + children: + database: + hosts: + 52.86.32.79: + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + primary: + hosts: + 100.25.104.198: + artifactory_is_primary: true + artifactory_license1: x + artifactory_license2: x + artifactory_license3: x + artifactory_license4: x + artifactory_license5: x + master_key: "c97b862469de0d94fbb7d48130637a5a" + join_key: "9bcca98f375c0728d907cc6ee39d4f02" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_url: "jdbc:postgresql://10.0.0.160:5432/artifactory" + db_user: "artifactory" + db_password: "Art1fAct0ry" + server_name: "ec2-100-25-104-198.compute-1.amazonaws.com" + certificate: | + -----BEGIN CERTIFICATE----- + x + -----END CERTIFICATE----- + certificate_key: | + -----BEGIN PRIVATE KEY----- + x + -----END PRIVATE KEY----- diff --git a/Ansible/project/ssl/playbook.yml b/Ansible/project/ssl/playbook.yml new file mode 100644 index 0000000..6f1ba22 --- /dev/null +++ b/Ansible/project/ssl/playbook.yml @@ -0,0 +1,11 @@ +--- +- hosts: database + gather_facts: true + roles: + - jfrog/ansible/roles/postgres + +- hosts: primary + gather_facts: true + roles: + - jfrog/ansible/roles/artifactory + - jfrog/ansible/roles/artifactory-nginx-ssl diff --git a/Ansible/test/aws/playbook.yaml b/Ansible/test/aws/playbook.yaml new file mode 100644 index 0000000..8474438 --- /dev/null +++ b/Ansible/test/aws/playbook.yaml @@ -0,0 +1,147 @@ +--- +- name: Provision AWS test infrastructure + hosts: localhost + tasks: + - shell: 'pwd' + register: cmd + + - debug: + msg: "{{ cmd.stdout }}" + - name: Create AWS test system + cloudformation: + stack_name: "{{ lookup('env', 'stack_name') }}" + state: "present" + region: "us-east-1" + disable_rollback: true + template: "{{ lookup('env', 'cfn_template') }}" + template_parameters: + SSHKeyName: "{{ lookup('env', 'ssh_public_key_name') }}" + tags: + Stack: "{{ lookup('env', 'stack_name') }}" + register: AWSDeployment + - name: Get AWS deployment details + debug: + var: AWSDeployment + + - name: Add bastion + add_host: + hostname: "{{ AWSDeployment.stack_outputs.BastionInstancePublic }}" + groups: bastion + ansible_user: "ubuntu" + - name: Add new RT primary to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.RTPriInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" + server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + artifactory_is_primary: true + artifactory_license1: "{{ lookup('env', 'artifactory_license1') }}" + artifactory_license2: "{{ lookup('env', 'artifactory_license2') }}" + artifactory_license3: "{{ lookup('env', 'artifactory_license3') }}" + groups: + - artifactory + + - name: Add RT secondaries to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.RTSecInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" + server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + artifactory_is_primary: false + groups: + - artifactory + + - name: Add xrays to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.XrayInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + jfrog_url: "http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "xray" + db_password: "xray" + db_url: "postgres://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/xraydb?sslmode=disable" + groups: xray + + - name: Add DBs to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.DBInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + - { db_user: "xray", db_password: "xray" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + - { db_name: "xraydb", db_owner: "xray" } + groups: database + + - name: Set up test environment url + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'urlval' + replace: "http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + + - name: Set up test environment external_ip + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'ipval' + replace: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + + - name: Set up test environment rt_password + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'passval' + replace: "password" + + - name: show testenv.yaml + debug: var=item + with_file: + - ../tests/src/test/resources/testenv.yaml + + - name: Wait 300 seconds for port 22 + wait_for: + port: 22 + host: "{{ AWSDeployment.stack_outputs.BastionInstancePublic }}" + delay: 10 + + - debug: + msg: "Unified URL is at http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + +- hosts: database + roles: + - postgres + +- hosts: artifactory + vars: + artifactory_ha_enabled: true + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "artifactory" + db_password: "Art1fAct0ry" + roles: + - artifactory + +- hosts: xray + roles: + - xray + +- name: Test + hosts: localhost + tasks: + - name: Run tests + shell: + cmd: ./gradlew clean unified_test + chdir: ../tests/ + - name: Cleanup and delete stack + cloudformation: + stack_name: "{{ lookup('env', 'stack_name') }}" + state: "absent" \ No newline at end of file diff --git a/Ansible/test/aws/runAws.sh b/Ansible/test/aws/runAws.sh new file mode 100755 index 0000000..fa8da2a --- /dev/null +++ b/Ansible/test/aws/runAws.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +ansible-playbook Ansible/test/aws/playbook.yaml \ No newline at end of file diff --git a/Ansible/test/azure/playbook.yaml b/Ansible/test/azure/playbook.yaml new file mode 100644 index 0000000..ae9625d --- /dev/null +++ b/Ansible/test/azure/playbook.yaml @@ -0,0 +1,161 @@ +--- +- name: Provision Azure test infrastructure + hosts: localhost + tasks: + - name: Create azure test system + azure_rm_deployment: + resource_group: "{{ lookup('env', 'azure_resource_group') }}" + location: eastus + name: AzureAnsibleInfra + parameters: + vnetName: + value: "vnetAnsible" + vnetAddressRange: + value: "10.0.0.0/16" + subnetAddressRange: + value: "10.0.0.0/24" + location: + value: "eastus" + adminPublicKey: + value: "{{ lookup('env', 'ssh_public_key') }}" + sizeOfDiskInGB: + value: 128 + vmSize: + value: Standard_D2s_v3 + numberOfArtifactory: + value: 2 + numberOfXray: + value: 1 + numberOfDb: + value: 1 + template_link: "{{ lookup('env', 'arm_template') }}" + register: azureDeployment + - name: Get Azure deployment details + debug: + var: azureDeployment + + - name: Add bastion + add_host: + hostname: "{{ azureDeployment.deployment.outputs.lbIp.value }}" + groups: bastion + ansible_user: "ubuntu" + - name: Add new RT primary to host group + add_host: + hostname: "{{ azureDeployment.deployment.outputs.vmArtPriIp.value }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' + db_url: "jdbc:postgresql://{{ azureDeployment.deployment.outputs.vmDbArrIp.value[0] }}:5432/artifactory" + server_name: "rt.{{ azureDeployment.deployment.outputs.lbIp.value }}.xip.io" + artifactory_is_primary: true + artifactory_license1: "{{ lookup('env', 'artifactory_license1') }}" + artifactory_license2: "{{ lookup('env', 'artifactory_license2') }}" + artifactory_license3: "{{ lookup('env', 'artifactory_license3') }}" + groups: + - artifactory + + - name: Add RT secondaries to host group + add_host: + hostname: "{{ item }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' + db_url: "jdbc:postgresql://{{ azureDeployment.deployment.outputs.vmDbArrIp.value[0] }}:5432/artifactory" + server_name: "rt.{{ azureDeployment.deployment.outputs.lbIp.value }}.xip.io" + artifactory_is_primary: false + groups: + - artifactory + loop: "{{ azureDeployment.deployment.outputs.vmArtSecArrIp.value }}" + + - name: Add xrays to host group + add_host: + hostname: "{{ item }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' + jfrog_url: "http://rt.{{ azureDeployment.deployment.outputs.lbIp.value }}.xip.io" + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "xray" + db_password: "xray" + db_url: "postgres://{{ azureDeployment.deployment.outputs.vmDbArrIp.value[0] }}:5432/xraydb?sslmode=disable" + groups: xray + loop: "{{ azureDeployment.deployment.outputs.vmXrayArrIp.value }}" + + - name: Add DBs to host group + add_host: + hostname: "{{ item }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + - { db_user: "xray", db_password: "xray" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + - { db_name: "xraydb", db_owner: "xray" } + groups: database + loop: "{{ azureDeployment.deployment.outputs.vmDbArrIp.value }}" + + - name: Set up test environment url + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'urlval' + replace: "http://rt.{{ azureDeployment.deployment.outputs.lbIp.value }}.xip.io" + + - name: Set up test environment external_ip + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'ipval' + replace: "{{ azureDeployment.deployment.outputs.lbIp.value }}" + + - name: Set up test environment rt_password + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'passval' + replace: "password" + + - name: show testenv.yaml + debug: var=item + with_file: + - ../tests/src/test/resources/testenv.yaml + + - name: Wait 300 seconds for port 22 + wait_for: + port: 22 + host: "{{ azureDeployment.deployment.outputs.lbIp.value }}" + delay: 10 + + - debug: + msg: "Unified URL is at http://rt.{{ azureDeployment.deployment.outputs.lbIp.value }}.xip.io" + +- hosts: database + roles: + - postgres + +- hosts: artifactory + vars: + artifactory_ha_enabled: true + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "artifactory" + db_password: "Art1fAct0ry" + roles: + - artifactory + +- hosts: xray + roles: + - xray + +- name: Test + hosts: localhost + tasks: + - name: Run tests + shell: + cmd: ./gradlew clean unified_test + chdir: ../tests/ + - name: Cleanup and delete a resource group + azure_rm_resourcegroup: + name: "{{ lookup('env', 'azure_resource_group') }}" + state: absent \ No newline at end of file diff --git a/Ansible/test/azure/runAzure.sh b/Ansible/test/azure/runAzure.sh new file mode 100755 index 0000000..c9d7e80 --- /dev/null +++ b/Ansible/test/azure/runAzure.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +ansible-playbook Ansible/test/azure/playbook.yaml \ No newline at end of file diff --git a/Ansible/test/tests/README.md b/Ansible/test/tests/README.md new file mode 100755 index 0000000..21db3cf --- /dev/null +++ b/Ansible/test/tests/README.md @@ -0,0 +1,19 @@ +## Test framework + +### How to run it locally + +``` +./gradlew clean commonTests +``` + +### Adding new tests + +### Gradle cleanup. Delete the folder: +``` + ~/.gradle/caches/ + ./gradlew clean +``` +### Or run +``` + ./gradlew clean +``` \ No newline at end of file diff --git a/Ansible/test/tests/build.gradle b/Ansible/test/tests/build.gradle new file mode 100644 index 0000000..1a41ee3 --- /dev/null +++ b/Ansible/test/tests/build.gradle @@ -0,0 +1,63 @@ +plugins { + id 'groovy' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + compile 'org.codehaus.groovy:groovy-all:3.0.0' + testCompile 'io.rest-assured:rest-assured:4.1.1' + testCompile 'org.testng:testng:6.14.3' + testCompile 'org.yaml:snakeyaml:1.17' +} + +test { + outputs.upToDateWhen { false } + useTestNG(){ + suites("src/test/groovy/testng.xml") + } + //maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 + testLogging { + showStandardStreams = true + } + +} + +task artifactory_jcr_test(type: Test) { + useTestNG() { + useDefaultListeners = true + suites 'src/test/groovy/testng.xml' + includeGroups ('common', 'jcr') + } + testLogging { + showStandardStreams = true + } +} + +task artifactory_ha_test(type: Test) { + useTestNG() { + useDefaultListeners = true + suites 'src/test/groovy/testng.xml' + includeGroups('common','pro') + } + testLogging { + showStandardStreams = true + } +} + +task unified_test(type: Test) { + useTestNG() { + useDefaultListeners = true + suites 'src/test/groovy/testng.xml' + includeGroups('common','pro','xray') + } + testLogging { + showStandardStreams = true + } +} + diff --git a/Ansible/test/tests/gradle/wrapper/gradle-wrapper.jar b/Ansible/test/tests/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..87b738c Binary files /dev/null and b/Ansible/test/tests/gradle/wrapper/gradle-wrapper.jar differ diff --git a/Ansible/test/tests/gradle/wrapper/gradle-wrapper.properties b/Ansible/test/tests/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..09c586a --- /dev/null +++ b/Ansible/test/tests/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Feb 12 10:23:21 PST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/Ansible/test/tests/gradlew b/Ansible/test/tests/gradlew new file mode 100755 index 0000000..af6708f --- /dev/null +++ b/Ansible/test/tests/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/Ansible/test/tests/gradlew.bat b/Ansible/test/tests/gradlew.bat new file mode 100644 index 0000000..6d57edc --- /dev/null +++ b/Ansible/test/tests/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Ansible/test/tests/settings.gradle b/Ansible/test/tests/settings.gradle new file mode 100644 index 0000000..d30fe0d --- /dev/null +++ b/Ansible/test/tests/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'fozzie_jfrog_tests' + diff --git a/Ansible/test/tests/src/test/groovy/steps/RepositorySteps.groovy b/Ansible/test/tests/src/test/groovy/steps/RepositorySteps.groovy new file mode 100644 index 0000000..3ae8b07 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/steps/RepositorySteps.groovy @@ -0,0 +1,139 @@ +package steps + + +import static io.restassured.RestAssured.given + +class RepositorySteps { + + def getHealthCheckResponse(artifactoryURL) { + return given() + .when() + .get("http://" + artifactoryURL + "/router/api/v1/system/health") + .then() + .extract().response() + } + + def ping() { + return given() + .when() + .get("/api/system/ping") + .then() + .extract().response() + } + + def createRepositories(File body, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/yaml") + .body(body) + .when() + .patch("/api/system/configuration") + .then() + .extract().response() + } + // https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-GetRepositories + def getRepos() { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/yaml") + .when() + .get("/api/repositories") + .then() + .extract().response() + + } + // https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-DeleteRepository + def deleteRepository(repoName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/yaml") + .when() + .delete("/api/repositories/" + repoName) + .then() + .extract().response() + + } + + def createDirectory(repoName, directoryName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/yaml") + .when() + .put("/" + repoName + "/" + directoryName) + .then() + .extract().response() + + } + + def deployArtifact(repoName, directoryName, artifact, filename) { + return given() + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body(artifact) + .when() + .put("/" + repoName + "/" + directoryName + "/" + filename) + .then() + .extract().response() + + } + + def deleteItem(repoName, directoryName, artifact, filename) { + return given() + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body(artifact) + .when() + .delete("/" + repoName + "/" + directoryName + "/" + filename) + .then() + .extract().response() + + } + + def getInfo(repoName, directoryName, artifact, filename) { + return given() + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body(artifact) + .when() + .get("/api/storage/" + repoName + "/" + directoryName + "/" + filename) + .then() + .extract().response() + + } + + def createSupportBundle(name, startDate, endDate) { + return given() + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body("{ \n" + + " \"name\":\"${name}\",\n" + + " \"description\":\"desc\",\n" + + " \"parameters\":{ \n" + + " \"configuration\": \"true\",\n" + + " \"system\": \"true\", \n" + + " \"logs\":{ \n" + + " \"include\": \"true\", \n" + + " \"start_date\":\"${startDate}\",\n" + + " \"end_date\":\"${endDate}\"\n" + + " },\n" + + " \"thread_dump\":{ \n" + + " \"count\": 1,\n" + + " \"interval\": 0\n" + + " }\n" + + " }\n" + + "}") + .when() + .post("/api/system/support/bundle") + .then() + .extract().response() + + } + + +} \ No newline at end of file diff --git a/Ansible/test/tests/src/test/groovy/steps/SecuritytSteps.groovy b/Ansible/test/tests/src/test/groovy/steps/SecuritytSteps.groovy new file mode 100644 index 0000000..4450b39 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/steps/SecuritytSteps.groovy @@ -0,0 +1,196 @@ +package steps + +import org.testng.annotations.DataProvider + +import static io.restassured.RestAssured.given + + +class SecuritytSteps { + + def createUser(usernameRt, emailRt, passwordRt) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"email\" : \"${emailRt}\",\n" + + " \"password\": \"${passwordRt}\"\n" + + "}") + .when() + .put("/api/security/users/${usernameRt}") + .then() + .extract().response() + } + + def getUserDetails(usernameRt) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/api/security/users/${usernameRt}") + .then() + .extract().response() + } + + def deleteUser(usernameRt) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .delete("/api/security/users/${usernameRt}") + .then() + .extract().response() + } + + def generateAPIKey(usernameRt, passwordRt) { + return given() + .auth() + .preemptive() + .basic("${usernameRt}", "${passwordRt}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .post("/api/security/apiKey") + .then() + .extract().response() + } + + def getAPIKey(usernameRt, passwordRt) { + return given() + .auth() + .preemptive() + .basic("${usernameRt}", "${passwordRt}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/api/security/apiKey") + .then() + .extract().response() + } + + def regenerateAPIKey(usernameRt, passwordRt) { + return given() + .auth() + .preemptive() + .basic("${usernameRt}", "${passwordRt}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .put("/api/security/apiKey") + .then() + .extract().response() + } + + def createGroup(groupName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\"name\": \"${groupName}\"}") + .when() + .put("/api/security/groups/${groupName}") + .then() + .extract().response() + } + + def getGroup(groupName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\"name\": \"${groupName}\"}") + .when() + .get("/api/security/groups/${groupName}") + .then() + .extract().response() + } + + def deleteGroup(groupName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .delete("/api/security/groups/${groupName}") + .then() + .extract().response() + } + + def createPermissions(permissionName, repository, user1, user2, + group1, group2, action1, action2, action3) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"name\": \"${permissionName}\",\n" + + " \"repo\": {\n" + + " \"repositories\": [ \"${repository}\" ],\n" + + " \"actions\": {\n" + + " \"users\" : {\n" + + " \"${user1}\": [ \"${action1}\",\"${action2}\",\"${action3}\" ], \n" + + " \"${user2}\" : [ \"${action1}\",\"${action2}\",\"${action3}\" ]\n" + + " },\n" + + " \"groups\" : {\n" + + " \"${group1}\" : [ \"${action1}\",\"${action2}\",\"${action3}\" ],\n" + + " \"${group2}\" : [ \"${action1}\",\"${action2}\" ]\n" + + " }\n" + + " }\n" + + " }\n" + + "}") + .when() + .put("/api/v2/security/permissions/testPermission") + .then() + .extract().response() + } + + def getPermissions( permissionName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/api/v2/security/permissions/${permissionName}") + .then() + .extract().response() + } + + def deletePermissions(permissionName) { + return given() + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .delete("/api/v2/security/permissions/${permissionName}") + .then() + .extract().response() + } + + + // Data providers + + @DataProvider(name="users") + public Object[][] users() { + return new Object[][]{ + ["testuser0", "email0@jfrog.com", "password123"], + ["testuser1", "email1@jfrog.com", "password123"], + ["testuser2", "email2@jfrog.com", "password123"], + ["testuser3", "email3@jfrog.com", "password123"], + ["testuser4", "email4@jfrog.com", "password123"], + ["testuser5", "email5@jfrog.com", "password123"], + ["testuser6", "email6@jfrog.com", "password123"], + ["testuser7", "email7@jfrog.com", "password123"], + ["testuser8", "email8@jfrog.com", "password123"], + ["testuser9", "email9@jfrog.com", "password123"] + } + } + + @DataProvider(name="groups") + public Object[][] groups() { + return new Object[][]{ + ["test-group-0"], + ["test-group-1"], + ["test-group-2"], + ["test-group-3"], + ["test-group-4"], + ["test-group-5"], + ["test-group-6"], + ["test-group-7"], + ["test-group-8"], + ["test-group-9"] + } + } +} diff --git a/Ansible/test/tests/src/test/groovy/steps/XraySteps.groovy b/Ansible/test/tests/src/test/groovy/steps/XraySteps.groovy new file mode 100644 index 0000000..552ba93 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/steps/XraySteps.groovy @@ -0,0 +1,585 @@ +package steps + +import org.testng.annotations.DataProvider + +import static io.restassured.RestAssured.given + +class XraySteps { + + def createIssueEvent(issueID, cve, summary, description, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"id\": \"${issueID}\",\n" + + " \"type\": \"Security\",\n" + + " \"provider\": \"JFrog\",\n" + + " \"package_type\": \"maven\",\n" + + " \"severity\": \"High\",\n" + + " \"components\": [\n" + + " {\n" + + " \"id\": \"aero:aero\",\n" + + " \"vulnerable_versions\": [\n" + + " \"[0.2.3]\"\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"cves\": [\n" + + " {\n" + + " \"cve\": \"${cve}\",\n" + + " \"cvss_v2\": \"2.4\"\n" + + " }\n" + + " ],\n" + + " \"summary\": \"${summary}\",\n" + + " \"description\": \"${description}\",\n" + + " \"sources\": [\n" + + " {\n" + + " \"source_id\": \"${cve}\"\n" + + " }\n" + + " ]\n" + + "}") + .when() + .post("/v1/events") + .then() + .extract().response() + } + + def updateIssueEvent(issueID, cve, summary, description, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"type\": \"Security\",\n" + + " \"provider\": \"JFrog\",\n" + + " \"package_type\": \"maven\",\n" + + " \"severity\": \"High\",\n" + + " \"components\": [\n" + + " {\n" + + " \"id\": \"aero:aero\",\n" + + " \"vulnerable_versions\": [\n" + + " \"[0.2.3]\"\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"cves\": [\n" + + " {\n" + + " \"cve\": \"${cve}\",\n" + + " \"cvss_v2\": \"2.4\"\n" + + " }\n" + + " ],\n" + + " \"summary\": \"${summary}\",\n" + + " \"description\": \"${description}\",\n" + + " \"sources\": [\n" + + " {\n" + + " \"source_id\": \"${cve}\"\n" + + " }\n" + + " ]\n" + + "}") + .when() + .put("/v1/events/${issueID}") + .then() + .extract().response() + } + + def createPolicy(policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"name\": \"${policyName}\",\n" + + " \"type\": \"security\",\n" + + " \"description\": \"some description\",\n" + + " \"rules\": [\n" + + " {\n" + + " \"name\": \"securityRule\",\n" + + " \"priority\": 1,\n" + + " \"criteria\": {\n" + + " \"min_severity\": \"High\"\n" + + " },\n" + + " \"actions\": {\n" + + " \"mails\": [\n" + + " \"mail1@example.com\",\n" + + " \"mail2@example.com\"\n" + + " ],\n" + + " \"fail_build\": true,\n" + + " \"block_download\": {\n" + + " \"unscanned\": true,\n" + + " \"active\": true\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + "}") + .when() + .post("/v1/policies") + .then() + .extract().response() + } + + def updatePolicy(policyName, description, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"name\": \"${policyName}\",\n" + + " \"type\": \"security\",\n" + + " \"description\": \"${description}\",\n" + + " \"rules\": [\n" + + " {\n" + + " \"name\": \"securityRule\",\n" + + " \"priority\": 1,\n" + + " \"criteria\": {\n" + + " \"min_severity\": \"High\"\n" + + " },\n" + + " \"actions\": {\n" + + " \"mails\": [\n" + + " \"mail1@example.com\",\n" + + " \"mail2@example.com\"\n" + + " ],\n" + + " \"fail_build\": true,\n" + + " \"block_download\": {\n" + + " \"unscanned\": true,\n" + + " \"active\": true\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + "}") + .when() + .put("/v1/policies/${policyName}") + .then() + .extract().response() + } + + def getPolicy(policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/policies/${policyName}") + .then() + .extract().response() + } + + def getPolicies(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/policies") + .then() + .extract().response() + } + + def deletePolicy(policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .delete("/v1/policies/${policyName}") + .then() + .extract().response() + } + + def getIssueEvent(issueID, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/events/${issueID}") + .then() + .extract().response() + } + + def createWatchEvent(watchName, policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"general_data\": {\n" + + " \"name\": \"${watchName}\",\n" + + " \"description\": \"This is a new watch created using API V2\",\n" + + " \"active\": true\n" + + " },\n" + + " \"project_resources\": {\n" + + " \"resources\": [\n" + + " {\n" + + " \"type\": \"all-repos\",\n" + + " \"filters\": [\n" + + " {\n" + + " \"type\": \"package-type\",\n" + + " \"value\": \"Docker\"\n" + + " },\n" + + " {\n" + + " \"type\": \"package-type\",\n" + + " \"value\": \"Debian\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"assigned_policies\": [\n" + + " {\n" + + " \"name\": \"${policyName}\",\n" + + " \"type\": \"security\"\n" + + " }\n" + + " ]\n" + + "}") + .when() + .post("/v2/watches") + .then() + .extract().response() + } + + def updateWatchEvent(watchName, description, policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"general_data\": {\n" + + " \"name\": \"${watchName}\",\n" + + " \"description\": \"${description}\",\n" + + " \"active\": true\n" + + " },\n" + + " \"project_resources\": {\n" + + " \"resources\": [\n" + + " {\n" + + " \"type\": \"all-repos\",\n" + + " \"filters\": [\n" + + " {\n" + + " \"type\": \"package-type\",\n" + + " \"value\": \"Docker\"\n" + + " },\n" + + " {\n" + + " \"type\": \"package-type\",\n" + + " \"value\": \"Debian\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"assigned_policies\": [\n" + + " {\n" + + " \"name\": \"${policyName}\",\n" + + " \"type\": \"security\"\n" + + " }\n" + + " ]\n" + + "}") + .when() + .put("/v2/watches/${watchName}") + .then() + .extract().response() + } + + def getWatchEvent(watchName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v2/watches/${watchName}") + .then() + .extract().response() + } + + def deleteWatchEvent(watchName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .delete("/v2/watches/${watchName}") + .then() + .extract().response() + } + + def assignPolicy(watchName, policyName, username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"watches\": [\n" + + " \"${watchName}\"\n" + + " ]\n" + + "}") + .when() + .post("/v1/policies/${policyName}/assign") + .then() + .extract().response() + } + + def getIntegrationConfiguration(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/integration") + .then() + .extract().response() + } + + def addtIntegrationConfiguration(username, password, vendorName) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"vendor\": \"${vendorName}\",\n" + + " \"api_key\": \"12345\",\n" + + " \"enabled\": true,\n" + + " \"context\": \"project_id\",\n" + + " \"url\": \"https://saas.whitesourcesoftware.com/xray\",\n" + + " \"description\": \"WhiteSource provides a simple yet powerful open source security and licenses management solution. More details at http://www.whitesourcesoftware.com.\",\n" + + " \"test_url\": \"https://saas.whitesourcesoftware.com/xray/api/checkauth\"\n" + + "}") + .when() + .post("/v1/integration") + .then() + .extract().response() + } + + def postSystemParameters(username, password, body) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body(body) + .when() + .put("/v1/configuration/systemParameters") + .then() + .extract().response() + } + + def getSystemParameters(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/configuration/systemParameters") + .then() + .extract().response() + } + + def getBinaryManager(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/binMgr/default") + .then() + .extract().response() + } + + + def getIndexingConfiguration(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .when() + .get("/v1/binMgr/default/repos") + .then() + .extract().response() + } + + def updateIndexingConfiguration(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"indexed_repos\": [\n" + + " {\n" + + " \"name\": \"docker-local\",\n" + + " \"type\": \"local\",\n" + + " \"pkg_type\": \"Docker\"\n" + + " },\n" + + " {\n" + + " \"name\": \"generic-dev-local\",\n" + + " \"type\": \"local\",\n" + + " \"pkg_type\": \"Generic\"\n" + + " }\n" + + " ],\n" + + " \"non_indexed_repos\": []\n" + + "}") + .when() + .put("/v1/binMgr/default/repos") + .then() + .extract().response() + } + + + + def startScan(username, password, componentID) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body("{\n" + + " \"componentID\": \"${componentID}\"\n" + + "}") + .when() + .post("/v1/scanArtifact") + .then() + .extract().response() + } + + + def artifactSummary(username, password, artifactPath) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("content-Type", "application/json") + .body("{\n" + + " \"checksums\": [\n" + + " \"\"\n" + + " ],\n" + + " \"paths\": [\n" + + " \"${artifactPath}\"\n" + + " ]\n" + + "}") + .when() + .post("/v1/summary/artifact") + .then() + .extract().response() + } + + def createSupportBundle(username, password, name, startDate, endDate) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .body("{ \n" + + " \"name\":\"${name}\",\n" + + " \"description\":\"desc\",\n" + + " \"parameters\":{ \n" + + " \"configuration\": true,\n" + + " \"system\": true, \n" + + " \"logs\":{ \n" + + " \"include\": true, \n" + + " \"start_date\":\"${startDate}\",\n" + + " \"end_date\":\"${endDate}\"\n" + + " },\n" + + " \"thread_dump\":{ \n" + + " \"count\": 1,\n" + + " \"interval\": 0\n" + + " }\n" + + " }\n" + + "}") + .when() + .post("/v1/system/support/bundle") + .then() + .extract().response() + + } + + def getSystemMonitoringStatus(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .when() + .get("/v1/monitor") + .then() + .extract().response() + } + + def xrayPingRequest(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .when() + .get("/v1/system/ping") + .then() + .extract().response() + } + + def xrayGetVersion(username, password) { + return given() + .auth() + .preemptive() + .basic("${username}", "${password}") + .header("Cache-Control", "no-cache") + .header("Content-Type", "application/json") + .when() + .get("/v1/system/version") + .then() + .extract().response() + } + + // Data providers + + @DataProvider(name = "issueEvents") + public Object[][] issueEvents() { + return new Object[][]{ + ["XRAY-", "CVE-2017-2000386", "A very important custom issue", "A very important custom issue"] + + } + } + +} \ No newline at end of file diff --git a/Ansible/test/tests/src/test/groovy/testng.xml b/Ansible/test/tests/src/test/groovy/testng.xml new file mode 100644 index 0000000..5342660 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/testng.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ansible/test/tests/src/test/groovy/tests/HealthCheckTest.groovy b/Ansible/test/tests/src/test/groovy/tests/HealthCheckTest.groovy new file mode 100644 index 0000000..4e7fcce --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/tests/HealthCheckTest.groovy @@ -0,0 +1,57 @@ +package tests + +import io.restassured.RestAssured +import io.restassured.path.json.JsonPath +import io.restassured.response.Response +import org.hamcrest.Matchers +import org.testng.Reporter +import org.testng.annotations.BeforeSuite +import org.testng.annotations.Test +import steps.RepositorySteps +import org.yaml.snakeyaml.Yaml +import utils.Shell + +class HealthCheckTest extends RepositorySteps{ + Yaml yaml = new Yaml() + def configFile = new File("./src/test/resources/testenv.yaml") + def config = yaml.load(configFile.text) + def artifactoryURL + + + @BeforeSuite(alwaysRun = true) + def setUp() { + artifactoryURL = config.artifactory.external_ip + RestAssured.baseURI = "http://${artifactoryURL}/artifactory" + } + + + @Test(priority=0, groups="common", testName = "Health check for all 4 services") + void healthCheckTest(){ + Response response = getHealthCheckResponse(artifactoryURL) + response.then().assertThat().statusCode(200). + body("router.state", Matchers.equalTo("HEALTHY")) + + int bodySize = response.body().jsonPath().getList("services").size() + for (int i = 0; i < bodySize; i++) { + JsonPath jsonPathEvaluator = response.jsonPath() + String serviceID = jsonPathEvaluator.getString("services[" + i + "].service_id") + String nodeID = jsonPathEvaluator.getString("services[" + i + "].node_id") + response.then(). + body("services[" + i + "].state", Matchers.equalTo("HEALTHY")) + + Reporter.log("- Health check. Service \"" + serviceID + "\" on node \"" + nodeID + "\" is healthy", true) + } + + } + + @Test(priority=1, groups=["ping","common"], testName = "Ping (In HA 200 only when licences were added)") + void pingTest() { + Response response = ping() + response.then().assertThat().statusCode(200). + body(Matchers.hasToString("OK")) + Reporter.log("- Ping test. Service is OK", true) + } + + + +} diff --git a/Ansible/test/tests/src/test/groovy/tests/RepositoryTest.groovy b/Ansible/test/tests/src/test/groovy/tests/RepositoryTest.groovy new file mode 100644 index 0000000..e6c6c3a --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/tests/RepositoryTest.groovy @@ -0,0 +1,302 @@ +package tests + +import io.restassured.RestAssured +import io.restassured.path.json.JsonPath +import io.restassured.response.Response +import org.hamcrest.Matchers +import org.testng.Reporter +import org.testng.annotations.BeforeTest +import org.testng.annotations.Test +import org.yaml.snakeyaml.Yaml +import steps.RepositorySteps + +import java.time.LocalDate + +import static org.hamcrest.Matchers.containsString +import static org.hamcrest.Matchers.containsStringIgnoringCase +import static org.hamcrest.Matchers.equalTo +import static org.hamcrest.Matchers.equalToIgnoringCase +import static org.hamcrest.Matchers.greaterThanOrEqualTo + + +class RepositoryTest extends RepositorySteps{ + Yaml yaml = new Yaml() + def configFile = new File("./src/test/resources/testenv.yaml") + def repoListHA = new File("./src/test/resources/repositories/CreateDefault.yaml") + def repoListJCR = new File("./src/test/resources/repositories/CreateJCR.yaml") + def artifact = new File("./src/test/resources/repositories/artifact.zip") + def config = yaml.load(configFile.text) + def artifactoryURL + def username + def password + + @BeforeTest(groups=["jcr", "pro"]) + def setUp() { + artifactoryURL = config.artifactory.external_ip + username = config.artifactory.rt_username + password = config.artifactory.rt_password + RestAssured.baseURI = "http://${artifactoryURL}/artifactory" + RestAssured.authentication = RestAssured.basic(username, password); + RestAssured.useRelaxedHTTPSValidation(); + } + + + @Test(priority=1, groups=["pro"], testName = "Delete sample repositories") + void deleteReposTest(){ + Response getRepoResponse = getRepos() + JsonPath jsonPathEvaluator = getRepoResponse.jsonPath() + List repoNames = jsonPathEvaluator.getList("key", String.class) + for (int i = 0; i < repoNames.size(); i ++){ + Response delete = deleteRepository(repoNames[i], username, password) + delete.then().statusCode(200) + } + + Reporter.log("- Delete sample HA repositories. All repositories were successfully deleted", true) + } + + @Test(priority=1, groups=["jcr",], testName = "Delete sample repositories JCR") + void deleteDefaultJCRReposTest(){ + Response getRepoResponse = getRepos() + JsonPath jsonPathEvaluator = getRepoResponse.jsonPath() + List repoNames = jsonPathEvaluator.getList("key", String.class) + for (int i = 0; i < repoNames.size(); i ++){ + Response delete = deleteRepository(repoNames[i], username, password) + delete.then().statusCode(400).body("errors[0].message", + containsStringIgnoringCase("This REST API is available only in Artifactory Pro")) + } + + Reporter.log("- Delete sample JCR repositories. " + + "Verified - this REST API is available only in Artifactory Pro", true) + } + + @Test(priority=2, groups=["pro"], testName = "Create a list of repositories for HA, specified in YAML file") + void createDefaultHAReposTest(){ + def body + def expectedMessage + body = repoListHA + expectedMessage = "383 changes to config merged successfully" + Response response = createRepositories(body, username, password) + response.then().assertThat().statusCode(200) + .body(Matchers.hasToString(expectedMessage)) + .log().body() + + Reporter.log("- Create repositories for HA distribution. Successfully created", true) + } + + @Test(priority=2, groups=["jcr"], testName = "Create a list of repositories for JCR, specified in YAML file") + void createDefaultJCRReposTest(){ + def body + def expectedMessage + body = repoListJCR + expectedMessage = "82 changes to config merged successfully" + Response response = createRepositories(body, username, password) + response.then().assertThat().statusCode(200) + .body(Matchers.hasToString(expectedMessage)) + .log().body() + + Reporter.log("- Create repositories for JCR. Successfully created", true) + } + + @Test(priority=3, groups=["pro"], testName = "Verify HA repositories were created successfully") + void checkDefaultHAReposTest(){ + Response response = getRepos() + def numberOfRepos = response.then().extract().path("size()") + def expectedReposNumber = 84 + println("Number of created repositories is ${numberOfRepos}") + response.then().assertThat().statusCode(200) + .body("size()", greaterThanOrEqualTo(expectedReposNumber)) + + Reporter.log("- Verify HA repos were created. ${numberOfRepos} repositories were created", true) + } + + @Test(priority=3, groups=["jcr"], testName = "Verify JCR repositories were created successfully") + void checkDefaultJCRReposTest(){ + Response response = getRepos() + def numberOfRepos = response.then().extract().path("size()") + def expectedReposNumber = 17 + response.then().assertThat().statusCode(200) + .body("size()", greaterThanOrEqualTo(expectedReposNumber)) + + Reporter.log("- Verify JCR repos were created. ${numberOfRepos} repositories were created", true) + } + + @Test(priority=4, groups=["jcr","pro"], testName = "Create a directory in generic repo") + void createDirectoryTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory/" + Response response = createDirectory(repoName, directoryName) + response.then().assertThat().statusCode(201) + .body("repo", equalTo(repoName)) + .body("path", equalTo("/" + directoryName)) + .body("uri", equalTo("http://" + artifactoryURL + ":80/artifactory/" + repoName + "/" + directoryName)) + + Reporter.log("- Create folder. Folder successfully created", true) + } + + @Test(priority=5, groups=["jcr","pro"], testName = "Deploy file to generic repo") + void deployArtifactToGenericTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory" + def filename = "artifact.zip" + Response response = deployArtifact(repoName, directoryName, artifact, filename) + response.then().assertThat().statusCode(201) + .body("repo", equalTo(repoName)) + .body("path", equalTo("/" + directoryName + "/" + filename)) + .body("downloadUri", equalTo("http://" + artifactoryURL + ":80/artifactory/" + repoName + "/" + + directoryName + "/" + filename)) + + Reporter.log("- Deploy artifact. Artifact successfully deployed", true) + } + + @Test(priority=6, groups=["jcr", "pro"], testName = "Get the artifact info") + void getArtifactinfoTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory" + def filename = "artifact.zip" + Response response = getInfo(repoName, directoryName, artifact, filename) + response.then().assertThat().statusCode(200) + .body("repo", equalTo(repoName)) + .body("path", equalTo("/" + directoryName + "/" + filename)) + .body("downloadUri", equalTo("http://" + artifactoryURL + ":80/artifactory/" + repoName + "/" + + directoryName + "/" + filename)) + + Reporter.log("- Get the artifact info. Artifact info is successfully returned", true) + } + + @Test(priority=7, groups=["jcr", "pro"], testName = "Delete item") + void deleteJCRItemTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory" + def filename = "artifact.zip" + Response response = deleteItem(repoName, directoryName, artifact, filename) + response.then().assertThat().statusCode(204) + + Response verification = getInfo(repoName, directoryName, artifact, filename) + verification.then().statusCode(404) + .body("errors[0].message", equalToIgnoringCase("Unable to find item")) + + Reporter.log("- Delete item. File has been deleted successfully", true) + } + + @Test(priority=8, groups=["pro"], testName = "Create support bundle") + void createSupportBundleHATest(){ + def name = "Support Bundle" + LocalDate startDate = LocalDate.now().minusDays(5) + LocalDate endDate = LocalDate.now() + Response response = createSupportBundle(name, startDate, endDate) + response.then().assertThat().statusCode(200) + .body("artifactory.bundle_url", containsString(artifactoryURL)) + + Reporter.log("- Create support bundle. Successfully created", true) + } + + @Test(priority=8, groups=["jcr"], testName = "Create support bundle") + void createSupportBundleJCATest(){ + def name = "Support Bundle" + LocalDate startDate = LocalDate.now().minusDays(5) + LocalDate endDate = LocalDate.now() + Response response = createSupportBundle(name, startDate, endDate) + response.then().assertThat().statusCode(400) + .body("errors[0].message", + containsStringIgnoringCase("This REST API is available only in Artifactory Pro")) + + Reporter.log("- Create support bundle, JCR. " + + "Call is not supported in JCR version, error message is correct", true) + } + + @Test(priority=9, groups=["pro"], testName = "Delete created repositories") + void deleteDefaultReposTest(){ + Response getRepoResponse = getRepos() + JsonPath jsonPathEvaluator = getRepoResponse.jsonPath() + List repoNames = jsonPathEvaluator.getList("key", String.class) + for (int i = 0; i < repoNames.size(); i ++){ + Response delete = deleteRepository(repoNames[i], username, password) + delete.then().statusCode(200) + } + + Reporter.log("- Delete HA repositories. All repositories were successfully deleted", true) + } + + @Test(priority=9, groups=["jcr",], testName = "Delete sample repositories JCR") + void deleteJCRReposTest(){ + Response getRepoResponse = getRepos() + JsonPath jsonPathEvaluator = getRepoResponse.jsonPath() + List repoNames = jsonPathEvaluator.getList("key", String.class) + for (int i = 0; i < repoNames.size(); i ++){ + Response delete = deleteRepository(repoNames[i], username, password) + delete.then().statusCode(400).body("errors[0].message", + containsStringIgnoringCase("This REST API is available only in Artifactory Pro")) + } + + Reporter.log("- Delete sample JCR repositories. All repositories were successfully deleted", true) + } + + @Test(priority=10, groups=["pro"], testName = "Verify repositories were deleted successfully") + void checkReposAreDeleted(){ + Response response = getRepos() + def numberOfRepos = response.then().extract().path("size()") + def expectedReposNumber = 0 + response.then().assertThat().statusCode(200) + .body("size()", equalTo(expectedReposNumber)) + + Reporter.log("- Verify repo were deleted. ${numberOfRepos} repositories remain", true) + } + + @Test(priority=11, groups=["pro"], testName = "Re-Create a list of repositories, for the next tests") + void reCreateDefaultHAReposTest(){ + def body + def expectedMessage + body = repoListHA + expectedMessage = "383 changes to config merged successfully" + Response response = createRepositories(body, username, password) + response.then().assertThat().statusCode(200) + .body(Matchers.hasToString(expectedMessage)) + .log().body() + + Reporter.log("- Re-create repositories for HA distribution. Successfully created", true) + } + + @Test(priority=12, groups=["jcr"], testName = "Re-Create a list of repositories, for the next tests") + void reCreateDefaultJCRReposTest(){ + def body + def expectedMessage + body = repoListJCR + expectedMessage = "82 changes to config merged successfully" + Response response = createRepositories(body, username, password) + response.then().assertThat().statusCode(200) + .body(Matchers.hasToString(expectedMessage)) + .log().body() + + Reporter.log("- Re-create repositories for JCR distribution. Successfully created", true) + } + + @Test(priority=13, groups=["jcr","pro"], testName = "Create a directory in generic repo") + void reCreateDirectoryTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory/" + Response response = createDirectory(repoName, directoryName) + response.then().assertThat().statusCode(201) + .body("repo", equalTo(repoName)) + .body("path", equalTo("/" + directoryName)) + .body("uri", equalTo("http://" + artifactoryURL + ":80/artifactory/" + repoName + "/" + directoryName)) + + Reporter.log("- Create folder. Folder successfully created", true) + } + + @Test(priority=14, groups=["jcr","pro"], testName = "Deploy file to generic repo") + void reDeployArtifactToGenericTest(){ + def repoName = "generic-dev-local" + def directoryName = "test-directory" + def filename = "artifact.zip" + Response response = deployArtifact(repoName, directoryName, artifact, filename) + response.then().assertThat().statusCode(201) + .body("repo", equalTo(repoName)) + .body("path", equalTo("/" + directoryName + "/" + filename)) + .body("downloadUri", equalTo("http://" + artifactoryURL + ":80/artifactory/" + repoName + "/" + + directoryName + "/" + filename)) + + Reporter.log("- Deploy artifact. Artifact successfully deployed", true) + } + + +} diff --git a/Ansible/test/tests/src/test/groovy/tests/SecurityTest.groovy b/Ansible/test/tests/src/test/groovy/tests/SecurityTest.groovy new file mode 100644 index 0000000..a166cd0 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/tests/SecurityTest.groovy @@ -0,0 +1,153 @@ +package tests + +import io.restassured.RestAssured +import io.restassured.response.Response +import org.hamcrest.Matchers +import org.junit.Assert +import org.testng.Reporter +import org.testng.annotations.BeforeSuite +import org.testng.annotations.Test +import org.yaml.snakeyaml.Yaml +import steps.SecuritytSteps + + +class SecurityTest extends SecuritytSteps{ + + Yaml yaml = new Yaml() + def configFile = new File("./src/test/resources/testenv.yaml") + def config = yaml.load(configFile.text) + def artifactoryURL + def distribution + def username + def password + + @BeforeSuite(groups=["jcr","pro"]) + def setUp() { + artifactoryURL = config.artifactory.external_ip + distribution = config.artifactory.distribution + username = config.artifactory.rt_username + password = config.artifactory.rt_password + RestAssured.baseURI = "http://${artifactoryURL}/artifactory" + RestAssured.authentication = RestAssured.basic(username, password); + RestAssured.useRelaxedHTTPSValidation(); + } + + @Test(priority=1, groups=["pro"], dataProvider = "users", testName = "Create users") + void createUsersTest(usernameRt, emailRt, passwordRt){ + Response response = createUser(usernameRt, emailRt, passwordRt) + response.then().statusCode(201) + + Reporter.log("- Create users. User ${usernameRt} created successfully", true) + } + + @Test(priority=2, groups=["pro"], dataProvider = "users", testName = "Verify users were created successfully") + void verifyUsersTest(usernameRt, emailRt, passwordRt){ + Response response = getUserDetails(usernameRt) + response.then().statusCode(200). + body("name", Matchers.equalTo(usernameRt)). + body("email", Matchers.equalTo(emailRt)). + body("admin", Matchers.equalTo(false)). + body("groups[0]", Matchers.equalTo("readers")) + + Reporter.log("- Verify created users. User ${usernameRt} was successfully verified", true) + } + + @Test(priority=3, groups=["pro"], dataProvider = "users", testName = "Generate API keys") + void generateAPIKeysTest(usernameRt, emailRt, passwordRt) { + Response createKey = generateAPIKey(usernameRt, passwordRt) + def errorMessage = createKey.then().extract().path("error") + if (errorMessage == null) { + def key = createKey.then().extract().path("apiKey") + Response getKey = getAPIKey(usernameRt, passwordRt) + def keyVerification = getKey.then().extract().path("apiKey") + Assert.assertTrue(key == keyVerification) + Reporter.log("- Generate API keys. Key for ${usernameRt} created successfully", true) + } else if (errorMessage.toString().contains("Api key already exists for user:")){ + Reporter.log("- Generate API keys. Key for ${usernameRt} already exists, skipped", true) + } + } + + @Test(priority=4, groups=["pro"], dataProvider = "users", testName = "Re-generate API keys") + void regenerateAPIKeysTest(usernameRt, emailRt, passwordRt){ + Response regenerated = regenerateAPIKey(usernameRt, passwordRt) + regenerated.then().statusCode(200) + def key = regenerated.then().extract().path("apiKey") + Response getKey = getAPIKey(usernameRt, passwordRt) + getKey.then().statusCode(200) + def keyVerification = getKey.then().extract().path("apiKey") + Assert.assertTrue(key == keyVerification) + + Reporter.log("- Re-generate API keys. Key for ${usernameRt} re-generated successfully", true) + } + + @Test(priority=5, groups=["pro"], dataProvider = "groups", testName = "Create a group") + void createGroupTest(groupName){ + Response create = createGroup(groupName) + create.then().statusCode(201) + + Response get = getGroup(groupName) + get.then().statusCode(200) + def name = get.then().extract().path("name") + def adminPrivileges = get.then().extract().path("adminPrivileges") + Assert.assertTrue(name == groupName) + Assert.assertTrue(adminPrivileges == false) + + Reporter.log("- Create group. Group ${groupName} was successfully created", true) + } + + @Test(priority=6, groups=["pro"], testName = "Create and verify permissions") + void createPermissionsTest(){ + def permissionName = "testPermission" + def repository = "ANY" + def user1 = "testuser0" + def user2 = "testuser1" + def group1 = "test-group-0" + def group2 = "test-group-1" + def action1 = "read" + def action2 = "write" + def action3 = "manage" + Response create = createPermissions(permissionName, repository, user1, user2, + group1, group2, action1, action2, action3) + create.then().statusCode(200) + + Response get = getPermissions(permissionName) + get.then().statusCode(200) + Assert.assertTrue(permissionName == get.then().extract().path("name")) + Assert.assertTrue(repository == get.then().extract().path("repo.repositories[0]")) + Assert.assertTrue(action1 == get.then().extract().path("repo.actions.users.${user1}[0]")) + Assert.assertTrue(action2 == get.then().extract().path("repo.actions.users.${user1}[1]")) + Assert.assertTrue(action3 == get.then().extract().path("repo.actions.users.${user1}[2]")) + Assert.assertTrue(action1 == get.then().extract().path("repo.actions.users.${user2}[0]")) + Assert.assertTrue(action2 == get.then().extract().path("repo.actions.users.${user2}[1]")) + Assert.assertTrue(action3 == get.then().extract().path("repo.actions.users.${user2}[2]")) + Assert.assertTrue(action1 == get.then().extract().path("repo.actions.groups.${group1}[0]")) + Assert.assertTrue(action2 == get.then().extract().path("repo.actions.groups.${group2}[1]")) + Assert.assertTrue(action1 == get.then().extract().path("repo.actions.groups.${group2}[0]")) + Assert.assertTrue(action2 == get.then().extract().path("repo.actions.groups.${group2}[1]")) + + Reporter.log("- Create permissions. Permissions successfully created and verified", true) + } + + @Test(priority=7, groups=["pro"], testName = "Delete permissions") + void deletePermissionsTest(){ + def permissionName = "testPermission" + Response delete = deletePermissions(permissionName) + delete.then().statusCode(200) + Reporter.log("- Delete permissions. User ${permissionName} has been removed successfully", true) + } + + @Test(priority=8, groups=["pro"], dataProvider = "users", testName = "Delete non-default users") + void deleteUserTest(usernameRt, email, passwordRt){ + Response delete = deleteUser(usernameRt) + delete.then().statusCode(200).body(Matchers.containsString("${usernameRt}")) + Reporter.log("- Delete user. User ${usernameRt} has been removed successfully", true) + } + + @Test(priority=9, groups=["pro"], dataProvider = "groups", testName = "Delete non-default groups") + void deleteGroupTest(groupName){ + Response delete = deleteGroup(groupName) + delete.then().statusCode(200).body(Matchers.containsString("${groupName}")) + Reporter.log("- Delete group. Group ${groupName} has been removed successfully", true) + } + +} diff --git a/Ansible/test/tests/src/test/groovy/tests/XrayTest.groovy b/Ansible/test/tests/src/test/groovy/tests/XrayTest.groovy new file mode 100644 index 0000000..ef6e4c4 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/tests/XrayTest.groovy @@ -0,0 +1,332 @@ +package tests + +import io.restassured.RestAssured +import io.restassured.response.Response +import org.testng.Assert +import org.testng.Reporter +import org.testng.annotations.BeforeSuite +import org.testng.annotations.BeforeTest +import org.testng.annotations.Test +import org.yaml.snakeyaml.Yaml +import steps.XraySteps + +import java.time.LocalDate + +import static org.hamcrest.Matchers.containsStringIgnoringCase +import static org.hamcrest.Matchers.emptyArray +import static org.hamcrest.Matchers.equalTo +import static org.hamcrest.Matchers.hasItem +import static org.hamcrest.Matchers.is +import static org.hamcrest.Matchers.isA +import static org.hamcrest.Matchers.not +import static org.hamcrest.Matchers.notNullValue +import static org.hamcrest.Matchers.nullValue + + +class XrayTest extends XraySteps{ + + Yaml yaml = new Yaml() + def configFile = new File("./src/test/resources/testenv.yaml") + def config = yaml.load(configFile.text) + def artifactoryURL + def distribution + def username + def password + def randomIndex + def policyName + def watchName + + @BeforeSuite(groups=["xray"]) + def setUp() { + artifactoryURL = config.artifactory.external_ip + distribution = config.artifactory.distribution + username = config.artifactory.rt_username + password = config.artifactory.rt_password + RestAssured.authentication = RestAssured.basic(username, password) + RestAssured.useRelaxedHTTPSValidation() + Random random = new Random() + randomIndex = random.nextInt(10000000) + policyName = "security_policy_${randomIndex}" + watchName = "all-repositories_${randomIndex}" + } + @BeforeTest(groups=["xray"]) + def testSetUp() { + RestAssured.baseURI = "http://${artifactoryURL}/xray/api" + } + + @Test(priority=1, groups=["xray"], dataProvider = "issueEvents", testName = "Create Issue Event") + void createIssueEventTest(issueID, cve, summary, description){ + Response create = createIssueEvent(issueID+randomIndex, cve, summary, description, username, password) + create.then().statusCode(201) + Response get = getIssueEvent(issueID+randomIndex, username, password) + get.then().statusCode(200) + def issueIDverification = get.then().extract().path("id") + def cveVerification = get.then().extract().path("source_id") + def summaryVerification = get.then().extract().path("summary") + def descriptionVerification = get.then().extract().path("description") + Assert.assertTrue(issueID+randomIndex == issueIDverification) + Assert.assertTrue(cve == cveVerification) + Assert.assertTrue(summary == summaryVerification) + Assert.assertTrue(description == descriptionVerification) + + Reporter.log("- Create issue event. Issue event with ID ${issueID+randomIndex} created and verified successfully", true) + } + + @Test(priority=2, groups=["xray"], dataProvider = "issueEvents", testName = "Update Issue Event", + dependsOnMethods = "createIssueEventTest") + void updateIssueEventTest(issueID, cve, summary, description){ + cve = "CVE-2017-0000000" + summary = "Updated" + description = "Updated" + Response update = updateIssueEvent(issueID+randomIndex, cve, summary, description, username, password) + update.then().statusCode(200) + Response get = getIssueEvent(issueID+randomIndex, username, password) + get.then().statusCode(200) + def cveVerification = get.then().extract().path("source_id") + def summaryVerification = get.then().extract().path("summary") + def descriptionVerification = get.then().extract().path("description") + Assert.assertTrue(cve == cveVerification) + Assert.assertTrue(summary == summaryVerification) + Assert.assertTrue(description == descriptionVerification) + + Reporter.log("- Update issue event. Issue event with ID ${issueID+randomIndex} updated and verified successfully", true) + } + + @Test(priority=3, groups=["xray"], testName = "Create policy") + void createPolicyTest(){ + Response create = createPolicy(policyName, username, password) + create.then().statusCode(201) + + Response get = getPolicy(policyName, username, password) + get.then().statusCode(200) + def policyNameVerification = get.then().extract().path("name") + Assert.assertTrue(policyName == policyNameVerification) + + Reporter.log("- Create policy. Policy with name ${policyName} created and verified successfully", true) + } + + @Test(priority=4, groups=["xray"], testName = "Update policy", dependsOnMethods = "createPolicyTest") + void updatePolicyTest(){ + def description = "Updated description" + Response update = updatePolicy(policyName, description, username, password) + update.then().statusCode(200) + + Response get = getPolicy(policyName, username, password) + get.then().statusCode(200) + def descriptionVerification = get.then().extract().path("description") + Assert.assertTrue(description == descriptionVerification) + + Reporter.log("- Update policy. Policy with name ${policyName} updated and verified successfully", true) + } + + @Test(priority=4, groups=["xray"], testName = "Get policies") + void getPoliciesTest(){ + Response response = getPolicies(username, password) + response.then().statusCode(200) + .body("name", notNullValue()) + .body("type", notNullValue()) + .body("description", notNullValue()) + .body("author", notNullValue()) + .body("rules", notNullValue()) + .body("created", notNullValue()) + .body("modified", notNullValue()) + def policies = response.then().extract().path("name") + Reporter.log("- Get policies. Policies list is returned successfully. " + + "Policies returned: ${policies}", true) + } + + @Test(priority=5, groups=["xray"], testName = "Create watch for the repositories", dependsOnMethods = "createPolicyTest") + void createWatchTest(){ + Response create = createWatchEvent(watchName, policyName, username, password) + create.then().statusCode(201) + .body("info", + equalTo("Watch has been successfully created")) + + Response get = getWatchEvent(watchName, username, password) + get.then().statusCode(200) + .body("general_data.name", equalTo((watchName).toString())) + + Reporter.log("- Create watch. Watch with name ${watchName} has been created and verified successfully", true) + } + + @Test(priority=6, groups=["xray"], testName = "Update watch for the repositories", dependsOnMethods = "createWatchTest") + void updateWatchTest(){ + def description = "Updated watch" + Response create = updateWatchEvent(watchName, description, policyName, username, password) + create.then().statusCode(200) + .body("info", + equalTo("Watch was successfully updated")) + + Response get = getWatchEvent(watchName, username, password) + get.then().statusCode(200) + .body("general_data.description", equalTo(description)) + + Reporter.log("- Update watch. Watch with name ${watchName} has been updated and verified successfully", true) + } + + @Test(priority=7, groups=["xray"], testName = "Assign policy to watches") + void assignPolicyToWatchTest(){ + Response response = assignPolicy(watchName, policyName, username, password) + response.then().statusCode(200) + .body("result.${watchName}", + equalTo("Policy assigned successfully to Watch")) + + Reporter.log("- Assign policy to watch. Policy assigned successfully to Watch", true) + } + + @Test(priority=8, groups=["xray"], testName = "Delete watch") + void deleteWatchTest(){ + Response response = deleteWatchEvent(watchName, username, password) + response.then().statusCode(200) + .body("info", + equalTo("Watch was deleted successfully")) + + Reporter.log("- Delete watch. Watch ${watchName} has been successfully deleted", true) + } + + @Test(priority=9, groups=["xray"], testName = "Delete policy") + void deletePolicyTest(){ + + Response response = deletePolicy(policyName, username, password) + response.then().statusCode(200) + .body("info", + equalTo(("Policy ${policyName} was deleted successfully").toString())) + + Reporter.log("- Delete policy. Policy ${policyName} has been successfully deleted", true) + } + +/* @Test(priority=10, groups=["xray"], testName = "Start scan") + void startScanTest(){ + def artifactPath = "default/generic-dev-local/test-directory/artifact.zip" + Response getSha = artifactSummary(username, password, artifactPath) + def componentID = getSha.then().extract().path("artifacts[0].licenses[0].components[0]") + + Response scan = startScan(username, password, componentID) + scan.then().statusCode(200) + .body("info", + equalTo(("Scan of artifact is in progress").toString())) + + Reporter.log("- Start scan. Scan of ${componentID} has been started successfully", true) + }*/ + + @Test(priority=11, groups=["xray"], testName = "Create and get integration configuration") + void integrationConfigurationTest(){ + def vendorName = "vendor_${randomIndex}" + Response post = addtIntegrationConfiguration(username, password, vendorName) + post.then().statusCode(200) + + Response get = getIntegrationConfiguration(username, password) + int bodySize = get.body().jsonPath().getList(".").size() + get.then().statusCode(200) + .body("[" + (bodySize-1) + "].vendor", equalTo(vendorName.toString())) + + Reporter.log("- Integration configuration. " + + "Configuration for vendor ${vendorName} has been successfully added and verified", true) + } + + @Test(priority=12, groups=["xray"], testName = "Enable TLS for RabbitMQ") + void enableTLSRabbitMQTest(){ + File body = new File("./src/test/resources/enableRabbitMQ.json") + Response post = postSystemParameters(username, password, body) + post.then().statusCode(200) + + Response get = getSystemParameters(username, password) + get.then().statusCode(200).body("enableTlsConnectionToRabbitMQ", equalTo(true)) + + Reporter.log("- Enable TLS for RabbitMQ. TLS for RabbitMQ has been successfully enabled and verified", true) + } + + @Test(priority=13, groups=["xray"], testName = "Get binary manager") + void getBinaryManagerTest(){ + Response response = getBinaryManager(username, password) + response.then().statusCode(200) + .body("binMgrId", equalTo("default")) + .body("license_valid", equalTo(true)) + .body("binMgrId", equalTo("default")) + def version = response.then().extract().path("version") + + Reporter.log("- Get binary manager. Binary manager is verified, connected RT version: ${version}", true) + } + + @Test(priority=14, groups=["xray"], testName = "Get repo indexing configuration") + void getIndexingConfigurationTest(){ + Response response = getIndexingConfiguration(username, password) + response.then().statusCode(200) + .body("bin_mgr_id", equalTo("default")) + .body("indexed_repos.name", hasItem("generic-dev-local")) + + Reporter.log("- Get repo indexing configuration.", true) + } + + @Test(priority=15, groups=["xray"], testName = "Update repo indexing configuration") + void updateIndexingConfigurationTest(){ + Response response = updateIndexingConfiguration(username, password) + response.then().statusCode(200) + .body("info", equalTo("Repositories list has been successfully sent to Artifactory")) + + Reporter.log("- Update repo indexing configuration. Successfully updated", true) + } + + // Force reindex test, add in latest versions of X-ray + +/* @Test(priority=16, groups=["xray"], testName = "Get artifact summary") + void artifactSummaryTest(){ + def artifactPath = "default/generic-dev-local/test-directory/artifact.zip" + Response post = artifactSummary(username, password, artifactPath) + post.then().statusCode(200) + .body("artifacts[0].general.path", equalTo(artifactPath)) + + Reporter.log("- Get artifact summary. Artifact summary has been returned successfully", true) + }*/ + + @Test(priority=17, groups=["xray"], testName = "Create support bundle") + void createSupportBundleTest(){ + def name = "Support Bundle" + LocalDate startDate = LocalDate.now().minusDays(5) + LocalDate endDate = LocalDate.now() + Response response = createSupportBundle(username, password, name, startDate, endDate) + def bundle_url = response.then().extract().path("artifactory.bundle_url") + if ((bundle_url.toString()).contains(artifactoryURL)) { + Reporter.log("- Create support bundle. Successfully created using X-ray API", true) + } else if (((bundle_url.toString()).contains("localhost"))){ + Reporter.log("- Create support bundle. Created with a bug, localhost instead of the hostname", true) + } + } + + @Test(priority=18, groups=["xray"], testName = "Get system monitoring status") + void getSystemMonitoringTest(){ + Response response = getSystemMonitoringStatus(username, password) + response.then().statusCode(200) + + Reporter.log("- Get system monitoring status. Data returned successfully", true) + } + + @Test(priority=19, groups=["xray"], testName = "X-ray ping request") + void xrayPingRequestTest(){ + Response response = xrayPingRequest(username, password) + response.then().statusCode(200) + .body("status", equalTo("pong")) + + Reporter.log("- Get system monitoring status. Data returned successfully", true) + } + + @Test(priority=20, groups=["xray"], testName = "X-ray version") + void xrayGetVersionTest(){ + Response response = xrayGetVersion(username, password) + response.then().statusCode(200) + .body("xray_version", notNullValue()) + .body("xray_revision", notNullValue()) + def version = response.then().extract().path("xray_version") + def revision = response.then().extract().path("xray_revision") + + Reporter.log("- Get X-ray version. Version: ${version}, revision: ${revision}", true) + } + + + + +} + + + + diff --git a/Ansible/test/tests/src/test/groovy/utils/ConfigurationUtil.groovy b/Ansible/test/tests/src/test/groovy/utils/ConfigurationUtil.groovy new file mode 100644 index 0000000..208bf29 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/ConfigurationUtil.groovy @@ -0,0 +1,19 @@ +package utils + +class ConfigurationUtil { + + static def getEnvironmentVariableValue(def name) { + def value = System.getProperty(name) + if (value == null) { + value = System.getenv(name) + if (value == null) { + throw new Exception("Environment variable $name not set!"); + } + } + return value + } + + + + +} diff --git a/Ansible/test/tests/src/test/groovy/utils/DSL.groovy b/Ansible/test/tests/src/test/groovy/utils/DSL.groovy new file mode 100644 index 0000000..6a14f48 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/DSL.groovy @@ -0,0 +1,81 @@ +package utils + +import utils.ProcessOutputStream + +/** + * Created by eliom on 6/19/18. + */ +class DSL { + + /** + * Run shell command + */ + static def sh = { command, outputBuffer = null, folder = null, silent = false, customEnvVariables = null, errorBuffer = null -> + //def workdir = ConfigurationUtil.getEnvironmentVariableValue("KERMIT_WORKSPACE_DIR") + def workdir = "/Users/danielmi/projects/soldev/.kermit-workspace" + def commandFolder + if (folder != null) { + commandFolder = new File(folder, workdir) + } else { + commandFolder = workdir + } + + if (!silent) { + println "Running command at ${commandFolder}: $command" + } + def proc = null + try { + def env = System.getenv().collect { k, v -> "$k=$v" } + + if (customEnvVariables != null) { + env.addAll( customEnvVariables.collect { k, v -> "$k=$v" }) + } + + if (command instanceof List && command.size() > 0 && command[0] instanceof List) { + //Pipe Commands + command.each { + if (proc != null) { + proc = proc | it.execute(env, commandFolder) + } else { + proc = it.execute(env, commandFolder) + } + } + } else { + proc = command.execute(env, commandFolder) + } + } catch (IOException e) { + println "Failed to execute command: ${e.getMessage()}" + return -1 + } + def processOutput = new ProcessOutputStream(silent, outputBuffer == null) + def errorOutput = processOutput + if (errorBuffer != null) { + errorOutput = new ProcessOutputStream(silent, errorBuffer == null) + } + + proc.consumeProcessOutput(processOutput, errorOutput) + def exitStatus = proc.waitFor() + if (!silent) { + println "Exit: $exitStatus" + } + if (outputBuffer != null) { + outputBuffer.append(processOutput.toString()) + } + + processOutput.close() + + if (errorBuffer != null) { + errorBuffer.append(errorOutput.toString()) + errorOutput.close() + } + + return exitStatus + } + + + //... + + + + +} diff --git a/Ansible/test/tests/src/test/groovy/utils/EnvironmentConfig.groovy b/Ansible/test/tests/src/test/groovy/utils/EnvironmentConfig.groovy new file mode 100644 index 0000000..db7d017 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/EnvironmentConfig.groovy @@ -0,0 +1,10 @@ +package utils + + + +class EnvironmentConfig { + + + + +} diff --git a/Ansible/test/tests/src/test/groovy/utils/ProcessOutputStream.groovy b/Ansible/test/tests/src/test/groovy/utils/ProcessOutputStream.groovy new file mode 100644 index 0000000..aff11c2 --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/ProcessOutputStream.groovy @@ -0,0 +1,32 @@ +package utils + +public class ProcessOutputStream extends ByteArrayOutputStream{ + + private boolean silent = false; + private boolean discardOutput = false; + + public ProcessOutputStream(boolean silent, boolean discardOutput) { + this.silent = silent; + this.discardOutput = discardOutput; + } + + @Override + public synchronized void write(int b) { + if (!silent) { + System.out.write(b); + } + if (!discardOutput) { + super.write(b); + } + } + + @Override + public synchronized void write(byte[] b, int off, int len) { + if (!silent) { + System.out.write(b, off, len); + } + if (!discardOutput) { + super.write(b, off, len); + } + } +} \ No newline at end of file diff --git a/Ansible/test/tests/src/test/groovy/utils/Shell.groovy b/Ansible/test/tests/src/test/groovy/utils/Shell.groovy new file mode 100644 index 0000000..87d4aaf --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/Shell.groovy @@ -0,0 +1,17 @@ +package utils + +class Shell { + + def executeProc(cmd) { + println(cmd) + def proc = cmd.execute() + + proc.in.eachLine {line -> + println line + } + + println proc.err.text + + proc.exitValue() + } +} diff --git a/Ansible/test/tests/src/test/groovy/utils/WorkSpaceManager.groovy b/Ansible/test/tests/src/test/groovy/utils/WorkSpaceManager.groovy new file mode 100644 index 0000000..f1262bb --- /dev/null +++ b/Ansible/test/tests/src/test/groovy/utils/WorkSpaceManager.groovy @@ -0,0 +1,32 @@ +package utils + +/** + * Created by eliom on 6/26/18. + */ +class WorkspaceManager { + + //TODO: Make it Thread safe + def static currentPath = [] + + def static pushPath(path) { + currentPath.push(path) + } + + def static popPath() { + currentPath.pop() + } + + def static getCurrentDir() { + def workspaceRoot = ConfigurationUtil.getWorkspaceDir() + if (currentPath.size() > 0) { + def currentDir = new File(currentPath.join('/'), workspaceRoot) + if (!currentDir.exists()) { + currentDir.mkdirs() + } + return currentDir + } else { + return workspaceRoot + } + } + +} diff --git a/Ansible/test/tests/src/test/resources/enableRabbitMQ.json b/Ansible/test/tests/src/test/resources/enableRabbitMQ.json new file mode 100644 index 0000000..c6e54d4 --- /dev/null +++ b/Ansible/test/tests/src/test/resources/enableRabbitMQ.json @@ -0,0 +1,11 @@ +{ + "sslInsecure": false, + "maxDiskDataUsage": 80, + "monitorSamplingInterval": 300, + "mailNoSsl": false, + "messageMaxTTL": 7, + "jobInterval": 86400, + "allowSendingAnalytics": true, + "httpsPort": 443, + "enableTlsConnectionToRabbitMQ": true +} \ No newline at end of file diff --git a/Ansible/test/tests/src/test/resources/integration.json b/Ansible/test/tests/src/test/resources/integration.json new file mode 100644 index 0000000..08ba303 --- /dev/null +++ b/Ansible/test/tests/src/test/resources/integration.json @@ -0,0 +1,9 @@ +{ + "vendor": "whitesource5", + "api_key": "12345", + "enabled": true, + "context": "project_id", + "url": "https://saas.whitesourcesoftware.com/xray", + "description": "WhiteSource provides a simple yet powerful open source security and licenses management solution. More details at http://www.whitesourcesoftware.com.", + "test_url": "https://saas.whitesourcesoftware.com/xray/api/checkauth" +} \ No newline at end of file diff --git a/Ansible/test/tests/src/test/resources/repositories/CreateDefault.yaml b/Ansible/test/tests/src/test/resources/repositories/CreateDefault.yaml new file mode 100644 index 0000000..ef1f5fd --- /dev/null +++ b/Ansible/test/tests/src/test/resources/repositories/CreateDefault.yaml @@ -0,0 +1,554 @@ +localRepositories: + libs-release-local: + type: maven + description: "production deployment" + repoLayout: maven-2-default + xray: + enabled: true + libs-snapshot-local: + type: maven + description: "snapshot deployment" + repoLayout: maven-2-default + xray: + enabled: true + maven-prod-local: + type: maven + description: "production release deployment" + repoLayout: maven-2-default + xray: + enabled: true + maven-dev-local: + type: maven + description: "development release deployment" + repoLayout: maven-2-default + xray: + enabled: true + maven-release-local: + type: maven + description: "development release deployment" + repoLayout: maven-2-default + xray: + enabled: true + maven-snapshot-local: + type: maven + description: "development release deployment" + repoLayout: maven-2-default + xray: + enabled: true + gradle-prod-local: + type: gradle + description: "production deployment" + repoLayout: gradle-default + xray: + enabled: true + gradle-dev-local: + type: gradle + description: "development deployment" + repoLayout: gradle-default + xray: + enabled: true + tomcat-local: + type: generic + description: "used by demo" + repoLayout: simple-default + xray: + enabled: true + generic-prod-local: + type: generic + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + generic-dev-local: + type: generic + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + ivy-prod-local: + type: ivy + description: "production deployment" + repoLayout: "ivy-default" + xray: + enabled: true + ivy-dev-local: + type: ivy + description: "development deployment" + repoLayout: ivy-default + xray: + enabled: true + helm-prod-local: + type: helm + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + helm-dev-local: + type: helm + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + sbt-prod-local: + type: sbt + description: "production deployment" + repoLayout: sbt-default + xray: + enabled: true + sbt-dev-local: + type: sbt + description: "development deployment" + repoLayout: sbt-default + xray: + enabled: true + nuget-prod-local: + type: nuget + description: "production deployment" + repoLayout: nuget-default + xray: + enabled: true + nuget-dev-local: + type: nuget + description: "development deployment" + repoLayout: nuget-default + xray: + enabled: true + gems-prod-local: + type: gems + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + gems-dev-local: + type: gems + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + npm-prod-local: + type: npm + description: "production deployment" + repoLayout: npm-default + xray: + enabled: true + npm-dev-local: + type: npm + description: "development deployment" + repoLayout: npm-default + xray: + enabled: true + bower-prod-local: + type: bower + description: "production deployment" + repoLayout: bower-default + xray: + enabled: true + bower-dev-local: + type: bower + description: "development deployment" + repoLayout: bower-default + xray: + enabled: true + debian-prod-local: + type: debian + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + debian-dev-local: + type: debian + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + php-prod-local: + type: composer + description: "production deployment" + repoLayout: composer-default + xray: + enabled: true + php-dev-local: + type: composer + description: "development deployment" + repoLayout: composer-default + xray: + enabled: true + pypi-prod-local: + type: pypi + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + pypi-dev-local: + type: pypi + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + docker-prod-local: + type: docker + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + docker-stage-local: + type: docker + description: "stage deployment" + repoLayout: simple-default + xray: + enabled: true + docker-dev-local: + type: docker + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + docker-local: + type: docker + description: "docker deployment" + repoLayout: simple-default + xray: + enabled: true + docker-push: + type: docker + description: "docker push repo for push replication testing" + repoLayout: simple-default + xray: + enabled: true + vagrant-prod-local: + type: vagrant + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + vagrant-dev-local: + type: vagrant + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + gitlfs-prod-local: + type: gitlfs + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + gitlfs-dev-local: + type: gitlfs + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + rpm-prod-local: + type: yum + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + rpm-dev-local: + type: yum + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + conan-prod-local: + type: conan + description: "production deployment" + repoLayout: conan-default + xray: + enabled: true + conan-dev-local: + type: conan + description: "development deployment" + repoLayout: conan-default + xray: + enabled: true + chef-prod-local: + type: chef + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + chef-dev-local: + type: chef + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + puppet-prod-local: + type: puppet + description: "production deployment" + repoLayout: puppet-default + xray: + enabled: true + puppet-dev-local: + type: puppet + description: "development deployment" + repoLayout: puppet-default + xray: + enabled: true + go-prod-local: + type: go + description: "production deployment" + repoLayout: go-default + xray: + enabled: true + go-staging-local: + type: go + description: "production deployment" + repoLayout: go-default + xray: + enabled: true +remoteRepositories: + docker-remote: + type: docker + url: https://registry-1.docker.io + repoLayout: simple-default + enableTokenAuthentication: true + xray: + enabled: true + helm-remote: + type: helm + url: https://storage.googleapis.com/kubernetes-charts + repoLayout: simple-default + xray: + enabled: true + jcenter: + type: maven + url: https://jcenter.bintray.com + repoLayout: maven-2-default + xray: + enabled: true + npm-remote: + type: npm + url: https://registry.npmjs.org + repoLayout: npm-default + xray: + enabled: true + nuget-remote: + type: nuget + url: https://www.nuget.org/ + repoLayout: nuget-default + xray: + enabled: true + bower-remote: + type: bower + url: https://github.com/ + repoLayout: bower-default + xray: + enabled: true + gems-remote: + type: gems + url: https://rubygems.org/ + repoLayout: simple-default + xray: + enabled: true + debian-remote: + type: debian + url: http://archive.ubuntu.com/ubuntu/ + repoLayout: simple-default + xray: + enabled: true + php-remote: + type: composer + url: https://github.com/ + repoLayout: composer-default + xray: + enabled: true + pypi-remote: + type: pypi + url: https://files.pythonhosted.org + repoLayout: simple-default + xray: + enabled: true + rpm-remote: + type: yum + url: http://mirror.centos.org/centos/ + repoLayout: simple-default + xray: + enabled: true + chef-remote: + type: chef + url: https://supermarket.chef.io + repoLayout: simple-default + xray: + enabled: true + puppet-remote: + type: puppet + url: https://forgeapi.puppetlabs.com/ + repoLayout: puppet-default + xray: + enabled: true +virtualRepositories: + maven-release-virtual: + type: maven + repositories: + - maven-prod-local + - jcenter + - maven-release-local + - libs-release-local + description: "maven release virtual repositories" + defaultDeploymentRepo: maven-release-local + maven-snapshot-virtual: + type: maven + repositories: + - maven-snapshot-local + - jcenter + - maven-dev-local + - libs-snapshot-local + description: "maven snapshot virtual repositories" + defaultDeploymentRepo: maven-snapshot-local + gradle-virtual: + type: gradle + repositories: + - gradle-dev-local + - jcenter + - gradle-prod-local + - libs-release-local + description: "gradle virtual repositories" + defaultDeploymentRepo: gradle-dev-local + docker-PLACEHOLDERFORBUILDSTEP: + type: docker + repositories: + - docker-local + - docker-remote + - docker-dev-local + - docker-prod-local + - docker-stage-local + - docker-push + description: "docker virtual" + defaultDeploymentRepo: docker-stage-local + docker-virtual: + type: docker + repositories: + - docker-local + - docker-remote + - docker-dev-local + - docker-prod-local + - docker-stage-local + - docker-push + description: "docker virtual" + defaultDeploymentRepo: docker-stage-local + libs-release: + type: maven + repositories: + - libs-release-local + - jcenter + description: "maven libraries virtual" + defaultDeploymentRepo: libs-release-local + libs-snapshot: + type: maven + repositories: + - libs-snapshot-local + - jcenter + description: "maven libraries virtual" + defaultDeploymentRepo: libs-snapshot-local + ivy-virtual: + type: ivy + repositories: + - ivy-prod-local + - ivy-dev-local + - jcenter + description: "ivy virtual" + defaultDeploymentRepo: ivy-dev-local + generic-virtual: + type: generic + repositories: + - generic-prod-local + - generic-dev-local + description: "generic virtual" + defaultDeploymentRepo: generic-dev-local + helm-virtual: + type: helm + repositories: + - helm-prod-local + - helm-dev-local + - helm-remote + description: "helm virtual" + defaultDeploymentRepo: helm-dev-local + nuget-virtual: + type: nuget + repositories: + - nuget-prod-local + - nuget-dev-local + - nuget-remote + description: "nuget virtual" + defaultDeploymentRepo: nuget-dev-local + npm-virtual: + type: npm + repositories: + - npm-dev-local + - npm-remote + - npm-prod-local + description: "npm virtual" + defaultDeploymentRepo: npm-dev-local + chef-virtual: + type: chef + repositories: + - chef-dev-local + - chef-remote + - chef-prod-local + description: "chef virtual" + defaultDeploymentRepo: chef-dev-local + puppet-virtual: + type: puppet + repositories: + - puppet-dev-local + - puppet-remote + - puppet-prod-local + description: "puppet virtual" + defaultDeploymentRepo: puppet-dev-local + rpm-virtual: + type: yum + repositories: + - rpm-dev-local + - rpm-remote + - rpm-prod-local + description: "rpm virtual" + defaultDeploymentRepo: rpm-dev-local + gitlfs-virtual: + type: gitlfs + repositories: + - gitlfs-dev-local + - gitlfs-prod-local + description: "gitlfs virtual" + defaultDeploymentRepo: gitlfs-dev-local + pypi-virtual: + type: pypi + repositories: + - pypi-dev-local + - pypi-prod-local + - pypi-remote + description: "pypi virtual" + defaultDeploymentRepo: pypi-dev-local + bower-virtual: + type: bower + repositories: + - bower-dev-local + - bower-prod-local + - bower-remote + description: "bower virtual" + defaultDeploymentRepo: bower-dev-local + gems-virtual: + type: gems + repositories: + - gems-dev-local + - gems-prod-local + - gems-remote + description: "gems virtual" + defaultDeploymentRepo: gems-dev-local + sbt-virtual: + type: sbt + repositories: + - sbt-dev-local + - sbt-prod-local + - jcenter + description: "sbt virtual" + defaultDeploymentRepo: sbt-dev-local + go-staging: + type: go + repositories: + - go-staging-local + - go-prod-local + description: "go virtual" + defaultDeploymentRepo: go-staging-local diff --git a/Ansible/test/tests/src/test/resources/repositories/CreateJCR.yaml b/Ansible/test/tests/src/test/resources/repositories/CreateJCR.yaml new file mode 100644 index 0000000..38a5feb --- /dev/null +++ b/Ansible/test/tests/src/test/resources/repositories/CreateJCR.yaml @@ -0,0 +1,119 @@ +localRepositories: + tomcat-local: + type: generic + description: "used by demo" + repoLayout: simple-default + xray: + enabled: true + generic-prod-local: + type: generic + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + generic-dev-local: + type: generic + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + helm-prod-local: + type: helm + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + helm-dev-local: + type: helm + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + docker-generator: + type: docker + description: "docker generator repo for generation testing" + repoLayout: simple-default + xray: + enabled: true + docker-prod-local: + type: docker + description: "production deployment" + repoLayout: simple-default + xray: + enabled: true + docker-stage-local: + type: docker + description: "stage deployment" + repoLayout: simple-default + xray: + enabled: true + docker-dev-local: + type: docker + description: "development deployment" + repoLayout: simple-default + xray: + enabled: true + docker-local: + type: docker + description: "docker deployment" + repoLayout: simple-default + xray: + enabled: true + docker-push: + type: docker + description: "docker push repo for push replication testing" + repoLayout: simple-default + xray: + enabled: true +virtualRepositories: + generic-virtual: + type: generic + repositories: + - generic-prod-local + - generic-dev-local + description: "generic virtual" + defaultDeploymentRepo: generic-dev-local + helm-virtual: + type: helm + repositories: + - helm-prod-local + - helm-dev-local + - helm-remote + description: "helm virtual" + defaultDeploymentRepo: helm-dev-local + docker-PLACEHOLDERFORBUILDSTEP: + type: docker + repositories: + - docker-local + - docker-remote + - docker-dev-local + - docker-prod-local + - docker-stage-local + - docker-push + description: "docker virtual" + defaultDeploymentRepo: docker-stage-local + docker-virtual: + type: docker + repositories: + - docker-local + - docker-remote + - docker-dev-local + - docker-prod-local + - docker-stage-local + - docker-push + description: "docker virtual" + defaultDeploymentRepo: docker-stage-local +remoteRepositories: + helm-remote: + type: helm + url: https://storage.googleapis.com/kubernetes-charts + repoLayout: simple-default + xray: + enabled: true + docker-remote: + type: docker + url: https://registry-1.docker.io + repoLayout: simple-default + enableTokenAuthentication: true + xray: + enabled: true \ No newline at end of file diff --git a/Ansible/test/tests/src/test/resources/repositories/artifact.zip b/Ansible/test/tests/src/test/resources/repositories/artifact.zip new file mode 100644 index 0000000..0e86cb5 Binary files /dev/null and b/Ansible/test/tests/src/test/resources/repositories/artifact.zip differ diff --git a/Ansible/test/tests/src/test/resources/testenv.yaml b/Ansible/test/tests/src/test/resources/testenv.yaml new file mode 100644 index 0000000..55ff648 --- /dev/null +++ b/Ansible/test/tests/src/test/resources/testenv.yaml @@ -0,0 +1,6 @@ +artifactory: + url: urlval + external_ip: ipval + distribution: artifactory_ha + rt_username: admin + rt_password: passval \ No newline at end of file diff --git a/JFrog-Cloud-Installers.iml b/JFrog-Cloud-Installers.iml new file mode 100644 index 0000000..bbd4172 --- /dev/null +++ b/JFrog-Cloud-Installers.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..f0524a4 --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,10 @@ +[defaults] +# Installs collections into [current dir]/ansible_collections/namespace/collection_name +collections_paths = ~/.ansible/collections:/usr/share/ansible/collections:collection + +# Installs roles into [current dir]/roles/namespace.rolename +roles_path = Ansible/collection/jfrog/ansible/roles + +host_key_checking = false + +deprecation_warnings=False \ No newline at end of file