diff --git a/playbooks/deploy.yml b/playbooks/deploy.yml index fef79e0..7a2fca9 100644 --- a/playbooks/deploy.yml +++ b/playbooks/deploy.yml @@ -1,61 +1,155 @@ - hosts: terraformed + become: yes tasks: - name: add ssh key to root - become: yes authorized_key: key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1gRhavvtL92IIuXdVujwVnptT2aDlJafaDNrr7AVo2Eboc7MAlQC+9UHDpMqVhmLL3J9OFR7vSFMYjsRoREIB5wxsoTOQy5D2kZwbu28dMy7ZEM+gNFyQaGucngTSj0d3m80RVBYOMDupaXtPuw0fEzRKmHMOr3zMhCK8djbdMKIWnPMA2mxGjiCY22jd7k3jlGti3iXjZ+Mrl1VGKuOXiEpHsDNoQfL289odkP4nWQA95tS6Lwi2gUtSLmhu9QTfIoFVFwdGT8jLa3ql3Ia45otCDTH2SrI9ZYoUhmTDNwcVhhkpfCb8tbsU0zD6qSTn5EWHpv6+56oa3nLutgF1 azure@desktop5" user: root + - name: add host to /etc/hosts + # Fixes some quirks, like https://stackoverflow.com/q/7496640/539465 + # or sudo complaining + lineinfile: + path: /etc/hosts + regexp: ".*\\b{{ansible_hostname}}\\b.*" + line: "127.0.0.1 {{ansible_hostname}}" + - hosts: cassandra-servers become: yes tasks: + - name: install APT dependencies + apt: + name: xfsprogs + - name: add Cassandra apt repo key apt_key: url: "https://www.apache.org/dist/cassandra/KEYS" - name: add Cassandra apt repo apt_repository: repo: "deb http://www.apache.org/dist/cassandra/debian 311x main" filename: "cassandra.sources.list" - name: install Cassandra package apt: name: cassandra + + - name: partition data disk + parted: + device: /dev/sdc + number: 1 + state: present + + - name: make data filesystem + filesystem: + device: /dev/sdc1 + fstype: xfs + + - name: mount data disk + mount: + path: /mnt/cassandra_data + src: /dev/sdc1 + fstype: xfs + state: mounted + + - name: chown data disk + file: + path: /mnt/cassandra_data + owner: cassandra + group: cassandra + state: directory + + - name: configure cassandra + template: + src: cassandra.yaml + dest: /etc/cassandra/cassandra.yaml + vars: + data_dir: /mnt/cassandra_data + notify: restart cassandra + + - name: add cassandra systemd unit + # The Cassandra package uses a sysv init script, and + # systemd-sysv-generator assumes it's Type=simple + copy: + dest: /etc/systemd/system/cassandra.service + content: | + [Unit] + Description=Cassandra + After=network-online.target + + [Service] + Type=forking + User=cassandra + Group=cassandra + ExecStart=/usr/sbin/cassandra + + [Install] + WantedBy=multi-user.target + notify: daemon-reload + + - name: enable cassandra system unit + systemd: + name: cassandra.service + enabled: yes + + handlers: + - name: daemon-reload + systemd: + daemon_reload: yes + notify: restart cassandra + + - name: restart cassandra + service: + name: cassandra + state: restarted - hosts: clients become: yes tasks: - - name: install APT dependnecies + - name: install APT dependencies apt: name: [ # Ansible python-pkg-resources, rsync, # Python basics python3, python3-dev, python3-pip, libpq-dev, # SWH libsvn-dev, libsystemd-dev, libpython3-dev, graphviz, git, build-essential, pkg-config, myrepos ] - name: install APT dependencies pip: name: [ # Cassandra Python client cassandra-driver, lz4, # pgsql Python client psycopg2, ] executable: pip3 - hosts: clients tasks: - name: copy swh-environment synchronize: src: /home/dev/swh-environment/ dest: /home/vlorentz/swh-environment/ delete: yes rsync_opts: ["--exclude", "*/__pycache__/", "--exclude", "*/.*"] - - name: install swh-environment - shell: "pip3 install $(./bin/pip-swh-packages --with-testing) --user" - args: - chdir: /home/vlorentz/swh-environment + - block: + - name: install swh-environment + # Can't use /usr/bin/pip3 if there is a newer pip lib installed locally + shell: "~/.local/bin/pip3 install $(./bin/pip-swh-packages --with-testing) --user" + args: + chdir: /home/vlorentz/swh-environment + creates: /home/vlorentz/.local/lib/python3.5/site-packages/swh.storage.egg-link + rescue: + - name: install pip locally + pip: + name: pip + state: latest + executable: pip3 + - name: install swh-environment + shell: "~/.local/bin/pip3 install $(./bin/pip-swh-packages --with-testing) --user" + args: + chdir: /home/vlorentz/swh-environment diff --git a/playbooks/files/test_cassandra.py b/playbooks/files/test_cassandra.py new file mode 100644 index 0000000..8b9d9a9 --- /dev/null +++ b/playbooks/files/test_cassandra.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import sys + +from cassandra.cluster import Cluster +from cassandra.policies import RoundRobinPolicy + +if len(sys.argv) != 2: + print('Syntax: test_cassandra.py ', file=sys.stderr) + exit(1) +hosts = sys.argv[1].split(',') + +cluster = Cluster( + hosts, + load_balancing_policy=RoundRobinPolicy()) + +session = cluster.connect() diff --git a/playbooks/templates/cassandra.yaml b/playbooks/templates/cassandra.yaml new file mode 100644 index 0000000..51980b1 --- /dev/null +++ b/playbooks/templates/cassandra.yaml @@ -0,0 +1,24 @@ +data_file_directories: + - {{data_dir}}/data +commitlog_directory: {{data_dir}}/commitlog +hints_directory: {{data_dir}}/hints +saved_caches_directory: {{data_dir}}/saved_caches + +commitlog_sync: periodic +commitlog_sync_period_in_ms: 10000 +partitioner: org.apache.cassandra.dht.Murmur3Partitioner +endpoint_snitch: SimpleSnitch +seed_provider: + - class_name: org.apache.cassandra.locator.SimpleSeedProvider + parameters: + - seeds: " + {%- for server in groups['cassandra-servers'] -%} + {{hostvars[server].ansible_host}} + {%- if not loop.last %},{% endif -%} + {% endfor %}" + +storage_port: 7000 +native_transport_port: 9042 +start_native_transport: true +listen_address: {{ansible_host}} +start_rpc: false diff --git a/playbooks/test-deployment.yml b/playbooks/test-deployment.yml new file mode 100644 index 0000000..3d0e364 --- /dev/null +++ b/playbooks/test-deployment.yml @@ -0,0 +1,9 @@ +- hosts: clients + tasks: + - name: test connection to Cassandra + script: > + test_cassandra.py + {% for server in groups['cassandra-servers'] %} + {{hostvars[server].ansible_host}} + {% if not loop.last %},{% endif %} + {% endfor %} diff --git a/terraform/azure.tf b/terraform/azure.tf index 17c6d4f..fb57ca3 100644 --- a/terraform/azure.tf +++ b/terraform/azure.tf @@ -1,154 +1,155 @@ ############################## # Global provider "azurerm" { } data "azurerm_network_security_group" "worker-nsg" { name = "worker-nsg" resource_group_name = "swh-resource" } data "azurerm_subnet" "default" { name = "default" virtual_network_name = "swh-vnet" resource_group_name = "swh-resource" } ############################## # Cassandra servers resource "azurerm_network_interface" "cassandra-servers_interfaces" { count = "${var.nb_cassandra_servers}" name = "cassandra-server-${count.index}_interface" location = "westeurope" resource_group_name = "euwest-cassandra" network_security_group_id = "${data.azurerm_network_security_group.worker-nsg.id}" ip_configuration { name = "myNicConfiguration" subnet_id = "${data.azurerm_subnet.default.id}" public_ip_address_id = "" private_ip_address_allocation = "Dynamic" } } resource "azurerm_virtual_machine" "cassandra-servers" { count = "${var.nb_cassandra_servers}" name = "cassandra-server-${count.index}" location = "westeurope" resource_group_name = "euwest-cassandra" network_interface_ids = [ "${element(azurerm_network_interface.cassandra-servers_interfaces.*.id, count.index)}"] vm_size = "Standard_B1s" + #vm_size = "Standard_E2s_v3" storage_os_disk { name = "cassandra-server-${count.index}_osdisk" caching = "ReadWrite" create_option = "FromImage" managed_disk_type = "Premium_LRS" } storage_image_reference { publisher = "credativ" offer = "Debian" sku = "9" version = "latest" } os_profile { computer_name = "test-cassandra-server-${count.index}" admin_username = "vlorentz" } os_profile_linux_config { disable_password_authentication = true ssh_keys { path = "/home/vlorentz/.ssh/authorized_keys" key_data = "${var.ssh_key_data}" } } storage_data_disk { name = "cassandra-server-${count.index}_datadisk" lun = 0 disk_size_gb = 64 managed_disk_type = "Premium_LRS" create_option = "Empty" } } output "cassandra_servers_ips" { value = "${azurerm_network_interface.cassandra-servers_interfaces.*.private_ip_address}" } ############################## # Client resource "azurerm_network_interface" "cassandra-clients_interfaces" { count = "${var.nb_clients}" name = "cassandra-client-${count.index}_interface" location = "westeurope" resource_group_name = "euwest-cassandra" network_security_group_id = "${data.azurerm_network_security_group.worker-nsg.id}" ip_configuration { name = "myNicConfiguration" subnet_id = "${data.azurerm_subnet.default.id}" public_ip_address_id = "" private_ip_address_allocation = "Dynamic" } } resource "azurerm_virtual_machine" "cassandra-clients" { count = "${var.nb_clients}" name = "cassandra-client-${count.index}" location = "westeurope" resource_group_name = "euwest-cassandra" network_interface_ids = [ "${element(azurerm_network_interface.cassandra-clients_interfaces.*.id, count.index)}"] vm_size = "Standard_B1s" storage_os_disk { name = "cassandra-client-${count.index}_osdisk" caching = "ReadWrite" create_option = "FromImage" managed_disk_type = "Premium_LRS" } storage_image_reference { publisher = "credativ" offer = "Debian" sku = "9" version = "latest" } os_profile { computer_name = "test-cassandra-client-${count.index}" admin_username = "vlorentz" } os_profile_linux_config { disable_password_authentication = true ssh_keys { path = "/home/vlorentz/.ssh/authorized_keys" key_data = "${var.ssh_key_data}" } } storage_data_disk { name = "cassandra-client-${count.index}_datadisk" lun = 0 disk_size_gb = 64 managed_disk_type = "Premium_LRS" create_option = "Empty" } } output "cassandra_clients_ips" { value = "${azurerm_network_interface.cassandra-clients_interfaces.*.private_ip_address}" }