diff --git a/ansible-builder/bindep.txt b/ansible-builder/bindep.txt new file mode 100644 index 0000000..bb24848 --- /dev/null +++ b/ansible-builder/bindep.txt @@ -0,0 +1,5 @@ +python38-devel [platform:rpm compile] +subversion [platform:rpm] +subversion [platform:dpkg] +git-lfs [platform:rpm] + diff --git a/ansible-builder/context/Dockerfile b/ansible-builder/context/Dockerfile new file mode 100644 index 0000000..23e823e --- /dev/null +++ b/ansible-builder/context/Dockerfile @@ -0,0 +1,36 @@ +ARG EE_BASE_IMAGE=quay.io/ansible/ansible-runner:latest +ARG EE_BUILDER_IMAGE=quay.io/ansible/ansible-builder:latest + +FROM $EE_BASE_IMAGE as galaxy +ARG ANSIBLE_GALAXY_CLI_COLLECTION_OPTS= +USER root + +ADD _build /build +WORKDIR /build + +RUN ansible-galaxy role install -r requirements.yml --roles-path /usr/share/ansible/roles +RUN ansible-galaxy collection install $ANSIBLE_GALAXY_CLI_COLLECTION_OPTS -r requirements.yml --collections-path /usr/share/ansible/collections + +FROM $EE_BUILDER_IMAGE as builder + +COPY --from=galaxy /usr/share/ansible /usr/share/ansible + +ADD _build/requirements.txt requirements.txt +ADD _build/bindep.txt bindep.txt +RUN ansible-builder introspect --sanitize --user-pip=requirements.txt --user-bindep=bindep.txt --write-bindep=/tmp/src/bindep.txt --write-pip=/tmp/src/requirements.txt +RUN assemble + +FROM $EE_BASE_IMAGE +USER root + +COPY --from=galaxy /usr/share/ansible /usr/share/ansible + +COPY --from=builder /output/ /output/ +RUN /output/install-from-bindep && rm -rf /output/wheels +RUN alternatives --set python /usr/bin/python3 +COPY --from=quay.io/project-receptor/receptor:0.9.7 /usr/bin/receptor /usr/bin/receptor +RUN mkdir -p /var/run/receptor +ADD run.sh /run.sh +CMD /run.sh +USER 1000 +RUN git lfs install diff --git a/ansible-builder/context/_build/bindep.txt b/ansible-builder/context/_build/bindep.txt new file mode 100644 index 0000000..bb24848 --- /dev/null +++ b/ansible-builder/context/_build/bindep.txt @@ -0,0 +1,5 @@ +python38-devel [platform:rpm compile] +subversion [platform:rpm] +subversion [platform:dpkg] +git-lfs [platform:rpm] + diff --git a/ansible-builder/context/_build/requirements.txt b/ansible-builder/context/_build/requirements.txt new file mode 100644 index 0000000..57ba1cb --- /dev/null +++ b/ansible-builder/context/_build/requirements.txt @@ -0,0 +1,4 @@ +hcloud +urllib3 +jmespath +git+https://github.com/ansible/ansible-builder.git@devel#egg=ansible-builder \ No newline at end of file diff --git a/ansible-builder/context/_build/requirements.yml b/ansible-builder/context/_build/requirements.yml new file mode 100644 index 0000000..72392e5 --- /dev/null +++ b/ansible-builder/context/_build/requirements.yml @@ -0,0 +1,5 @@ +--- +collections: + - ansible.posix + - hetzner.hcloud + - community.general diff --git a/ansible-builder/context/run.sh b/ansible-builder/context/run.sh new file mode 100755 index 0000000..e96b122 --- /dev/null +++ b/ansible-builder/context/run.sh @@ -0,0 +1,2 @@ +#! /bin/bash +ansible-runner worker --private-data-dir=/runner diff --git a/ansible-builder/execution-environment.yml b/ansible-builder/execution-environment.yml new file mode 100644 index 0000000..b72f09d --- /dev/null +++ b/ansible-builder/execution-environment.yml @@ -0,0 +1,18 @@ +--- +version: 1 +dependencies: + galaxy: requirements.yml + python: requirements.txt + system: bindep.txt + + +additional_build_steps: + append: + - RUN alternatives --set python /usr/bin/python3 + - COPY --from=quay.io/project-receptor/receptor:0.9.7 /usr/bin/receptor /usr/bin/receptor + - RUN mkdir -p /var/run/receptor + - ADD run.sh /run.sh + - CMD /run.sh + - USER 1000 + - RUN git lfs install + diff --git a/ansible-builder/requirements.txt b/ansible-builder/requirements.txt new file mode 100644 index 0000000..57ba1cb --- /dev/null +++ b/ansible-builder/requirements.txt @@ -0,0 +1,4 @@ +hcloud +urllib3 +jmespath +git+https://github.com/ansible/ansible-builder.git@devel#egg=ansible-builder \ No newline at end of file diff --git a/ansible-builder/requirements.yml b/ansible-builder/requirements.yml new file mode 100644 index 0000000..72392e5 --- /dev/null +++ b/ansible-builder/requirements.yml @@ -0,0 +1,5 @@ +--- +collections: + - ansible.posix + - hetzner.hcloud + - community.general diff --git a/create-database.yml b/create-database.yml index 3e1bb16..911a06b 100644 --- a/create-database.yml +++ b/create-database.yml @@ -87,3 +87,5 @@ Content-Type: "application/json" Smardigo-User-Token: "{{ smardigo_management_token }}" status_code: [200] + retries: 5 + delay: 5 diff --git a/create-realm.yml b/create-realm.yml index b20fd4c..0745ccf 100644 --- a/create-realm.yml +++ b/create-realm.yml @@ -34,9 +34,13 @@ gather_facts: false become: false + collections: + - hetzner.hcloud + - community.general + pre_tasks: - name: "Gathering current server infos from hetzner" - hcloud_server_info: + hetzner.hcloud.hcloud_server_info: api_token: "{{ hetzner_authentication_token }}" register: hetzner_server_infos delegate_to: 127.0.0.1 @@ -84,3 +88,5 @@ Content-Type: "application/json" Smardigo-User-Token: "{{ smardigo_management_token }}" status_code: [200] + retries: 5 + delay: 5 diff --git a/create-server.yml b/create-server.yml index 11731f0..bd9e984 100644 --- a/create-server.yml +++ b/create-server.yml @@ -158,3 +158,5 @@ Content-Type: "application/json" Smardigo-User-Token: "{{ smardigo_management_token }}" status_code: [200] + retries: 5 + delay: 5 diff --git a/create-service.yml b/create-service.yml index e124231..5d98eaa 100644 --- a/create-service.yml +++ b/create-service.yml @@ -83,3 +83,5 @@ Content-Type: "application/json" Smardigo-User-Token: "{{ smardigo_management_token }}" status_code: [200] + retries: 5 + delay: 5 diff --git a/dynamic-provisioning.yml b/dynamic-provisioning.yml deleted file mode 100644 index 1df36d5..0000000 --- a/dynamic-provisioning.yml +++ /dev/null @@ -1,249 +0,0 @@ ---- - -############################################################# -# create inventory dynamically for given parameters -############################################################# - -- hosts: localhost - connection: local - gather_facts: false - - pre_tasks: - - name: "Check if ansible version is at least 2.10.x" - assert: - that: - - ansible_version.major >= 2 - - ansible_version.minor >= 10 - msg: "The ansible version has to be at least ({{ ansible_version.full }})" - - tasks: - - name: Add hosts - add_host: - name: "{{ stage }}-{{ name }}-{{ '%02d' | format(item|int) }}" - groups: - - "stage_{{ stage }}" - - "{{ service }}" - - "dynamic_{{ service }}" - with_sequence: start=1 end={{ count }} - -############################################################# -# run provisioning against newly created inventory -############################################################# - -- hosts: "stage_{{ stage }}" - serial: "{{ serial_number | default(5) }}" - gather_facts: false - - pre_tasks: - - name: Get all Firewalls from Hetzner - uri: - url: "https://api.hetzner.cloud/v1/firewalls" - headers: - accept: application/json - authorization: Bearer {{ hetzner_authentication_token }} - return_content: yes - register: hetzner_firewalls_response - delegate_to: 127.0.0.1 - tags: - - update_networks - - - name: Save firewall entries as variable (fact) - set_fact: - hetzner_firewalls_response_json: "{{ hetzner_firewalls_response.json }}" - tags: - - update_networks - - - name: Parse firewall entries - set_fact: - firewall_records: "{{ hetzner_firewalls_response_json.firewalls | json_query(jmesquery) }}" - vars: - jmesquery: '[*].{id: id, name: name}' - tags: - - update_networks - - - name: Print firewall entries - debug: - msg: "{{ firewall_records }}" - tags: - - update_networks - - roles: - - role: hcloud - -############################################################# -# -############################################################# - -- hosts: "stage_{{ stage }}" - serial: "{{ serial_number | default(1) }}" - gather_facts: false - - pre_tasks: - - name: "Gather current server infos" - hcloud_server_info: - api_token: "{{ hetzner_authentication_token }}" - register: hetzner_server_infos - delegate_to: 127.0.0.1 - become: false - - - name: "Set current server infos as fact: hetzner_server_infos_json" - set_fact: - hetzner_server_infos_json: "{{ hetzner_server_infos.hcloud_server_info }}" - delegate_to: 127.0.0.1 - become: false - - - name: "Read ip address for {{ inventory_hostname }}" - set_fact: - stage_server_ip: "{{ item.ipv4_address }}" - when: item.name == inventory_hostname - with_items: "{{ hetzner_server_infos_json }}" - delegate_to: 127.0.0.1 - become: false - -# - name: Print the gathered infos -# debug: -# var: stage_server_ip -# delegate_to: 127.0.0.1 - - - name: Remove {{ stage_server_ip }} keys from known_hosts - shell: ssh-keygen -R {{ stage_server_ip }} - delegate_to: 127.0.0.1 - - - name: Add {{ stage_server_ip }} keys from known_hosts - shell: ssh-keyscan -H {{ stage_server_ip }} >> ~/.ssh/known_hosts - delegate_to: 127.0.0.1 - - - name: Remove {{ inventory_hostname }}.{{ domain }} keys from known_hosts - shell: ssh-keygen -R {{ inventory_hostname }}.{{ domain }} - delegate_to: 127.0.0.1 - - - name: Add {{ inventory_hostname }}.{{ domain }} keys from known_hosts - shell: ssh-keyscan -H {{ inventory_hostname }}.{{ domain }} >> ~/.ssh/known_hosts - delegate_to: 127.0.0.1 - -############################################################# -# run server setup against newly created inventory -############################################################# - -- hosts: "stage_{{ stage }}" - serial: "{{ serial_number | default(5) }}" - remote_user: root - - pre_tasks: - - name: Remove outdated dependencies - apt: - name: [ - 'docker', - 'docker-client', - 'docker-client-latest', - 'docker-common', - 'docker-latest', - 'docker-latest-logrotate', - 'docker-logrotate', - 'docker-engine', - 'smartmontools', - ] - state: 'absent' - when: ansible_distribution == "Ubuntu" - - - name: "Gather current server infos" - hcloud_server_info: - api_token: "{{ hetzner_authentication_token }}" - register: hetzner_server_infos - delegate_to: 127.0.0.1 - become: false - - - name: "Set current server infos as fact: hetzner_server_infos_json" - set_fact: - hetzner_server_infos_json: "{{ hetzner_server_infos.hcloud_server_info }}" - delegate_to: 127.0.0.1 - become: false - - - name: "Read ip address for {{ inventory_hostname }}" - set_fact: - stage_server_ip: "{{ item.ipv4_address }}" - when: item.name == inventory_hostname - with_items: "{{ hetzner_server_infos_json }}" - delegate_to: 127.0.0.1 - become: false - -# - name: Print the gathered infos -# debug: -# var: stage_server_ip -# delegate_to: 127.0.0.1 - - roles: - - role: ansible-role-docker - vars: - docker_compose_version: '1.29.1' - docker_compose_path: '/usr/bin/docker-compose' - docker_users: '{{ smardigo_plattform_users }}' - - - role: common - - - role: filebeat - when: filebeat_enabled | default(True) - - - role: node-exporter - when: node_exporter_enabled | default(True) - - - role: traefik - when: traefik_enabled | default(True) - -############################################################# -# run service setup against newly created inventory -############################################################# - -- hosts: "stage_{{ stage }}" - serial: "{{ serial_number | default(5) }}" - remote_user: root - - pre_tasks: - - name: "Gather current server infos" - hcloud_server_info: - api_token: "{{ hetzner_authentication_token }}" - register: hetzner_server_infos - delegate_to: 127.0.0.1 - become: false - tags: - - update_networks - - - name: "Set current server infos as fact: hetzner_server_infos_json" - set_fact: - hetzner_server_infos_json: "{{ hetzner_server_infos.hcloud_server_info }}" - delegate_to: 127.0.0.1 - become: false - tags: - - update_networks - - - name: "Read ip address for {{ inventory_hostname }}" - set_fact: - stage_server_ip: "{{ item.ipv4_address }}" - when: item.name == inventory_hostname - with_items: "{{ hetzner_server_infos_json }}" - delegate_to: 127.0.0.1 - become: false - tags: - - update_networks - -# - name: Print the gathered infos -# debug: -# var: stage_server_ip -# delegate_to: 127.0.0.1 -# become: false -# tags: -# - update_networks - - roles: - - role: connect - when: "'connect' in group_names" - - role: keycloak - when: "'keycloak' in group_names" - - role: postfix - when: "'postfix' in group_names" - - role: harbor - when: "'harbor' in group_names" - - role: elastic - when: "'elastic' in group_names" - - role: prometheus - when: "'prometheus' in group_names" \ No newline at end of file diff --git a/group_vars/all/plain.yml b/group_vars/all/plain.yml index 740897b..efa9cfc 100644 --- a/group_vars/all/plain.yml +++ b/group_vars/all/plain.yml @@ -49,10 +49,11 @@ default_plattform_users: - '{{ admin_user }}' smardigo_plattform_users: + - 'ansible' + - 'daniel.dz' - 'peter.heise' - 'sven.ketelsen' - 'vanphuong.ma' - - 'daniel.dz' docker_owner: "{{ admin_user }}" docker_group: "{{ admin_user }}" @@ -103,6 +104,7 @@ hetzner_server_type: cx11 hetzner_server_image: ubuntu-20.04 hetzner_ssh_keys: + - ansible@smardigo.digital - peter.heise@arxes-tolina.de - sven.ketelsen@arxes-tolina.de - vanphuong.ma@arxes-tolina.de diff --git a/group_vars/stage_dev/plain.yml b/group_vars/stage_dev/plain.yml index 1f9bd91..ae522b5 100644 --- a/group_vars/stage_dev/plain.yml +++ b/group_vars/stage_dev/plain.yml @@ -8,21 +8,50 @@ alertmanager_channel_smardigo: "#monitoring-qa" shared_service_elastic_01: "10.0.0.2" shared_service_elastic_02: "10.0.0.3" shared_service_elastic_03: "10.0.0.4" -shared_service_prometheus_ip: "10.0.0.5" +shared_service_awx_ip: "10.0.0.10" +shared_service_docker_ip: "10.0.0.7" +shared_service_iam_ip: "10.0.0.13" shared_service_keycloak_ip: "10.0.0.6" shared_service_mail_ip: "10.0.0.8" -shared_service_iam_ip: "10.0.0.13" +shared_service_awx_hostname: dev-awx-01.smardigo.digital +shared_service_docker_registry_hostname: dev-docker-registry-01.smardigo.digital shared_service_iam_hostname: "dev-iam-01.smardigo.digital" shared_service_keycloak_hostname: "dev-keycloak-01.smardigo.digital" shared_service_mail_hostname: "dev-mail-01.smardigo.digital" -keycloak_server_url: "https://{{ shared_service_keycloak_hostname }}" +shared_service_hosts: [ + { + ip: "127.0.1.1", + name: "{{ stage_server_hostname }}" + }, + { + ip: "{{ shared_service_awx_ip }}", + name: "{{ shared_service_awx_hostname }}" + }, + { + ip: "{{ shared_service_docker_ip }}", + name: "{{ shared_service_docker_registry_hostname }}" + }, + { + ip: "{{ shared_service_iam_ip }}", + name: "{{ shared_service_iam_hostname }}" + }, + { + ip: "{{ shared_service_keycloak_ip }}", + name: "{{ shared_service_keycloak_hostname }}" + }, + { + ip: "{{ shared_service_mail_ip }}", + name: "{{ shared_service_mail_hostname }}" + } +] -docker_registry: dev-docker-registry-01.smardigo.digital docker_registry_username: "< see vault >" docker_registry_token: "< see vault >" +keycloak_server_url: "https://{{ shared_service_keycloak_hostname }}" + filebeat_certificate: "dev-elastic-stack-filebeat" logstash_certificate: "dev-elastic-stack-logstash" @@ -76,46 +105,46 @@ kibana_extra_hosts: [ ip: "{{ shared_service_elastic_03 }}", }, ] -prometheus_extra_hosts: [ - { - hostname: "{{ shared_service_mail_hostname }}", - ip: "{{ shared_service_mail_ip }}", - } -] -connect_extra_hosts: [ - { - hostname: "{{ shared_service_iam_hostname }}", - ip: "{{ shared_service_iam_ip }}", - }, - { - hostname: "{{ shared_service_keycloak_hostname }}", - ip: "{{ shared_service_keycloak_ip }}", - }, - { - hostname: "{{ shared_service_mail_hostname }}", - ip: "{{ shared_service_mail_ip }}", - } -] -keycloak_extra_hosts: [ - { - hostname: "{{ shared_service_iam_hostname }}", - ip: "{{ shared_service_iam_ip }}", - }, - { - hostname: "{{ shared_service_mail_hostname }}", - ip: "{{ shared_service_mail_ip }}", - } -] -iam_extra_hosts: [ - { - hostname: "{{ shared_service_keycloak_hostname }}", - ip: "{{ shared_service_keycloak_ip }}", - }, - { - hostname: "{{ shared_service_mail_hostname }}", - ip: "{{ shared_service_mail_ip }}", - } -] +#prometheus_extra_hosts: [ +# { +# hostname: "{{ shared_service_mail_hostname }}", +# ip: "{{ shared_service_mail_ip }}", +# } +#] +#connect_extra_hosts: [ +# { +# hostname: "{{ shared_service_iam_hostname }}", +# ip: "{{ shared_service_iam_ip }}", +# }, +# { +# hostname: "{{ shared_service_keycloak_hostname }}", +# ip: "{{ shared_service_keycloak_ip }}", +# }, +# { +# hostname: "{{ shared_service_mail_hostname }}", +# ip: "{{ shared_service_mail_ip }}", +# } +#] +#keycloak_extra_hosts: [ +# { +# hostname: "{{ shared_service_iam_hostname }}", +# ip: "{{ shared_service_iam_ip }}", +# }, +# { +# hostname: "{{ shared_service_mail_hostname }}", +# ip: "{{ shared_service_mail_ip }}", +# } +#] +#iam_extra_hosts: [ +# { +# hostname: "{{ shared_service_keycloak_hostname }}", +# ip: "{{ shared_service_keycloak_ip }}", +# }, +# { +# hostname: "{{ shared_service_mail_hostname }}", +# ip: "{{ shared_service_mail_ip }}", +# } +#] smardigo_management_url: "https://dev-management-smardigo-01.smardigo.digital/api/v1/scopes/{{ scope_id }}/processes/{{ process_instance_id }}/messages" smardigo_management_token: "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..JgixZcmsSyvovabQvREAjw.Fk7aNYwOjzMhLCqF_9unl5yrWTey26z4scZBeVZjhpE.fnovrqn0MUjM_TA8zVhXdQ" \ No newline at end of file diff --git a/host_vars/dev-awx-01.yml b/host_vars/dev-awx-01.yml new file mode 100644 index 0000000..f742cf5 --- /dev/null +++ b/host_vars/dev-awx-01.yml @@ -0,0 +1,5 @@ +--- + +hetzner_server_labels: "stage={{ stage }} service=awx" + +hetzner_server_type: cpx31 diff --git a/host_vars/dev-docker-registry-01.yml b/host_vars/dev-docker-registry-01.yml index 10a60d8..0e49d25 100644 --- a/host_vars/dev-docker-registry-01.yml +++ b/host_vars/dev-docker-registry-01.yml @@ -1,5 +1,5 @@ --- -hetzner_server_labels: "stage={{ stage }} service=docker" +hetzner_server_labels: "stage={{ stage }} service=harbor" hetzner_server_type: cpx31 diff --git a/host_vars/dev-elastic-stack-01.yml b/host_vars/dev-elastic-stack-01.yml index 61e3733..2d84211 100644 --- a/host_vars/dev-elastic-stack-01.yml +++ b/host_vars/dev-elastic-stack-01.yml @@ -5,6 +5,7 @@ hetzner_server_labels: "stage={{ stage }} service=elastic" hetzner_server_type: cx31 smardigo_plattform_users: + - 'ansible' - 'elastic' - 'peter.heise' - 'sven.ketelsen' diff --git a/host_vars/dev-elastic-stack-02.yml b/host_vars/dev-elastic-stack-02.yml index 61e3733..2d84211 100644 --- a/host_vars/dev-elastic-stack-02.yml +++ b/host_vars/dev-elastic-stack-02.yml @@ -5,6 +5,7 @@ hetzner_server_labels: "stage={{ stage }} service=elastic" hetzner_server_type: cx31 smardigo_plattform_users: + - 'ansible' - 'elastic' - 'peter.heise' - 'sven.ketelsen' diff --git a/host_vars/dev-elastic-stack-03.yml b/host_vars/dev-elastic-stack-03.yml index 61e3733..2d84211 100644 --- a/host_vars/dev-elastic-stack-03.yml +++ b/host_vars/dev-elastic-stack-03.yml @@ -5,6 +5,7 @@ hetzner_server_labels: "stage={{ stage }} service=elastic" hetzner_server_type: cx31 smardigo_plattform_users: + - 'ansible' - 'elastic' - 'peter.heise' - 'sven.ketelsen' diff --git a/roles/common/configs/docker/config.json.j2 b/roles/common/configs/docker/config.json.j2 index 6c54bf7..bd6463d 100644 --- a/roles/common/configs/docker/config.json.j2 +++ b/roles/common/configs/docker/config.json.j2 @@ -1,6 +1,6 @@ { "auths": { - "{{ docker_registry }}": { + "{{ shared_service_docker_registry_hostname }}": { "auth": "{{ [docker_registry_username, docker_registry_token] | join(":") | string | b64encode }}" } } diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml index 5af442a..cc2d65a 100644 --- a/roles/common/tasks/main.yml +++ b/roles/common/tasks/main.yml @@ -38,13 +38,16 @@ hostname: name: "{{ stage_server_hostname }}" -- name: Add hostname to /etc/hosts file - lineinfile: - dest: /etc/hosts - regexp: '^127\.0\.1\.1' - line: "127.0.1.1 {{ stage_server_hostname }}" +- name: "Setting hosts configuration in /etc/hosts" + blockinfile: + marker: "# {mark} managed by ansible (hosts config for {{ stage_server_hostname }})" + path: "/etc/hosts" state: present - when: ansible_facts['distribution'] == "Ubuntu" + create: yes + block: | + {% for host in shared_service_hosts %} + {{ host.ip }} {{ host.name }} + {% endfor %} - name: "Read current users" shell: "getent passwd | awk -F: '$3 > 999 {print $1}'" @@ -75,7 +78,7 @@ # TODO check usage of key_options "no-agent-forwarding, no-agent-forwarding, no-X11-forwarding" - name: "Set up authorized users" - authorized_key: + ansible.posix.authorized_key: user: '{{ item }}' state: present exclusive: true diff --git a/roles/connect/defaults/main.yml b/roles/connect/defaults/main.yml index 61e9896..f54ddb7 100644 --- a/roles/connect/defaults/main.yml +++ b/roles/connect/defaults/main.yml @@ -2,7 +2,7 @@ connect_service_name: "{{ service_name }}-connect" -connect_image_name: "{{ docker_registry }}/smardigo/connect-whitelabel-app" +connect_image_name: "{{ shared_service_docker_registry_hostname }}/smardigo/connect-whitelabel-app" connect_version: 'latest' connect_admin_username: "connect-admin" diff --git a/roles/hcloud/tasks/_read_server_names.yml b/roles/hcloud/tasks/_read_server_names.yml new file mode 100644 index 0000000..e296101 --- /dev/null +++ b/roles/hcloud/tasks/_read_server_names.yml @@ -0,0 +1,29 @@ +--- + +- name: "Gathering current server infos for group {{ current_server_group.name }} from hetzner" + hcloud_server_info: + api_token: "{{ hetzner_authentication_token }}" + label_selector: "{{ current_server_group.label_selector }}" + register: current_server_infos + delegate_to: 127.0.0.1 + become: false + tags: + - update_config + +- name: "Setting server group as fact: server_group_{{ current_server_group.name }}" + set_fact: + server_group_{{ current_server_group.name }}: "{{ current_server_infos.hcloud_server_info | json_query(querystr) }}" + vars: + querystr: "[*].name" + delegate_to: 127.0.0.1 + become: false + tags: + - update_config + +- name: "Printing server group {{ current_server_group.name }}" + debug: + msg: "{{ lookup('vars', 'server_group_' + current_server_group.name) }}" + delegate_to: 127.0.0.1 + become: false + tags: + - update_config \ No newline at end of file diff --git a/roles/hcloud/tasks/main.yml b/roles/hcloud/tasks/main.yml index 4f738f0..140a8b6 100644 --- a/roles/hcloud/tasks/main.yml +++ b/roles/hcloud/tasks/main.yml @@ -63,11 +63,11 @@ vars: current_firewall_name: '{{ current_firewall }}' with_items: + - 'awx' - 'default' + - 'docker' - 'kibana' - - 'mail' - 'monitoring' - - 'docker' loop_control: loop_var: current_firewall tags: diff --git a/roles/hcloud/templates/firewall-mail.json.j2 b/roles/hcloud/templates/firewall-awx.json.j2 similarity index 66% rename from roles/hcloud/templates/firewall-mail.json.j2 rename to roles/hcloud/templates/firewall-awx.json.j2 index 321ec16..b42e8c7 100644 --- a/roles/hcloud/templates/firewall-mail.json.j2 +++ b/roles/hcloud/templates/firewall-awx.json.j2 @@ -1,14 +1,16 @@ { - "name": "mail", + "name": "awx", "labels": { }, "rules": [ { "direction": "in", "protocol": "tcp", - "port": "25", + "port": "32000", "source_ips": [ "149.233.6.129/32", + "212.121.131.106/32", + "87.150.34.206/32" ], "destination_ips": [ ] diff --git a/roles/hcloud/templates/firewall-docker.json.j2 b/roles/hcloud/templates/firewall-docker.json.j2 index 815af46..9a570f9 100644 --- a/roles/hcloud/templates/firewall-docker.json.j2 +++ b/roles/hcloud/templates/firewall-docker.json.j2 @@ -8,10 +8,9 @@ "protocol": "tcp", "port": "443", "source_ips": [ - "116.203.130.110/32", "157.90.236.71/32", "162.55.54.246/32", - "159.69.46.214/32" + "162.55.63.118/32" ], "destination_ips": [ ] diff --git a/roles/prometheus/tasks/main.yml b/roles/prometheus/tasks/main.yml index f6c56c9..2cdfac0 100644 --- a/roles/prometheus/tasks/main.yml +++ b/roles/prometheus/tasks/main.yml @@ -72,6 +72,37 @@ tags: - update_config +- name: "Reading current server groups from hetzner" + include_role: + name: hcloud + tasks_from: _read_server_names + with_items: [ + { + name: "all", + label_selector: "stage={{ stage }}", + }, + { + name: "harbor", + label_selector: "stage={{ stage }},service=harbor", + }, + { + name: "connect", + label_selector: "stage={{ stage }},service=connect", + }, + { + name: "elastic", + label_selector: "stage={{ stage }},service=elastic", + }, + { + name: "mail", + label_selector: "stage={{ stage }},service=mail", + } + ] + loop_control: + loop_var: current_server_group + tags: + - update_config + - name: "Deploy service templates for {{ service_name }}" include_role: name: _deploy diff --git a/smardigo/provisioning/form/header.json b/smardigo/provisioning/form/header.json index e7e7678..e769b51 100644 --- a/smardigo/provisioning/form/header.json +++ b/smardigo/provisioning/form/header.json @@ -3,7 +3,7 @@ "configKey" : "header", "page" : 0, "components" : [ { - "input" : false, + "input" : false, "tableView" : false, "columns" : [ { "components" : [ { @@ -43,6 +43,7 @@ "selectValues" : "", "disableLimit" : false, "template" : "{{[item.firstName, item.lastName].filter(Boolean).join(' ')}}", + "searchEnabled" : false, "placeholder" : "", "prefix" : "", "customClass" : "", @@ -65,6 +66,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "widget" : null, "refreshOn" : "", "clearOnRefresh" : false, @@ -74,23 +76,32 @@ "when" : null, "eq" : "" }, + "limit" : 100, "filter" : "", - "searchEnabled" : false, "searchField" : "", "minSearch" : 0, + "readOnlyValue" : false, "authenticate" : false, "selectFields" : "", - "id" : "eiwhw5a" + "customSearchCriteria" : "", + "searchThreshold" : 0.3, + "fuseOptions" : { }, + "customOptions" : { }, + "infiniteScroll" : false, + "clearValueIfNotInItems" : false, + "clientSideFilter" : "", + "id" : "evydmbo" } ], "width" : 4, "offset" : 0, "push" : 0, "pull" : 0, "type" : "column", - "input" : true, - "key" : "", + "input" : false, + "key" : "column1", "tableView" : true, "label" : "", + "hideOnChildrenHidden" : false, "placeholder" : "", "prefix" : "", "customClass" : "", @@ -116,6 +127,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "widget" : null, "refreshOn" : "", "clearOnRefresh" : false, @@ -130,7 +142,7 @@ "when" : null, "eq" : "" }, - "id" : "eshoyow" + "id" : "e9u3jbf" }, { "components" : [ { "labelPosition" : "left-right", @@ -151,16 +163,68 @@ "mode" : "single", "enableTime" : true, "noCalendar" : false, - "format" : "dd-MM-yyyy", + "format" : "dd.MM.yyyy", "defaultDate" : "", "hourIncrement" : 1, "minuteIncrement" : 1, "time_24hr" : false, "minDate" : null, - "maxDate" : null + "maxDate" : null, + "icons" : "fontawesome", + "i18n" : { + "lng" : "en", + "resources" : { + "de" : { + "translation" : { + "complete" : "Eingabe vollständig", + "error" : "Bitte beheben Sie vor dem Abschicken folgende Fehler.", + "required" : "{{field}} ist ein Pflichtfeld", + "pattern" : "{{field}} entspricht nicht dem Muster {{pattern}}", + "minLength" : "{{field}} muss länger als {{length}} Zeichen sein.", + "maxLength" : "{{field}} muss kürzer als {{length}} Zeichen sein.", + "min" : "{{field}} darf nicht kleiner als {{min}} sein.", + "max" : "{{field}} darf nicht größer als {{max}} sein.", + "invalid_email" : "{{field}} ist keine valide E-Mail-Adresse.", + "invalid_regex" : "{{field}} entspricht nicht dem Muster {{regex}}.", + "invalid_date" : "{{field}} ist kein valides Datum.", + "mask" : "{{field}} entspricht nicht der Maske.", + "stripe" : "{{stripe}}", + "month" : "Monat", + "day" : "Tag", + "year" : "Jahr", + "january" : "Januar", + "february" : "Februar", + "march" : "März", + "april" : "April", + "may" : "Mai", + "june" : "Juni", + "july" : "Juli", + "august" : "August", + "september" : "September", + "october" : "Oktober", + "november" : "November", + "december" : "Dezember", + "next" : "Weiter", + "previous" : "Zurück", + "cancel" : "Abbrechen", + "submit" : "Vorgang starten", + "dualMultiselect_filterPlaceholder" : "Tippen um zu filtern.", + "dualMultiselect_labelAll" : "Alle Werte", + "dualMultiselect_labelSelected" : "Ausgewählte Werte", + "dualMultiselect_buttonSelectAll" : "Alle auswählen", + "dualMultiselect_buttonDeselectAll" : "Alle abwählen", + "listSelection_buttonSelectAriaLabel" : "Eintrag Auswählen", + "mapView_zoomInButton" : "Vergrößern", + "mapView_zoomOutButton" : "Verkleinern", + "selectComponent_searchPlaceholder" : "Tippe um zu Suchen...", + "selectComponent_noChoicesText" : "Keine Elemente zur Auswahl", + "selectComponent_noResultsText" : "Keine Ergebnisse gefunden" + } + } + } + } }, "defaultValue" : "", - "defaultDate" : "", "placeholder" : "", "prefix" : "", "customClass" : "", @@ -183,6 +247,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "refreshOn" : "", "clearOnRefresh" : false, "validateOn" : "change", @@ -200,6 +265,7 @@ "allowInput" : true, "enableDate" : true, "enableTime" : true, + "defaultDate" : "", "displayInTimezone" : "viewer", "timezone" : "", "datepickerMode" : "day", @@ -222,17 +288,18 @@ "mousewheel" : true, "arrowkeys" : true }, - "id" : "epdpyie" + "id" : "ef2amw" } ], "width" : 4, "offset" : 0, "push" : 0, "pull" : 0, "type" : "column", - "input" : true, - "key" : "", + "input" : false, + "key" : "column2", "tableView" : true, "label" : "", + "hideOnChildrenHidden" : false, "placeholder" : "", "prefix" : "", "customClass" : "", @@ -258,6 +325,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "widget" : null, "refreshOn" : "", "clearOnRefresh" : false, @@ -272,7 +340,7 @@ "when" : null, "eq" : "" }, - "id" : "ezh6tkh" + "id" : "efau92d" }, { "components" : [ { "input" : true, @@ -296,6 +364,7 @@ "labelWidth" : 40, "disabled" : true, "lockKey" : true, + "widget" : null, "placeholder" : "", "prefix" : "", "customClass" : "", @@ -315,7 +384,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", - "widget" : null, + "allowCalculateOverride" : false, "refreshOn" : "", "clearOnRefresh" : false, "validateOn" : "change", @@ -332,17 +401,18 @@ "mask" : false, "inputType" : "text", "inputMask" : "", - "id" : "eay7qmt" + "id" : "ea7hs5" } ], "width" : 4, "offset" : 0, "push" : 0, "pull" : 0, "type" : "column", - "input" : true, - "key" : "", + "input" : false, + "key" : "column3", "tableView" : true, "label" : "", + "hideOnChildrenHidden" : false, "placeholder" : "", "prefix" : "", "customClass" : "", @@ -368,6 +438,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "widget" : null, "refreshOn" : "", "clearOnRefresh" : false, @@ -382,7 +453,7 @@ "when" : null, "eq" : "" }, - "id" : "ex6xngr" + "id" : "ez9z05q" } ], "type" : "columns", "tags" : [ ], @@ -395,6 +466,7 @@ "" : "" }, "label" : "Columns", + "key" : "columns", "placeholder" : "", "prefix" : "", "customClass" : "", @@ -420,6 +492,7 @@ "dbIndex" : false, "customDefaultValue" : "", "calculateValue" : "", + "allowCalculateOverride" : false, "widget" : null, "refreshOn" : "", "clearOnRefresh" : false, @@ -430,6 +503,7 @@ "customPrivate" : false }, "autoAdjust" : false, - "id" : "eoi1e6" + "hideOnChildrenHidden" : false, + "id" : "eqtnze" } ] } \ No newline at end of file diff --git a/smardigo/provisioning/form/simple-connect.json b/smardigo/provisioning/form/simple-connect.json index 90ffe6e..347f068 100644 --- a/smardigo/provisioning/form/simple-connect.json +++ b/smardigo/provisioning/form/simple-connect.json @@ -1,653 +1,681 @@ { - "name": "Simple Connect", - "configKey": "simple-connect", - "page": 0, - "components": [ - { - "label": "Cluster", - "mask": false, - "tableView": true, - "alwaysEnabled": false, - "type": "container", - "input": true, - "key": "cluster", - "validate": { - "customMessage": "", - "json": "", - "required": false, - "custom": "", - "customPrivate": false - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "components": [ - { - "label": "Cluster", - "mask": false, - "tableView": true, - "alwaysEnabled": false, - "type": "well", - "input": false, - "key": "cluster", - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "components": [ - { - "label": "Stage", - "labelPosition": "left-left", - "allowMultipleMasks": false, - "showWordCount": false, - "showCharCount": false, - "disabled": true, - "tableView": true, - "alwaysEnabled": false, - "type": "textfield", - "input": true, - "key": "stage", - "defaultValue": "", - "validate": { - "customMessage": "", - "json": "", - "required": true, - "minLength": null, - "maxLength": null, - "minWords": null, - "maxWords": null, - "custom": "", - "customPrivate": false, - "pattern": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "tabs": null, - "inputFormat": "plain", - "encrypted": false, - "properties": { - }, - "tags": [ - ], - "customConditional": "", - "logic": [ - ], - "widget": { - "type": "", - "format": "yyyy-MM-dd hh:mm a", - "dateFormat": "yyyy-MM-dd hh:mm a", - "saveAs": "text" - }, - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "protected": false, - "unique": false, - "persistent": true, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "mask": false, - "inputType": "text", - "inputMask": "", - "id": "ew5yzbt" - }, - { - "label": "Name", - "labelPosition": "left-left", - "allowMultipleMasks": false, - "showWordCount": false, - "showCharCount": false, - "tableView": true, - "alwaysEnabled": false, - "type": "textfield", - "input": true, - "key": "name", - "defaultValue": "", - "validate": { - "customMessage": "", - "json": "", - "required": true, - "minLength": null, - "maxLength": null, - "minWords": null, - "maxWords": null, - "custom": "", - "customPrivate": false, - "pattern": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "tabs": null, - "inputFormat": "plain", - "encrypted": false, - "properties": { - }, - "tags": [ - ], - "customConditional": "", - "logic": [ - ], - "widget": { - "type": "", - "format": "yyyy-MM-dd hh:mm a", - "dateFormat": "yyyy-MM-dd hh:mm a", - "saveAs": "text" - }, - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "protected": false, - "unique": false, - "persistent": true, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "disabled": false, - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "mask": false, - "inputType": "text", - "inputMask": "", - "id": "egdtruh" - }, - { - "label": "Size", - "labelPosition": "left-left", - "mask": false, - "disabled": true, - "tableView": true, - "alwaysEnabled": false, - "type": "number", - "input": true, - "key": "size", - "validate": { - "customMessage": "", - "json": "", - "required": true, - "min": null, - "max": null, - "custom": "", - "customPrivate": false, - "step": "any", - "integer": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "tabs": null, - "properties": { - }, - "tags": [ - ], - "delimiter": false, - "requireDecimal": false, - "encrypted": false, - "decimalLimit": null, - "customConditional": "", - "logic": [ - ], - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "defaultValue": null, - "protected": false, - "unique": false, - "persistent": true, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "widget": null, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "id": "e33y58" - }, - { - "label": "Service", - "labelPosition": "left-left", - "allowMultipleMasks": false, - "showWordCount": false, - "showCharCount": false, - "disabled": true, - "tableView": true, - "alwaysEnabled": false, - "type": "textfield", - "input": true, - "key": "service", - "defaultValue": "", - "validate": { - "customMessage": "", - "json": "", - "required": true, - "minLength": null, - "maxLength": null, - "minWords": null, - "maxWords": null, - "custom": "", - "customPrivate": false, - "pattern": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "tabs": null, - "inputFormat": "plain", - "encrypted": false, - "properties": { - }, - "tags": [ - ], - "customConditional": "", - "logic": [ - ], - "widget": { - "type": "", - "format": "yyyy-MM-dd hh:mm a", - "dateFormat": "yyyy-MM-dd hh:mm a", - "saveAs": "text" - }, - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "protected": false, - "unique": false, - "persistent": true, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "mask": false, - "inputType": "text", - "inputMask": "", - "id": "eu0zrp9" - } - ], - "tabs": null, - "reorder": false, - "properties": { - }, - "tags": null, - "customConditional": "", - "logic": [ - ], - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "defaultValue": null, - "protected": false, - "unique": false, - "persistent": false, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelPosition": "top", - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "disabled": false, - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "widget": null, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "validate": { - "required": false, - "custom": "", - "customPrivate": false - }, - "id": "e60dk9" - } - ], - "tabs": null, - "encrypted": false, - "properties": { - }, - "tags": [ - ], - "customConditional": "", - "logic": [ - ], - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "defaultValue": null, - "protected": false, - "unique": false, - "persistent": true, - "hidden": false, - "clearOnHide": true, - "dataGridLabel": false, - "labelPosition": "top", - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "disabled": false, - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "widget": null, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "tree": true, - "id": "eu5stp" + "name" : "Simple Connect", + "configKey" : "simple-connect", + "page" : 0, + "components" : [ { + "label" : "Cluster", + "mask" : false, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "container", + "input" : true, + "key" : "cluster", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : false, + "custom" : "", + "customPrivate" : false }, - { - "label": "progress_current", - "labelPosition": "left-left", - "hidden": true, - "mask": false, - "tableView": true, - "alwaysEnabled": false, - "type": "number", - "input": true, - "key": "progress_current", - "validate": { - "customMessage": "", - "json": "", - "required": false, - "custom": "", - "customPrivate": false, - "min": "", - "max": "", - "step": "any", - "integer": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" - }, - "tabs": null, - "delimiter": false, - "requireDecimal": false, - "encrypted": false, - "properties": { - }, - "tags": [ - ], - "decimalLimit": null, - "customConditional": "", - "logic": [ - ], - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "defaultValue": null, - "protected": false, - "unique": false, - "persistent": true, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "disabled": false, - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "widget": null, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "id": "exepewd" + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" }, - { - "label": "progress_max", - "labelPosition": "left-left", - "hidden": true, - "mask": false, - "tableView": true, - "alwaysEnabled": false, - "type": "number", - "input": true, - "key": "progress_max", - "validate": { - "customMessage": "", - "json": "", - "required": false, - "custom": "", - "customPrivate": false, - "min": "", - "max": "", - "step": "any", - "integer": "" - }, - "conditional": { - "show": "", - "when": "", - "json": "", - "eq": "" + "components" : [ { + "label" : "Cluster", + "mask" : false, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "well", + "input" : false, + "key" : "cluster", + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" }, - "tabs": null, - "delimiter": false, - "requireDecimal": false, - "encrypted": false, - "decimalLimit": null, - "properties": { + "components" : [ { + "label" : "Stage", + "labelPosition" : "left-left", + "allowMultipleMasks" : false, + "showWordCount" : false, + "showCharCount" : false, + "disabled" : true, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "textfield", + "input" : true, + "key" : "stage", + "defaultValue" : "", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : true, + "minLength" : null, + "maxLength" : null, + "minWords" : null, + "maxWords" : null, + "custom" : "", + "customPrivate" : false, + "pattern" : "" + }, + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" + }, + "tabs" : null, + "inputFormat" : "plain", + "encrypted" : false, + "properties" : { }, + "tags" : [ ], + "customConditional" : "", + "logic" : [ ], + "widget" : { + "type" : "", + "format" : "yyyy-MM-dd hh:mm a", + "dateFormat" : "yyyy-MM-dd hh:mm a", + "saveAs" : "text" + }, + "reorder" : false, + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "protected" : false, + "unique" : false, + "persistent" : true, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "mask" : false, + "inputType" : "text", + "inputMask" : "", + "id" : "eigbtac" + }, { + "label" : "Name", + "labelPosition" : "left-left", + "allowMultipleMasks" : false, + "showWordCount" : false, + "showCharCount" : false, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "textfield", + "input" : true, + "key" : "name", + "defaultValue" : "", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : true, + "minLength" : null, + "maxLength" : null, + "minWords" : null, + "maxWords" : null, + "custom" : "", + "customPrivate" : false, + "pattern" : "" + }, + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" + }, + "tabs" : null, + "inputFormat" : "plain", + "encrypted" : false, + "properties" : { }, + "tags" : [ ], + "customConditional" : "", + "logic" : [ ], + "widget" : { + "type" : "", + "format" : "yyyy-MM-dd hh:mm a", + "dateFormat" : "yyyy-MM-dd hh:mm a", + "saveAs" : "text" + }, + "reorder" : false, + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "protected" : false, + "unique" : false, + "persistent" : true, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "disabled" : false, + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "mask" : false, + "inputType" : "text", + "inputMask" : "", + "id" : "e4a12rg" + }, { + "label" : "Size", + "labelPosition" : "left-left", + "mask" : false, + "disabled" : true, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "number", + "input" : true, + "key" : "size", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : true, + "min" : null, + "max" : null, + "custom" : "", + "customPrivate" : false, + "step" : "any", + "integer" : "" + }, + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" + }, + "tabs" : null, + "properties" : { }, + "tags" : [ ], + "delimiter" : false, + "requireDecimal" : false, + "encrypted" : false, + "decimalLimit" : null, + "customConditional" : "", + "logic" : [ ], + "reorder" : false, + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "defaultValue" : null, + "protected" : false, + "unique" : false, + "persistent" : true, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "widget" : null, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "id" : "er1boyl" + }, { + "label" : "Service", + "labelPosition" : "left-left", + "allowMultipleMasks" : false, + "showWordCount" : false, + "showCharCount" : false, + "disabled" : true, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "textfield", + "input" : true, + "key" : "service", + "defaultValue" : "", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : true, + "minLength" : null, + "maxLength" : null, + "minWords" : null, + "maxWords" : null, + "custom" : "", + "customPrivate" : false, + "pattern" : "" + }, + "conditional" : { + "show" : "", + "when" : "", + "json" : "", + "eq" : "" + }, + "tabs" : null, + "inputFormat" : "plain", + "encrypted" : false, + "properties" : { }, + "tags" : [ ], + "customConditional" : "", + "logic" : [ ], + "widget" : { + "type" : "", + "format" : "yyyy-MM-dd hh:mm a", + "dateFormat" : "yyyy-MM-dd hh:mm a", + "saveAs" : "text" + }, + "reorder" : false, + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "protected" : false, + "unique" : false, + "persistent" : true, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "mask" : false, + "inputType" : "text", + "inputMask" : "", + "id" : "exyw29" + } ], + "tabs" : null, + "reorder" : false, + "properties" : { }, + "tags" : null, + "customConditional" : "", + "logic" : [ ], + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "defaultValue" : null, + "protected" : false, + "unique" : false, + "persistent" : false, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelPosition" : "top", + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "disabled" : false, + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "widget" : null, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "validate" : { + "required" : false, + "custom" : "", + "customPrivate" : false }, - "tags": [ - ], - "customConditional": "", - "logic": [ - ], - "reorder": false, - "placeholder": "", - "prefix": "", - "customClass": "", - "suffix": "", - "multiple": false, - "defaultValue": null, - "protected": false, - "unique": false, - "persistent": true, - "clearOnHide": true, - "dataGridLabel": false, - "labelWidth": 30, - "labelMargin": 3, - "description": "", - "errorLabel": "", - "tooltip": "", - "hideLabel": false, - "tabindex": "", - "disabled": false, - "autofocus": false, - "dbIndex": false, - "customDefaultValue": "", - "calculateValue": "", - "allowCalculateOverride": false, - "widget": null, - "refreshOn": "", - "clearOnRefresh": false, - "validateOn": "change", - "id": "eyaf4fl" + "id" : "e6x001" + } ], + "tabs" : null, + "encrypted" : false, + "properties" : { }, + "tags" : [ ], + "customConditional" : "", + "logic" : [ ], + "reorder" : false, + "placeholder" : "", + "prefix" : "", + "customClass" : "", + "suffix" : "", + "multiple" : false, + "defaultValue" : null, + "protected" : false, + "unique" : false, + "persistent" : true, + "hidden" : false, + "clearOnHide" : true, + "dataGridLabel" : false, + "labelPosition" : "top", + "labelWidth" : 30, + "labelMargin" : 3, + "description" : "", + "errorLabel" : "", + "tooltip" : "", + "hideLabel" : false, + "tabindex" : "", + "disabled" : false, + "autofocus" : false, + "dbIndex" : false, + "customDefaultValue" : "", + "calculateValue" : "", + "allowCalculateOverride" : false, + "widget" : null, + "refreshOn" : "", + "clearOnRefresh" : false, + "validateOn" : "change", + "tree" : true, + "id" : "eon3nm" + }, { + "label" : "progress_current", + "labelPosition" : "left-left", + "hidden" : true, + "mask" : false, + "tableView" : true, + "alwaysEnabled" : false, + "type" : "number", + "input" : true, + "key" : "progress_current", + "validate" : { + "customMessage" : "", + "json" : "", + "required" : false, + "custom" : "", + "customPrivate" : false, + "min" : "", + "max" : "", + "step" : "any", + "integer" : "" }, - { - "label": "HTML", - "labelPosition": "left-left", - "className": "", - "attrs": [ - { - "attr": "", - "value": "" - } - ], - "content": "