├── README.md ├── vagrant-inventory ├── mysql.yml ├── Vagrantfile ├── appserver.yml └── mysql_pubkey.asc /README.md: -------------------------------------------------------------------------------- 1 | CTDC 2 | ======== 3 | Example automation to setup Contrast TeamServer Distributed Configuration using Vagrant and Ansible. 4 | -------------------------------------------------------------------------------- /vagrant-inventory: -------------------------------------------------------------------------------- 1 | [mysql] 2 | mysql.local ansible_ssh_host=10.10.10.21 3 | 4 | [appserver] 5 | appserver.local ansible_ssh_host=10.10.10.31 6 | 7 | -------------------------------------------------------------------------------- /mysql.yml: -------------------------------------------------------------------------------- 1 | - hosts: mysql 2 | sudo: True 3 | tasks: 4 | - name: Add MySQL deb repo 5 | sudo: True 6 | apt_repository: repo='deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.6' state=present 7 | 8 | - name: Accept gpg key 9 | sudo: True 10 | apt_key: data="{{ lookup('file', 'mysql_pubkey.asc') }}" state=present 11 | 12 | - name: apt-get update 13 | sudo: True 14 | apt: update_cache=yes 15 | 16 | - name: install mysql packages 17 | sudo: True 18 | apt: pkg={{ item }} state=latest 19 | with_items: 20 | - mysql-server 21 | - mysql-client 22 | - python-mysqldb 23 | 24 | - name: Change bind_address = * 25 | replace: dest=/etc/mysql/my.cnf regexp='127\.0\.0\.1' replace='*' 26 | 27 | - name: Create remote user 28 | mysql_user: > 29 | login_user=root 30 | login_password= 31 | name=contrast 32 | host=% 33 | password=cHaNgEmE 34 | priv=*.*:ALL,GRANT 35 | state=present 36 | 37 | - name: Create schema 'contrast' 38 | mysql_db: name=contrast state=present 39 | 40 | - name: restart mysql 41 | service: name=mysql state=restarted 42 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | VAGRANTFILE_API_VERSION = "2" 2 | 3 | Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 4 | config.vm.define "mysql" do |vagrant2| 5 | vagrant2.vm.provider "virtualbox" do |v| 6 | v.memory = 2048 7 | end 8 | vagrant2.vm.box = "ubuntu/trusty64" 9 | vagrant2.vm.hostname = "mysql.local" 10 | vagrant2.vm.network "forwarded_port", guest: 3306, host: 8306 11 | vagrant2.vm.network "private_network", ip: "10.10.10.21" 12 | vagrant2.vm.provision "ansible" do |ansible2| 13 | ansible2.playbook = "mysql.yml" 14 | ansible2.inventory_path = 'vagrant-inventory' 15 | end 16 | end 17 | config.vm.define "appserver" do |vagrant3| 18 | vagrant3.vm.provider "virtualbox" do |v| 19 | v.memory = 4096 20 | end 21 | vagrant3.vm.box = "ubuntu/trusty64" 22 | vagrant3.vm.hostname = "appserver.local" 23 | vagrant3.vm.network "forwarded_port", guest: 8080, host: 8181 24 | vagrant3.vm.network "private_network", ip: "10.10.10.31" 25 | vagrant3.vm.provision "ansible" do |ansible3| 26 | ansible3.playbook = "appserver.yml" 27 | ansible3.inventory_path = 'vagrant-inventory' 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /appserver.yml: -------------------------------------------------------------------------------- 1 | - hosts: appserver 2 | sudo: True 3 | vars: 4 | contrast_local_artifact_path: /tmp/ctdc 5 | contrast_war: contrast-teamserver-3.2.4.war 6 | contrast_data_dir: /opt/contrast-data 7 | eop_config: migrate 8 | filename_extension: tar.gz 9 | java_opts: "-XX:+UseTLAB -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=1 -XX:+CMSParallelRemarkEnabled -XX:+PrintVMOptions -XX:+PrintCommandLineFlags -Xmx2g -Xms2g -server -XX:MaxPermSize=768m -Dcontrast.data.dir={{ contrast_data_dir }} -Dcontrast.home={{ contrast_data_dir }} -XX:+HeapDumpOnOutOfMemoryError -Xloggc:{{ contrast_data_dir }}/gc.out" 10 | tasks: 11 | - name: Install Tomcat7 Software 12 | apt: name=tomcat7 update_cache=yes state=present 13 | 14 | - name: add java repository to sources 15 | action: shell add-apt-repository -y ppa:webupd8team/java 16 | 17 | - name: autoaccept license for java 18 | action: shell echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections 19 | 20 | - name: update apt package cache 21 | apt: update_cache=yes 22 | 23 | - name: install java 7 from oracle via apt 24 | apt: name=oracle-java7-installer state=latest install_recommends=yes 25 | 26 | - name: set oracle java 7 as default jvm 27 | apt: name=oracle-java7-set-default state=latest install_recommends=yes 28 | 29 | - name: Move local files to virtual machine 30 | copy: src={{ contrast_local_artifact_path }}/{{ contrast_war }} dest=/opt/ mode=0655 backup=yes 31 | 32 | - name: Create contrast-data directory 33 | file: path={{ contrast_data_dir }} state=directory mode=0755 owner=tomcat7 group=tomcat7 recurse=yes 34 | 35 | - name: Unarchive configuration directory 36 | unarchive: copy=yes src={{ contrast_local_artifact_path}}/{{ eop_config }}.{{ filename_extension }} dest={{ contrast_data_dir }} owner=tomcat7 group=tomcat7 37 | 38 | - name: Establish Permissions for contrast-data directory 39 | file: path={{ contrast_data_dir }} state=directory mode=0755 owner=tomcat7 group=tomcat7 recurse=yes 40 | 41 | - name: Create symlink to war (very important that warname is "Contrast.war") 42 | file: > 43 | state=link 44 | src=/opt/{{ contrast_war }} 45 | dest=/var/lib/tomcat7/webapps/Contrast.war 46 | owner=tomcat7 47 | group=tomcat7 48 | force=yes 49 | 50 | - name: Set JAVA_OPTS 51 | replace: > 52 | dest=/etc/default/tomcat7 53 | regexp='JAVA_OPTS="-Djava\.awt\.headless=true -Xmx128m -XX:\+UseConcMarkSweepGC"' 54 | replace='JAVA_OPTS="{{ java_opts }}"' 55 | 56 | - name: Restart tomcat7 57 | service: name=tomcat7 state=restarted 58 | 59 | 60 | -------------------------------------------------------------------------------- /mysql_pubkey.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Version: GnuPG v1.4.9 (SunOS) 3 | 4 | mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 5 | RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ 6 | fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 7 | BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW 8 | hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV 9 | K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE 10 | kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI 11 | QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep 12 | rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q2TXlTUUwgUmVs 13 | ZWFzZSBFbmdpbmVlcmluZyA8bXlzcWwtYnVpbGRAb3NzLm9yYWNsZS5jb20+iGkE 14 | ExECACkCGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAIZAQUCUwHUZgUJGmbLywAK 15 | CRCMcY07UHLh9V+DAKCjS1gGwgVI/eut+5L+l2v3ybl+ZgCcD7ZoA341HtoroV3U 16 | 6xRD09fUgeq0O015U1FMIFBhY2thZ2Ugc2lnbmluZyBrZXkgKHd3dy5teXNxbC5j 17 | b20pIDxidWlsZEBteXNxbC5jb20+iG8EMBECAC8FAk53Pa0oHSBidWlsZEBteXNx 18 | bC5jb20gd2lsbCBzdG9wIHdvcmtpbmcgc29vbgAKCRCMcY07UHLh9bU9AJ9xDK0o 19 | xJFL9vTl9OSZC4lX0K9AzwCcCrS9cnJyz79eaRjL0s2r/CcljdyIZQQTEQIAHQUC 20 | R6yUtAUJDTBYqAULBwoDBAMVAwIDFgIBAheAABIJEIxxjTtQcuH1B2VHUEcAAQGu 21 | kgCffz4GUEjzXkOi71VcwgCxASTgbe0An34LPr1j9fCbrXWXO14msIADfb5piEwE 22 | ExECAAwFAj4+o9EFgwlmALsACgkQSVDhKrJykfIk4QCfWbEeKN+3TRspe+5xKj+k 23 | QJSammIAnjUz0xFWPlVx0f8o38qNG1bq0cU9iEwEExECAAwFAj5CggMFgwliIokA 24 | CgkQtvXNTca6JD+WkQCgiGmnoGjMojynp5ppvMXkyUkfnykAoK79E6h8rwkSDZou 25 | iz7nMRisH8uyiEYEEBECAAYFAj+s468ACgkQr8UjSHiDdA/2lgCg21IhIMMABTYd 26 | p/IBiUsP/JQLiEoAnRzMywEtujQz/E9ono7H1DkebDa4iEYEEBECAAYFAj+0Q3cA 27 | CgkQhZavqzBzTmbGwwCdFqD1frViC7WRt8GKoOS7hzNN32kAnirlbwpnT7a6NOsQ 28 | 83nk11a2dePhiEYEEBECAAYFAkNbs+oACgkQi9gubzC5S1x/dACdELKoXQKkwJN0 29 | gZztsM7kjsIgyFMAnRRMbHQ7V39XC90OIpaPjk3a01tgiEYEExECAAYFAkTxMyYA 30 | CgkQ9knE9GCTUwwKcQCgibak/SwhxWH1ijRhgYCo5GtM4vcAnAhtzL57wcw1Kg1X 31 | m7nVGetUqJ7fiEwEEBECAAwFAkGBywEFgwYi2YsACgkQGFnQH2d7oexCjQCcD8sJ 32 | NDc/mS8m8OGDUOx9VMWcnGkAnj1YWOD+Qhxo3mI/Ul9oEAhNkjcfiEwEEBECAAwF 33 | AkGByzQFgwYi2VgACgkQgcL36+ITtpIiIwCdFVNVUB8xe8mFXoPm4d9Z54PTjpMA 34 | niSPA/ZsfJ3oOMLKar4F0QPPrdrGiEwEEBECAAwFAkGBy2IFgwYi2SoACgkQa3Ds 35 | 2V3D9HMJqgCbBYzr5GPXOXgP88jKzmdbjweqXeEAnRss4G2G/3qD7uhTL1SPT1SH 36 | jWUXiEwEEBECAAwFAkHQkyQFgwXUEWgACgkQfSXKCsEpp8JiVQCghvWvkPqowsw8 37 | w7WSseTcw1tflvkAni+vLHl/DqIly0LkZYn5jzK1dpvfiEwEEBECAAwFAkIrW7oF 38 | gwV5SNIACgkQ5hukiRXruavzEwCgkzL5QkLSypcw9LGHcFSx1ya0VL4An35nXkum 39 | g6cCJ1NP8r2I4NcZWIrqiEwEEhECAAwFAkAqWToFgwd6S1IACgkQPKEfNJT6+GEm 40 | XACcD+A53A5OGM7w750W11ukq4iZ9ckAnRMvndAqn3YTOxxlLPj2UPZiSgSqiEwE 41 | EhECAAwFAkA9+roFgwdmqdIACgkQ8tdcY+OcZZyy3wCgtDcwlaq20w0cNuXFLLNe 42 | EUaFFTwAni6RHN80moSVAdDTRkzZacJU3M5QiEwEEhECAAwFAkEOCoQFgwaWmggA 43 | CgkQOcor9D1qil/83QCeITZ9wIo7XAMjC6y4ZWUL4m+edZsAoMOhRIRi42fmrNFu 44 | vNZbnMGej81viEwEEhECAAwFAkKApTQFgwUj/1gACgkQBA3AhXyDn6jjJACcD1A4 45 | UtXk84J13JQyoH9+dy24714Aniwlsso/9ndICJOkqs2j5dlHFq6oiEwEExECAAwF 46 | Aj5NTYQFgwlXVwgACgkQLbt2v63UyTMFDACglT5G5NVKf5Mj65bFSlPzb92zk2QA 47 | n1uc2h19/IwwrsbIyK/9POJ+JMP7iEwEExECAAwFAkHXgHYFgwXNJBYACgkQZu/b 48 | yM2C/T4/vACfXe67xiSHB80wkmFZ2krb+oz/gBAAnjR2ucpbaonkQQgnC3GnBqmC 49 | vNaJiEwEExECAAwFAkIYgQ4FgwWMI34ACgkQdsEDHKIxbqGg7gCfQi2HcrHn+yLF 50 | uNlH1oSOh48ZM0oAn3hKV0uIRJphonHaUYiUP1ttWgdBiGUEExECAB0FCwcKAwQD 51 | FQMCAxYCAQIXgAUCS3AvygUJEPPzpwASB2VHUEcAAQEJEIxxjTtQcuH1sNsAniYp 52 | YBGqy/HhMnw3WE8kXahOOR5KAJ4xUmWPGYP4l3hKxyNK9OAUbpDVYIh7BDARAgA7 53 | BQJCdzX1NB0AT29wcy4uLiBzaG91bGQgaGF2ZSBiZWVuIGxvY2FsISBJJ20gKnNv 54 | KiBzdHVwaWQuLi4ACgkQOcor9D1qil/vRwCdFo08f66oKLiuEAqzlf9iDlPozEEA 55 | n2EgvCYLCCHjfGosrkrU3WK5NFVgiI8EMBECAE8FAkVvAL9IHQBTaG91bGQgaGF2 56 | ZSBiZWVuIGEgbG9jYWwgc2lnbmF0dXJlLCBvciBzb21ldGhpbmcgLSBXVEYgd2Fz 57 | IEkgdGhpbmtpbmc/AAoJEDnKK/Q9aopfoPsAn3BVqKOalJeF0xPSvLR90PsRlnmG 58 | AJ44oisY7Tl3NJbPgZal8W32fbqgbIkCIgQQAQIADAUCQYHLhQWDBiLZBwAKCRCq 59 | 4+bOZqFEaKgvEACCErnaHGyUYa0wETjj6DLEXsqeOiXad4i9aBQxnD35GUgcFofC 60 | /nCY4XcnCMMEnmdQ9ofUuU3OBJ6BNJIbEusAabgLooebP/3KEaiCIiyhHYU5jarp 61 | ZAh+Zopgs3Oc11mQ1tIaS69iJxrGTLodkAsAJAeEUwTPq9fHFFzC1eGBysoyFWg4 62 | bIjz/zClI+qyTbFA5g6tRoiXTo8ko7QhY2AA5UGEg+83Hdb6akC04Z2QRErxKAqr 63 | phHzj8XpjVOsQAdAi/qVKQeNKROlJ+iq6+YesmcWGfzeb87dGNweVFDJIGA0qY27 64 | pTb2lExYjsRFN4Cb13NfodAbMTOxcAWZ7jAPCxAPlHUG++mHMrhQXEToZnBFE4nb 65 | nC7vOBNgWdjUgXcpkUCkop4b17BFpR+k8ZtYLSS8p2LLz4uAeCcSm2/msJxT7rC/ 66 | FvoH8428oHincqs2ICo9zO/Ud4HmmO0O+SsZdVKIIjinGyOVWb4OOzkAlnnhEZ3o 67 | 6hAHcREIsBgPwEYVTj/9ZdC0AO44Nj9cU7awaqgtrnwwfr/o4V2gl8bLSkltZU27 68 | /29HeuOeFGjlFe0YrDd/aRNsxbyb2O28H4sG1CVZmC5uK1iQBDiSyA7Q0bbdofCW 69 | oQzm5twlpKWnY8Oe0ub9XP5p/sVfck4FceWFHwv+/PC9RzSl33lQ6vM2wIkCIgQT 70 | AQIADAUCQp8KHAWDBQWacAAKCRDYwgoJWiRXzyE+D/9uc7z6fIsalfOYoLN60ajA 71 | bQbI/uRKBFugyZ5RoaItusn9Z2rAtn61WrFhu4uCSJtFN1ny2RERg40f56pTghKr 72 | D+YEt+Nze6+FKQ5AbGIdFsR/2bUk+ZZRSt83e14Lcb6ii/fJfzkoIox9ltkifQxq 73 | Y7Tvk4noKu4oLSc8O1Wsfc/y0B9sYUUCmUfcnq58DEmGie9ovUslmyt5NPnveXxp 74 | 5UeaRc5Rqt9tK2B4A+7/cqENrdZJbAMSunt2+2fkYiRunAFPKPBdJBsY1sxeL/A9 75 | aKe0viKEXQdAWqdNZKNCi8rd/oOP99/9lMbFudAbX6nL2DSb1OG2Z7NWEqgIAzjm 76 | pwYYPCKeVz5Q8R+if9/fe5+STY/55OaI33fJ2H3v+U435VjYqbrerWe36xJItcJe 77 | qUzW71fQtXi1CTEl3w2ch7VF5oj/QyjabLnAlHgSlkSi6p7By5C2MnbCHlCfPnIi 78 | nPhFoRcRGPjJe9nFwGs+QblvS/Chzc2WX3s/2SWm4gEUKRX4zsAJ5ocyfa/vkxCk 79 | SxK/erWlCPf/J1T70+i5waXDN/E3enSet/WL7h94pQKpjz8OdGL4JSBHuAVGA+a+ 80 | dknqnPF0KMKLhjrgV+L7O84FhbmAP7PXm3xmiMPriXf+el5fZZequQoIagf8rdRH 81 | HhRJxQgI0HNknkaOqs8dtrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWs 82 | EN/lxaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLm 83 | RDRiRjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hk 84 | AWzE7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkb 85 | f4fmLe11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHb 86 | uE5p/1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+ 87 | Lwqqa8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1Z 88 | aSafanFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGo 89 | TbOWI39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev4 90 | 2LmuQT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkK 91 | Ht926s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUO 92 | etdZWhe70YGNPw1yjWJT1IhUBBgRAgAMBQJOdz3tBQkT+wG4ABIHZUdQRwABAQkQ 93 | jHGNO1By4fUUmwCbBYr2+bBEn/L2BOcnw9Z/QFWuhRMAoKVgCFm5fadQ3Afi+UQl 94 | AcOphrnJ 95 | =443I 96 | -----END PGP PUBLIC KEY BLOCK----- 97 | --------------------------------------------------------------------------------