From 7a950004db2f46ce3ff0db162f7b3382947bc219 Mon Sep 17 00:00:00 2001 From: geekup-legodevops <72587752+geekup-legodevops@users.noreply.github.com> Date: Wed, 9 Feb 2022 16:10:45 +0700 Subject: [PATCH] Ansible support on Amazon Linux (#10466) - Improve the ansible script to support Amazon Linux - Remove the port validation on the preflight template - Display message to show the host IP for user to access the app --- deploy/ansible/README.MD | 2 +- .../roles/setup-appsmith/defaults/main.yml | 2 + .../roles/setup-appsmith/handlers/main.yml | 6 ++ .../tasks/Amazon-setup-docker.yml | 81 +++++++++++++++++++ .../tasks/Debian-setup-docker.yml | 78 ++++++++++++++++++ .../tasks/Ubuntu-setup-docker.yml | 3 + .../roles/setup-appsmith/tasks/main.yml | 17 +++- .../roles/setup-appsmith/tasks/preflight.yml | 59 +++++++------- .../setup-appsmith/tasks/setup-appsmith.yml | 3 + .../setup-appsmith/tasks/setup-docker.yml | 47 ----------- .../setup-appsmith/tasks/setup-ubuntu.yml | 53 ------------ .../setup-appsmith/tasks/start-docker.yml | 13 +++ 12 files changed, 230 insertions(+), 134 deletions(-) create mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/handlers/main.yml create mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Amazon-setup-docker.yml create mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Debian-setup-docker.yml create mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Ubuntu-setup-docker.yml delete mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-docker.yml delete mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-ubuntu.yml create mode 100644 deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/start-docker.yml diff --git a/deploy/ansible/README.MD b/deploy/ansible/README.MD index fe983cde10..362cbe2ca4 100644 --- a/deploy/ansible/README.MD +++ b/deploy/ansible/README.MD @@ -92,7 +92,7 @@ After complete the above step. Now the only remain step we need to do is run the You can run the ansible playbook with the following command ``` -$ ansible-playbook -i inventory main.yml --extra-var "@appsmith-vars.yml" +$ ansible-playbook -i inventory appsmith-playbook.yml --extra-var "@appsmith-vars.yml" ``` The command above will use the host information from the `inventory` file & feed your configuration vars from `appsmith-vars.yml` before running the playbook diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/defaults/main.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/defaults/main.yml index d502d4270a..696e5a3b55 100644 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/defaults/main.yml +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/defaults/main.yml @@ -23,3 +23,5 @@ docker_apt_gpg_key: https://download.docker.com/linux/{{ ansible_distribution | # A list of users who will be added to the docker group. docker_users: [] + +template_file_name: 'docker-compose.yml' \ No newline at end of file diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/handlers/main.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/handlers/main.yml new file mode 100644 index 0000000000..03beb039f5 --- /dev/null +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/handlers/main.yml @@ -0,0 +1,6 @@ +--- + +- name: Successful installation message + debug: + msg: "Successful installation. Please open http://{{ ansible_host }}/ to view your instance" + listen: "Start Appsmith with docker-compose" \ No newline at end of file diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Amazon-setup-docker.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Amazon-setup-docker.yml new file mode 100644 index 0000000000..bccb558b6f --- /dev/null +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Amazon-setup-docker.yml @@ -0,0 +1,81 @@ +--- + +- name: Make sure docker from distro is not installed + yum: + name: "{{ item }}" + state: absent + with_items: + - docker + - docker-common + - container-selinux + - docker-selinux + - docker-engine + +- name: Update all packages + yum: + name: '*' + state: latest + update_only: yes + become: true + +- name: Install yum-utils + yum: + name: "{{ item }}" + state: present + update_cache: yes + with_items: + - python-pip + - yum-utils + - device-mapper-persistent-data + - lvm2 + - amazon-linux-extras + become: true + +- name: Add extras repository + shell: yum-config-manager --enable extras + become: true + +- name: Enable Some packages from amazon-linux-extras packages + shell: "amazon-linux-extras enable python3.8 ansible2 docker" + become: true + +- name: Clean yum metadata cache + command: yum clean metadata + args: + warn: false + +- name: Ensure a list of yum packages are installed + yum: + name: "{{ packages }}" + state: latest + update_cache: yes + vars: + packages: + - python3.8 + - ansible + - docker + become: true + +- name: Upgrade pip3 + shell: "python3.8 -m pip install pip --upgrade" + become: true + +- name: Install Docker-compose + get_url: + url: https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-Linux-x86_64 + dest: '{{ docker_compose_path }}' + mode: 0755 + become: true + +- name: Ensure handlers are notified now to avoid firewall conflicts. + meta: flush_handlers + +- name: Ensure docker users are added to the docker group. + user: + name: "{{ ansible_user }}" + groups: docker + append: true + become: true + +- name: reset ssh connection to allow user changes to affect 'current login user' + meta: reset_connection diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Debian-setup-docker.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Debian-setup-docker.yml new file mode 100644 index 0000000000..d29df2e898 --- /dev/null +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Debian-setup-docker.yml @@ -0,0 +1,78 @@ +--- + +- name: Upgrade all packages to the latest version + apt: + name: '*' + state: latest + become: true + +- name: Install required system packages + apt: + update_cache: yes + name: + - apt-transport-https + - ca-certificates + - curl + - software-properties-common + - python3-pip + - virtualenv + - python3-setuptools + - gnupg2 + state: latest + become: true + tags: + - always + +- name: Ensure old versions of Docker are not installed + package: + name: + - docker + - docker-engine + state: absent + +- name: Extra packages for Ubuntu + apt: + name: linux-image-extra-virtual + state: latest + become: true + when: ansible_distribution == "Ubuntu" + +- name: Add key id + apt_key: + url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg" + state: present + become: true + +- name: Add docker repository + apt_repository: + repo: "deb [arch=amd64] https://download.docker.com/linux/{{ ansible_distribution | lower }} {{ ansible_distribution_release | lower }} stable" + filename: docker + state: present + become: true + +- name: Install docker + apt: + name: docker-ce + update_cache: yes + state: present + become: true + +- name: Install Docker-compose + get_url: + url: https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-Linux-x86_64 + dest: '{{ docker_compose_path }}' + mode: 0755 + become: true + +- name: Ensure handlers are notified now to avoid firewall conflicts. + meta: flush_handlers + +- name: Ensure docker users are added to the docker group. + user: + name: "{{ ansible_user }}" + groups: docker + append: true + become: true + +- name: reset ssh connection to allow user changes to affect 'current login user' + meta: reset_connection diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Ubuntu-setup-docker.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Ubuntu-setup-docker.yml new file mode 100644 index 0000000000..a90f70374c --- /dev/null +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/Ubuntu-setup-docker.yml @@ -0,0 +1,3 @@ +--- + +- include_tasks: Debian-setup-docker.yml \ No newline at end of file diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/main.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/main.yml index bba544101d..65abe7fe7f 100644 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/main.yml +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/main.yml @@ -1,8 +1,21 @@ --- - include_tasks: preflight.yml -- include_tasks: setup-ubuntu.yml +- name: Throw error when finding out properly running container + fail: + msg: "Appsmith may already run on this server. Please check out from this address http://{{ansible_host}}" + when: + - container_running.stdout == 'true' + - http_request.status == 200 -- include_tasks: setup-docker.yml +- name: Throw error when existing container not reachable + fail: + msg: "Appsmith may be installed but not work properly. Please check on server (IP: {{ansible_host}})" + when: container_running.stdout == 'true' + +- include_tasks: "{{ ansible_distribution }}-setup-docker.yml" + when: "'docker' not in ansible_facts.packages" + +- include_tasks: start-docker.yml - include_tasks: setup-appsmith.yml diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/preflight.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/preflight.yml index 95798f9123..e049a8057d 100644 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/preflight.yml +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/preflight.yml @@ -1,35 +1,32 @@ --- + +- name: Check if docker is installed + package_facts: + manager: auto + +- name: Check running container + shell: docker inspect --format={{ '{{.State.Running}}' }} appsmith + register: container_running + ignore_errors: True + - name: Check folder installation exist and empty - find: - paths: '{{ install_dir }}' - register: filesFound + stat: + path: '{{ install_dir }}' + register: installDir -- fail: - msg: 'The {{ install_dir }} folder is existed and not empty' - when: filesFound.matched > 0 +- name: Check docker-compose.yml file exists + stat: + path: '{{ install_dir }}/{{ template_file_name }}' + register: template_file -- name: Check port 80 is listening - wait_for: - port: 80 - delay: 2 - timeout: 5 - msg: 'Timeout waiting for 80 to respond' - register: port_80 - ignore_errors: yes - -- fail: - msg: 'Port 80 is running' - when: port_80.failed == false - -- name: Check port 443 is listening - wait_for: - port: 443 - delay: 2 - timeout: 5 - msg: 'Timeout waiting for 443 to respond' - register: port_443 - ignore_errors: yes - -- fail: - msg: 'Port 443 is running' - when: port_443.failed == false +- name: Health check running container + uri: + url: http://localhost/api/v1/users/me + method: GET + status_code: + - 200 + - 502 + - 503 + register: http_request + when: + - container_running.stdout == 'true' diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-appsmith.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-appsmith.yml index 88ae147fdd..c460bb45d9 100644 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-appsmith.yml +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-appsmith.yml @@ -3,14 +3,17 @@ file: path: '{{ install_dir }}' state: directory + when: installDir.stat.exists == false - name: Download docker-compose.yml get_url: url: https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/aws_ami/docker-compose.yml dest: '{{ install_dir }}' mode: 0440 + when: template_file.stat.exists == false - name: Start Appsmith shell: docker-compose up -d args: chdir: '{{ install_dir }}' + notify: "Start Appsmith with docker-compose" diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-docker.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-docker.yml deleted file mode 100644 index f50f1195d7..0000000000 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-docker.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -- name: Install Docker - package: - name: '{{ docker_package }}' - state: '{{ docker_package_state }}' - become: yes - -- name: Ensure Docker is started and enabled at boot - service: - name: docker - state: '{{ docker_service_state }}' - enabled: '{{ docker_service_enabled }}' - -- name: Ensure handlers are notified now to avoid firewall conflicts - meta: flush_handlers - -- name: Ensure docker users are added to the docker group - user: - name: '{{ ansible_user }}' - groups: docker - append: true - become: yes - -- name: reset ssh connection to allow user changes to affect 'current login user' - meta: reset_connection - -- name: Check current docker-compose version - command: docker-compose --version - register: docker_compose_current_version - changed_when: false - failed_when: false - -- name: Delete existing docker-compose version if it's different - file: - path: '{{ docker_compose_path }}' - state: absent - when: > - docker_compose_current_version.stdout is defined - and docker_compose_version not in docker_compose_current_version.stdout - become: yes - -- name: Install Docker-compose - get_url: - url: https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-Linux-x86_64 - dest: '{{ docker_compose_path }}' - mode: 0755 - become: yes diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-ubuntu.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-ubuntu.yml deleted file mode 100644 index c8f4e4d7a7..0000000000 --- a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/setup-ubuntu.yml +++ /dev/null @@ -1,53 +0,0 @@ ---- -- name: Upgrade all packages to the latest version - apt: - name: '*' - state: latest - become: yes - -- name: Install required system packages - apt: - update_cache: yes - name: - - apt-transport-https - - ca-certificates - - curl - - software-properties-common - - python3-pip - - virtualenv - - python3-setuptools - state: latest - become: yes - tags: - - always - -- name: Ensure old versions of Docker are not installed - package: - name: - - docker - - docker-engine - state: absent - -- name: Ensure dependencies are installed - apt: - name: - - apt-transport-https - - ca-certificates - - gnupg2 - - curl - state: present - become: yes - -- name: Add Docker apt key - shell: > - curl -sSL {{ docker_apt_gpg_key }} | sudo apt-key add - - args: - warn: false - become: yes - -- name: Add Docker repository - apt_repository: - repo: '{{ docker_apt_repository }}' - state: present - update_cache: true - become: yes diff --git a/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/start-docker.yml b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/start-docker.yml new file mode 100644 index 0000000000..ac52463afd --- /dev/null +++ b/deploy/ansible/appsmith_playbook/roles/setup-appsmith/tasks/start-docker.yml @@ -0,0 +1,13 @@ +--- +- name: Enable docker + service: + enabled: yes + name: 'docker' + state: 'started' + become: true + +- name: Start docker + service: + name: 'docker' + state: 'restarted' + become: true \ No newline at end of file