From d9433424e292876c85146813ecc6b7ef7fae0239 Mon Sep 17 00:00:00 2001 From: David Reed Date: Tue, 5 Mar 2019 12:23:34 +0000 Subject: [PATCH] [GITHUB-45] Adds SystemD service Adds a SystemD service file so we don't need to employ hacks to use the service on Bionic. Also updates with latest standards: * Latest versions and Xenial for Travis * Bumped minor versions since this is a new thing * Improves Galaxy meta info * Removes unneeded Molecule files --- .travis.yml | 11 +++---- .version | 2 +- Makefile | 19 ++++++++--- meta/main.yml | 8 ++--- molecule/default/create.yml | 60 ----------------------------------- molecule/default/destroy.yml | 28 ---------------- molecule/default/molecule.yml | 19 +++++++++-- molecule/default/playbook.yml | 1 + molecule/default/prepare.yml | 9 +++--- tasks/build.yml | 29 +++++++++++++---- tasks/configure.yml | 10 ------ templates/kafka.service.j2 | 16 ++++++++++ 12 files changed, 85 insertions(+), 127 deletions(-) delete mode 100644 molecule/default/create.yml delete mode 100644 molecule/default/destroy.yml create mode 100644 templates/kafka.service.j2 diff --git a/.travis.yml b/.travis.yml index 52667e7..adeaf47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ --- group: stable -dist: trusty +dist: xenial sudo: required language: python @@ -15,10 +15,9 @@ branches: - master env: - - ANSIBLE_INSTALL_VERSION=2.4.6.0 - - ANSIBLE_INSTALL_VERSION=2.5.11 - - ANSIBLE_INSTALL_VERSION=2.6.7 - - ANSIBLE_INSTALL_VERSION=2.7.1 + - ANSIBLE_INSTALL_VERSION=2.5.14 + - ANSIBLE_INSTALL_VERSION=2.6.13 + - ANSIBLE_INSTALL_VERSION=2.7.7 services: - docker @@ -28,7 +27,7 @@ before_install: - sudo apt-get install -o Dpkg::Options::="--force-confold" --force-yes -y docker-ce install: - - make .venv + - make deps script: - make test diff --git a/.version b/.version index 8616689..4d5034c 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -v3.1 +v3.2 diff --git a/Makefile b/Makefile index 09e360c..2b544aa 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,24 @@ -ANSIBLE_INSTALL_VERSION ?= 2.6.7 +ANSIBLE_INSTALL_VERSION ?= 2.7.7 PATH := $(PWD)/.venv_ansible$(ANSIBLE_INSTALL_VERSION)/bin:$(shell printenv PATH) SHELL := env PATH=$(PATH) /bin/bash +ifeq ($(SCENARIO), all) +SCENARIO_OPT = "--all" +else +SCENARIO_OPT = "--scenario-name=$(SCENARIO)" +endif + .DEFAULT_GOAL := help .PHONY: all clean destroy help test + ## Make deps, test all: deps test +## Setup dependencies +deps: .venv_ansible$(ANSIBLE_INSTALL_VERSION) + ## Activate the virtualenv activate: .venv_ansible$(ANSIBLE_INSTALL_VERSION) @@ -44,10 +54,10 @@ login_%: .venv_ansible$(ANSIBLE_INSTALL_VERSION) ## Run 'molecule test --destroy=never' (run 'make destroy' to destroy containers) test: .venv_ansible$(ANSIBLE_INSTALL_VERSION) - @.venv_ansible$(ANSIBLE_INSTALL_VERSION)/bin/molecule test --destroy=never + @.venv_ansible$(ANSIBLE_INSTALL_VERSION)/bin/molecule test $(SCENARIO_OPT) --destroy=never -# shortcut for creating virtualenv +# shortcut for creating venv .venv: .venv_ansible$(ANSIBLE_INSTALL_VERSION) @@ -72,6 +82,7 @@ watch: .venv_ansible$(ANSIBLE_INSTALL_VERSION) done +## Print this help help: @awk -v skip=1 \ '/^##/ { sub(/^[#[:blank:]]*/, "", $$0); doc_h=$$0; doc=""; skip=0; next } \ @@ -79,4 +90,4 @@ help: /^#/ { doc=doc "\n" substr($$0, 2); next } \ /:/ { sub(/:.*/, "", $$0); \ printf "\033[34m%-30s\033[0m\033[1m%s\033[0m %s\n\n", $$0, doc_h, doc; skip=1 }' \ - $(MAKEFILE_LIST) + $(MAKEFILE_LIST) \ No newline at end of file diff --git a/meta/main.yml b/meta/main.yml index 1d5e04e..e8e90e3 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -1,18 +1,18 @@ --- galaxy_info: + authod: sansible description: "Install Kafka server." license: MIT - # SAnsible only supports Ansible 2.4+ - min_ansible_version: 2.4 - min_ansible_container_version: 2.4 + min_ansible_version: 2.5 + min_ansible_container_version: 2.5 platforms: - name: Ubuntu versions: - trusty - xenial - bionic - categories: + galaxy_tags: - development dependencies: diff --git a/molecule/default/create.yml b/molecule/default/create.yml deleted file mode 100644 index c52693c..0000000 --- a/molecule/default/create.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- - -- name: Create - hosts: localhost - connection: local - gather_facts: false - no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" - vars: - molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" - molecule_ephemeral_directory: "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}" - molecule_scenario_directory: "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}" - molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" - tasks: - - name: Create Dockerfiles from image names - template: - src: "{{ molecule_scenario_directory }}/Dockerfile.j2" - dest: "{{ molecule_ephemeral_directory }}/Dockerfile_{{ item.image | regex_replace('[^a-zA-Z0-9_]', '_') }}" - with_items: "{{ molecule_yml.platforms }}" - register: platforms - - - name: Discover local Docker images - docker_image_facts: - name: "molecule_local/{{ item.item.name }}" - with_items: "{{ platforms.results }}" - register: docker_images - - - name: Build an Ansible compatible image - docker_image: - path: "{{ molecule_ephemeral_directory }}" - name: "molecule_local/{{ item.item.image }}" - dockerfile: "{{ item.item.dockerfile | default(item.invocation.module_args.dest) }}" - force: "{{ item.item.force | default(true) }}" - with_items: "{{ platforms.results }}" - when: platforms.changed or docker_images.results | map(attribute='images') | select('equalto', []) | list | count >= 0 - - - name: Create molecule instance(s) - docker_container: - name: "{{ item.name }}" - hostname: "{{ item.name }}" - image: "molecule_local/{{ item.image }}" - state: started - recreate: false - log_driver: "{{ 'none' if ( ansible_version.full | version_compare('2.4', '>=' )) else 'json-file' }}" - command: "{{ item.command | default('bash -c \"while true; do sleep 10000; done\"') }}" - privileged: "{{ item.privileged | default(omit) }}" - volumes: "{{ item.volumes | default(omit) }}" - capabilities: "{{ item.capabilities | default(omit) }}" - ports: "{{ item.exposed_ports | default(omit) }}" - register: server - with_items: "{{ molecule_yml.platforms }}" - async: 7200 - poll: 0 - - - name: Wait for instance(s) creation to complete - async_status: - jid: "{{ item.ansible_job_id }}" - register: docker_jobs - until: docker_jobs.finished - retries: 300 - with_items: "{{ server.results }}" diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml deleted file mode 100644 index 68dd4fd..0000000 --- a/molecule/default/destroy.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- - -- name: Destroy - hosts: localhost - connection: local - gather_facts: false - no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}" - vars: - molecule_file: "{{ lookup('env', 'MOLECULE_FILE') }}" - molecule_yml: "{{ lookup('file', molecule_file) | molecule_from_yaml }}" - tasks: - - name: Destroy molecule instance(s) - docker_container: - name: "{{ item.name }}" - state: absent - force_kill: "{{ item.force_kill | default(true) }}" - register: server - with_items: "{{ molecule_yml.platforms }}" - async: 7200 - poll: 0 - - - name: Wait for instance(s) deletion to complete - async_status: - jid: "{{ item.ansible_job_id }}" - register: docker_jobs - until: docker_jobs.finished - retries: 300 - with_items: "{{ server.results }}" diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index 095a11e..373990f 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -7,12 +7,26 @@ platforms: - name: sansible_kafka-trusty image: ubuntu:trusty - name: sansible_kafka-xenial - image: ubuntu:xenial + image: solita/ubuntu-systemd:xenial + command: /sbin/init + capabilities: + - SYS_ADMIN + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro - name: sansible_kafka-bionic - image: ubuntu:bionic + image: solita/ubuntu-systemd:bionic + command: /sbin/init + capabilities: + - SYS_ADMIN + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro provisioner: name: ansible + config_options: + defaults: + # Fix for issue https://github.com/ansible/ansible/issues/43884 + gather_timeout: 30 lint: name: ansible-lint inventory: @@ -47,7 +61,6 @@ lint: dependency: name: galaxy options: - ignore-certs: true role-file: requirements.yml scenario: diff --git a/molecule/default/playbook.yml b/molecule/default/playbook.yml index 9c3df6c..fe0d6a1 100644 --- a/molecule/default/playbook.yml +++ b/molecule/default/playbook.yml @@ -11,5 +11,6 @@ roles: - role: sansible.zookeeper + sansible_zookeeper_version: 3.4.13 - role: kafka diff --git a/molecule/default/prepare.yml b/molecule/default/prepare.yml index 53c310d..9b4f2ac 100644 --- a/molecule/default/prepare.yml +++ b/molecule/default/prepare.yml @@ -13,9 +13,8 @@ - name: Install apt-transport-https, lsb-release, net-tools become: yes apt: - name: "{{ item }}" + name: + - apt-transport-https + - lsb-release + - net-tools update_cache: yes - with_items: - - apt-transport-https - - lsb-release - - net-tools diff --git a/tasks/build.yml b/tasks/build.yml index bf4e7f9..b74435f 100644 --- a/tasks/build.yml +++ b/tasks/build.yml @@ -51,17 +51,34 @@ src: "/home/{{ sansible_kafka_user }}/kafka/config" state: link -- name: Create Kafka service +- name: Create Kafka service for SysV become: yes template: dest: /etc/init.d/kafka owner: root mode: 0755 src: kafka_sysv.j2 + when: ansible_service_mgr != "systemd" -- name: Create kafka startup links +- name: Add Kafka SystemD script become: yes - command: update-rc.d kafka defaults - args: - creates: "/etc/rc0.d/K??kafka" - when: ansible_distribution_release == "bionic" + template: + dest: /etc/systemd/system/kafka.service + mode: u+rw,g+rw,o+r + src: kafka.service.j2 + when: ansible_service_mgr == "systemd" + +- name: Ensure Kafka is enabled for SysV + become: yes + service: + name: kafka + enabled: yes + when: ansible_service_mgr != "systemd" + +- name: Ensure Kafka is enabled for SystemD + become: yes + systemd: + daemon_reload: yes + name: kafka + enabled: yes + when: ansible_service_mgr == "systemd" diff --git a/tasks/configure.yml b/tasks/configure.yml index 1d85896..94d418a 100644 --- a/tasks/configure.yml +++ b/tasks/configure.yml @@ -1,15 +1,5 @@ --- -# Needed to ensure some services start properly -- name: Set hostname - become: yes - lineinfile: - dest: /etc/hosts - line: "127.0.0.1 {{ ansible_hostname }}" - notify: - - restart kafka - when: ansible_virtualization_type != 'docker' - - name: Assigned ID EC2 fact hunt action: ec2_metadata_facts register: ec2_vars diff --git a/templates/kafka.service.j2 b/templates/kafka.service.j2 new file mode 100644 index 0000000..9afa682 --- /dev/null +++ b/templates/kafka.service.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=kafka stream-processing software +After=network.target network-online.target remote-fs.target + +[Service] +Type=simple +User=kafka +Group=kafka +EnvironmentFile=-/home/{{ sansible_kafka_user }}/etc/environment +ExecStart=/home/{{ sansible_kafka_user }}/kafka/bin/kafka-server-start.sh /home/{{ sansible_kafka_user }}/kafka/config/server.properties +ExecStop=/home/{{ sansible_kafka_user }}/kafka/bin/kafka-server-stop.sh +PIDFile=/var/run/kafka.pid +LimitNOFILE={{ sansible_kafka_max_open_files }} + +[Install] +WantedBy=multi-user.target \ No newline at end of file