From 154ecec39aafd22f7e825ce522ce825841a0f8d4 Mon Sep 17 00:00:00 2001 From: rjshrjndrn Date: Tue, 13 Nov 2018 11:26:41 +0530 Subject: [PATCH] Adding codebase --- .gitignore | 12 + ansible.cfg | 3 + artifacts/test | 0 es_composite_search_cluster_setup.yml | 50 + lp_cassandra_db_update.yml | 4 + lp_cassandra_provision.yml | 14 + lp_kafka_provision.yml | 46 + lp_kafka_setup.yml | 13 + lp_learning_deploy.yml | 10 + lp_learning_neo4j_deploy.yml | 4 + lp_learning_neo4j_provision.yml | 25 + lp_learning_provision.yml | 27 + lp_learning_validation.yml | 6 + lp_logstash_deploy.yml | 5 + lp_neo4j-backup.yml | 4 + lp_redis_provision.yml | 5 + lp_samza_deploy.yml | 31 + lp_samza_telemetry_schemas.yml | 26 + lp_search_deploy.yml | 4 + lp_search_provision.yml | 26 + lp_start_neo4j.yml | 15 + lp_stop_neo4j.yml | 15 + lp_synctool_deploy.yml | 5 + lp_yarn_provision.yml | 36 + lp_zookeeper_provision.yml | 30 + resources/copy_azure.sh | 25 + resources/upload_samza_logs | 24 + roles/add_user/tasks/main.yml | 15 + roles/ansible-kafka-upgrade/README.md | 20 + roles/ansible-kafka-upgrade/defaults/main.yml | 53 + .../files/truncate_logs.sh | 7 + roles/ansible-kafka-upgrade/handlers/main.yml | 5 + roles/ansible-kafka-upgrade/meta/main.yml | 18 + .../ansible-kafka-upgrade/tasks/configure.yml | 75 + roles/ansible-kafka-upgrade/tasks/main.yml | 26 + roles/ansible-kafka-upgrade/tasks/start.yml | 12 + roles/ansible-kafka-upgrade/tasks/stop.yml | 4 + .../templates/kafka.conf.j2 | 11 + .../templates/kafka.service.j2 | 15 + .../templates/log4j.properties.j2 | 72 + .../templates/server.properties.j2 | 122 + roles/ansible-kafka-upgrade/vars/main.yml | 2 + roles/azure-cli/tasks/main.yml | 9 + roles/cassandra-3.7.0/defaults/main.yml | 15 + roles/cassandra-3.7.0/handlers/main.yml | 5 + roles/cassandra-3.7.0/tasks/main.yml | 85 + .../templates/cassandra-lib.tgz | Bin 0 -> 616042 bytes .../templates/cassandra-rackdc.properties.j2 | 27 + roles/cassandra-3.7.0/templates/cassandra.j2 | 180 + roles/cassandra-backup/README.md | 78 + roles/cassandra-backup/handlers/main.yml | 6 + roles/cassandra-backup/meta/main.yml | 2 + roles/cassandra-backup/tasks/main.yml | 47 + .../templates/cassandra_backup.j2 | 68 + roles/cassandra-backup/vars/main.yml | 1 + roles/cassandra-db-update/defaults/main.yml | 5 + roles/cassandra-db-update/tasks/main.yml | 10 + .../cassandra-db-update/templates/data.cql.j2 | 35 + .../templates/dialcode.cql.j2 | 34 + roles/es6/LICENSE | 13 + roles/es6/README.md | 415 ++ roles/es6/ansible.cfg | 1 + roles/es6/defaults/main.yml | 43 + .../files/logging/log4j2.properties.custom.j2 | 76 + roles/es6/files/mappings/learning.json | 783 +++ .../es6/files/scripts/calculate-score.groovy | 1 + roles/es6/files/system_key | Bin 0 -> 128 bytes roles/es6/files/templates/backend.json | 411 ++ roles/es6/files/templates/compositeindex.json | 5122 +++++++++++++++++ roles/es6/files/templates/dialcode.json | 269 + .../es6/files/templates/failed-telemetry.json | 106 + roles/es6/files/templates/lp_audit_log.json | 314 + .../es6/files/templates/suggestionindex.json | 784 +++ roles/es6/files/templates/summary.json | 786 +++ .../files/templates/summary_cumulative.json | 786 +++ roles/es6/files/templates/telemetry.json | 411 ++ roles/es6/files/templates/vocabulary.json | 130 + roles/es6/filter_plugins/custom.py | 57 + roles/es6/filter_plugins/custom.pyc | Bin 0 -> 2893 bytes roles/es6/handlers/main.yml | 14 + roles/es6/meta/main.yml | 25 + .../elasticsearch-Debian-version-lock.yml | 6 + roles/es6/tasks/elasticsearch-Debian.yml | 48 + .../elasticsearch-RedHat-version-lock.yml | 7 + roles/es6/tasks/elasticsearch-RedHat.yml | 31 + roles/es6/tasks/elasticsearch-config.yml | 107 + .../es6/tasks/elasticsearch-optional-user.yml | 24 + roles/es6/tasks/elasticsearch-parameters.yml | 75 + roles/es6/tasks/elasticsearch-plugins.yml | 82 + roles/es6/tasks/elasticsearch-scripts.yml | 26 + roles/es6/tasks/elasticsearch-template.yml | 40 + roles/es6/tasks/elasticsearch.yml | 13 + roles/es6/tasks/java.yml | 51 + roles/es6/tasks/main.yml | 84 + .../xpack/elasticsearch-xpack-install.yml | 68 + roles/es6/tasks/xpack/elasticsearch-xpack.yml | 22 + .../security/elasticsearch-security-file.yml | 80 + .../elasticsearch-security-native.yml | 191 + .../xpack/security/elasticsearch-security.yml | 60 + .../elasticsearch-xpack-activation.yml | 37 + roles/es6/templates/elasticsearch.j2 | 83 + roles/es6/templates/elasticsearch.repo | 11 + roles/es6/templates/elasticsearch.yml.j2 | 52 + .../templates/init/debian/elasticsearch.j2 | 229 + .../templates/init/redhat/elasticsearch.j2 | 217 + roles/es6/templates/jvm.options.j2 | 118 + roles/es6/templates/log4j2.properties.j2 | 117 + .../templates/security/role_mapping.yml.j2 | 1 + roles/es6/templates/security/roles.yml.j2 | 1 + roles/es6/templates/security/users_roles.j2 | 1 + roles/es6/templates/systemd/elasticsearch.j2 | 76 + roles/es6/vars/Debian.yml | 4 + roles/es6/vars/RedHat.yml | 4 + roles/es6/vars/main.yml | 8 + roles/ffmpeg/defaults/main.yml | 2 + roles/ffmpeg/tasks/main.yml | 52 + roles/imagemagick/tasks/main.yml | 5 + roles/java/tasks/main.yml | 28 + roles/jdk-1.8.0_121/README.md | 38 + roles/jdk-1.8.0_121/tasks/main.yml | 25 + roles/jre-1.8.0_144/README.md | 38 + roles/jre-1.8.0_144/tasks/main.yml | 23 + roles/learning-service/defaults/main.yml | 62 + roles/learning-service/tasks/main.yml | 68 + .../templates/application.conf.j2 | 241 + roles/learning-service/templates/catalina.j2 | 591 ++ .../create_lp_suggestions_index.sh.j2 | 18 + .../templates/lp_suggestions_index.json.j2 | 738 +++ roles/learning-service/templates/server.xml | 142 + roles/logstash-deploy/defaults/main.yml | 9 + roles/logstash-deploy/tasks/main.yml | 36 + .../logstash-deploy/templates/logstash-lp.j2 | 84 + roles/logstash/defaults/main.yml | 10 + roles/logstash/tasks/main.yml | 46 + roles/logstash/templates/logstash.j2 | 78 + roles/logstash/templates/logstash.service.j2 | 14 + .../lp-learning-validation/defaults/main.yml | 3 + .../files/sunbird-logo.png | Bin 0 -> 4410 bytes roles/lp-learning-validation/files/test.pdf | Bin 0 -> 58437 bytes roles/lp-learning-validation/tasks/main.yml | 227 + roles/lp-synctool-deploy/defaults/main.yml | 21 + roles/lp-synctool-deploy/tasks/main.yml | 47 + .../templates/application.conf.j2 | 51 + roles/neo4j-backup/defaults/main.yml | 9 + roles/neo4j-backup/tasks/main.yml | 47 + roles/neo4j-backup/templates/backup_script.j2 | 15 + roles/neo4j-cluster/defaults/main.yml | 24 + roles/neo4j-cluster/tasks/main.yml | 56 + .../templates/neo4j-wrapper.conf.j2 | 77 + .../templates/neo4j.conf.arbiter.j2 | 242 + roles/neo4j-cluster/templates/neo4j.conf.j2 | 264 + roles/neo4j-deploy/defaults/main.yml | 11 + roles/neo4j-deploy/tasks/main.yml | 24 + roles/neo4j-deploy/templates/logstash-lp.j2 | 91 + roles/redis/defaults/main.yml | 4 + roles/redis/tasks/main.yml | 45 + roles/redis/templates/redis.conf.j2 | 1023 ++++ roles/redis/templates/stop_script.j2 | 11 + .../samza-job-monitor/files/samza_alerts.zip | Bin 0 -> 5034 bytes roles/samza-job-monitor/tasks/main.yml | 62 + .../samza-job-monitor/templates/samza-monitor | 109 + .../templates/samza-monitor-systemd | 14 + roles/samza-job-server/tasks/main.yml | 14 + .../templates/samza-job-server.sh | 104 + .../defaults/main.yml | 5 + .../tasks/main.yml | 12 + .../es-router-additional-config.json | 140 + ...es-router-additional-secondary-config.json | 29 + ...ect-denormalization-additional-config.json | 84 + .../tasks/main.yml | 17 + roles/samza-jobs/defaults/main.yml | 11 + roles/samza-jobs/files/find_job_name.sh | 1 + roles/samza-jobs/files/get_all_job_name.sh | 7 + .../files/get_all_running_app_id.sh | 2 + .../files/get_all_running_app_name.sh | 11 + roles/samza-jobs/files/kill_all_app.sh | 9 + roles/samza-jobs/files/kill_jobs.sh | 11 + roles/samza-jobs/files/remove_old_tar.sh | 12 + roles/samza-jobs/files/start_jobs.sh | 15 + roles/samza-jobs/files/update_new_job_name.sh | 14 + roles/samza-jobs/tasks/deploy.yml | 104 + roles/samza-jobs/tasks/main.yml | 9 + roles/samza-jobs/tasks/start_jobs.yml | 21 + roles/samza-jobs/tasks/stop_jobs.yml | 16 + roles/search-service-deploy/defaults/main.yml | 9 + roles/search-service-deploy/tasks/main.yml | 68 + .../templates/search-service.conf.j2 | 105 + .../templates/servicify-process.j2 | 102 + roles/search-service/defaults/main.yml | 14 + roles/search-service/tasks/main.yml | 5 + .../templates/servicify-process.j2 | 102 + roles/setup-kafka/defaults/main.yml | 145 + roles/setup-kafka/tasks/main.yml | 29 + roles/tomcat/defaults/main.yml | 10 + roles/tomcat/tasks/main.yml | 40 + roles/tomcat/templates/catalina.j2 | 591 ++ roles/tomcat/templates/server.xml | 142 + roles/tomcat/templates/tomcat-initscript.j2 | 131 + roles/yarn/defaults/main.yml | 16 + roles/yarn/files/truncate_logs.sh | 21 + roles/yarn/tasks/common.yml | 73 + roles/yarn/tasks/main.yml | 56 + roles/yarn/tasks/truncate-logs.yml | 8 + roles/yarn/templates/capacity-scheduler.xml | 111 + roles/yarn/templates/core-site.xml | 7 + roles/yarn/templates/hadoop-env.sh | 1 + roles/yarn/templates/log4j.properties | 267 + roles/yarn/templates/yarn-site.xml | 56 + roles/zookeeper-upgrade/defaults/main.yml | 18 + roles/zookeeper-upgrade/handlers/main.yml | 3 + roles/zookeeper-upgrade/tasks/Debian.yml | 41 + roles/zookeeper-upgrade/tasks/RedHat.yml | 53 + roles/zookeeper-upgrade/tasks/main.yml | 6 + .../templates/environment.j2 | 20 + .../templates/log4j.properties.j2 | 52 + roles/zookeeper-upgrade/templates/myid.j2 | 1 + roles/zookeeper-upgrade/templates/zoo.cfg.j2 | 12 + .../templates/zookeeper.conf.j2 | 17 + samza_jobs_alert.yml | 7 + samza_logs_provision.yml | 6 + ssh.yml | 14 + 221 files changed, 21882 insertions(+) create mode 100644 .gitignore create mode 100644 ansible.cfg create mode 100644 artifacts/test create mode 100644 es_composite_search_cluster_setup.yml create mode 100755 lp_cassandra_db_update.yml create mode 100644 lp_cassandra_provision.yml create mode 100644 lp_kafka_provision.yml create mode 100644 lp_kafka_setup.yml create mode 100644 lp_learning_deploy.yml create mode 100644 lp_learning_neo4j_deploy.yml create mode 100644 lp_learning_neo4j_provision.yml create mode 100644 lp_learning_provision.yml create mode 100644 lp_learning_validation.yml create mode 100644 lp_logstash_deploy.yml create mode 100644 lp_neo4j-backup.yml create mode 100644 lp_redis_provision.yml create mode 100644 lp_samza_deploy.yml create mode 100644 lp_samza_telemetry_schemas.yml create mode 100644 lp_search_deploy.yml create mode 100644 lp_search_provision.yml create mode 100644 lp_start_neo4j.yml create mode 100644 lp_stop_neo4j.yml create mode 100644 lp_synctool_deploy.yml create mode 100644 lp_yarn_provision.yml create mode 100644 lp_zookeeper_provision.yml create mode 100644 resources/copy_azure.sh create mode 100644 resources/upload_samza_logs create mode 100644 roles/add_user/tasks/main.yml create mode 100644 roles/ansible-kafka-upgrade/README.md create mode 100644 roles/ansible-kafka-upgrade/defaults/main.yml create mode 100644 roles/ansible-kafka-upgrade/files/truncate_logs.sh create mode 100644 roles/ansible-kafka-upgrade/handlers/main.yml create mode 100644 roles/ansible-kafka-upgrade/meta/main.yml create mode 100644 roles/ansible-kafka-upgrade/tasks/configure.yml create mode 100644 roles/ansible-kafka-upgrade/tasks/main.yml create mode 100644 roles/ansible-kafka-upgrade/tasks/start.yml create mode 100644 roles/ansible-kafka-upgrade/tasks/stop.yml create mode 100644 roles/ansible-kafka-upgrade/templates/kafka.conf.j2 create mode 100644 roles/ansible-kafka-upgrade/templates/kafka.service.j2 create mode 100644 roles/ansible-kafka-upgrade/templates/log4j.properties.j2 create mode 100644 roles/ansible-kafka-upgrade/templates/server.properties.j2 create mode 100644 roles/ansible-kafka-upgrade/vars/main.yml create mode 100644 roles/azure-cli/tasks/main.yml create mode 100644 roles/cassandra-3.7.0/defaults/main.yml create mode 100644 roles/cassandra-3.7.0/handlers/main.yml create mode 100644 roles/cassandra-3.7.0/tasks/main.yml create mode 100644 roles/cassandra-3.7.0/templates/cassandra-lib.tgz create mode 100644 roles/cassandra-3.7.0/templates/cassandra-rackdc.properties.j2 create mode 100644 roles/cassandra-3.7.0/templates/cassandra.j2 create mode 100755 roles/cassandra-backup/README.md create mode 100755 roles/cassandra-backup/handlers/main.yml create mode 100644 roles/cassandra-backup/meta/main.yml create mode 100755 roles/cassandra-backup/tasks/main.yml create mode 100644 roles/cassandra-backup/templates/cassandra_backup.j2 create mode 100644 roles/cassandra-backup/vars/main.yml create mode 100644 roles/cassandra-db-update/defaults/main.yml create mode 100644 roles/cassandra-db-update/tasks/main.yml create mode 100644 roles/cassandra-db-update/templates/data.cql.j2 create mode 100644 roles/cassandra-db-update/templates/dialcode.cql.j2 create mode 100644 roles/es6/LICENSE create mode 100644 roles/es6/README.md create mode 100644 roles/es6/ansible.cfg create mode 100644 roles/es6/defaults/main.yml create mode 100644 roles/es6/files/logging/log4j2.properties.custom.j2 create mode 100644 roles/es6/files/mappings/learning.json create mode 100644 roles/es6/files/scripts/calculate-score.groovy create mode 100644 roles/es6/files/system_key create mode 100644 roles/es6/files/templates/backend.json create mode 100644 roles/es6/files/templates/compositeindex.json create mode 100644 roles/es6/files/templates/dialcode.json create mode 100644 roles/es6/files/templates/failed-telemetry.json create mode 100644 roles/es6/files/templates/lp_audit_log.json create mode 100644 roles/es6/files/templates/suggestionindex.json create mode 100644 roles/es6/files/templates/summary.json create mode 100644 roles/es6/files/templates/summary_cumulative.json create mode 100644 roles/es6/files/templates/telemetry.json create mode 100644 roles/es6/files/templates/vocabulary.json create mode 100644 roles/es6/filter_plugins/custom.py create mode 100644 roles/es6/filter_plugins/custom.pyc create mode 100644 roles/es6/handlers/main.yml create mode 100644 roles/es6/meta/main.yml create mode 100644 roles/es6/tasks/elasticsearch-Debian-version-lock.yml create mode 100644 roles/es6/tasks/elasticsearch-Debian.yml create mode 100644 roles/es6/tasks/elasticsearch-RedHat-version-lock.yml create mode 100644 roles/es6/tasks/elasticsearch-RedHat.yml create mode 100644 roles/es6/tasks/elasticsearch-config.yml create mode 100644 roles/es6/tasks/elasticsearch-optional-user.yml create mode 100644 roles/es6/tasks/elasticsearch-parameters.yml create mode 100644 roles/es6/tasks/elasticsearch-plugins.yml create mode 100644 roles/es6/tasks/elasticsearch-scripts.yml create mode 100644 roles/es6/tasks/elasticsearch-template.yml create mode 100644 roles/es6/tasks/elasticsearch.yml create mode 100644 roles/es6/tasks/java.yml create mode 100644 roles/es6/tasks/main.yml create mode 100644 roles/es6/tasks/xpack/elasticsearch-xpack-install.yml create mode 100644 roles/es6/tasks/xpack/elasticsearch-xpack.yml create mode 100644 roles/es6/tasks/xpack/security/elasticsearch-security-file.yml create mode 100644 roles/es6/tasks/xpack/security/elasticsearch-security-native.yml create mode 100644 roles/es6/tasks/xpack/security/elasticsearch-security.yml create mode 100644 roles/es6/tasks/xpack/security/elasticsearch-xpack-activation.yml create mode 100644 roles/es6/templates/elasticsearch.j2 create mode 100644 roles/es6/templates/elasticsearch.repo create mode 100644 roles/es6/templates/elasticsearch.yml.j2 create mode 100755 roles/es6/templates/init/debian/elasticsearch.j2 create mode 100755 roles/es6/templates/init/redhat/elasticsearch.j2 create mode 100644 roles/es6/templates/jvm.options.j2 create mode 100644 roles/es6/templates/log4j2.properties.j2 create mode 100644 roles/es6/templates/security/role_mapping.yml.j2 create mode 100644 roles/es6/templates/security/roles.yml.j2 create mode 100644 roles/es6/templates/security/users_roles.j2 create mode 100644 roles/es6/templates/systemd/elasticsearch.j2 create mode 100644 roles/es6/vars/Debian.yml create mode 100644 roles/es6/vars/RedHat.yml create mode 100644 roles/es6/vars/main.yml create mode 100644 roles/ffmpeg/defaults/main.yml create mode 100755 roles/ffmpeg/tasks/main.yml create mode 100755 roles/imagemagick/tasks/main.yml create mode 100755 roles/java/tasks/main.yml create mode 100644 roles/jdk-1.8.0_121/README.md create mode 100644 roles/jdk-1.8.0_121/tasks/main.yml create mode 100644 roles/jre-1.8.0_144/README.md create mode 100644 roles/jre-1.8.0_144/tasks/main.yml create mode 100644 roles/learning-service/defaults/main.yml create mode 100644 roles/learning-service/tasks/main.yml create mode 100644 roles/learning-service/templates/application.conf.j2 create mode 100755 roles/learning-service/templates/catalina.j2 create mode 100644 roles/learning-service/templates/create_lp_suggestions_index.sh.j2 create mode 100644 roles/learning-service/templates/lp_suggestions_index.json.j2 create mode 100755 roles/learning-service/templates/server.xml create mode 100644 roles/logstash-deploy/defaults/main.yml create mode 100644 roles/logstash-deploy/tasks/main.yml create mode 100644 roles/logstash-deploy/templates/logstash-lp.j2 create mode 100644 roles/logstash/defaults/main.yml create mode 100644 roles/logstash/tasks/main.yml create mode 100644 roles/logstash/templates/logstash.j2 create mode 100644 roles/logstash/templates/logstash.service.j2 create mode 100644 roles/lp-learning-validation/defaults/main.yml create mode 100644 roles/lp-learning-validation/files/sunbird-logo.png create mode 100644 roles/lp-learning-validation/files/test.pdf create mode 100644 roles/lp-learning-validation/tasks/main.yml create mode 100644 roles/lp-synctool-deploy/defaults/main.yml create mode 100644 roles/lp-synctool-deploy/tasks/main.yml create mode 100644 roles/lp-synctool-deploy/templates/application.conf.j2 create mode 100644 roles/neo4j-backup/defaults/main.yml create mode 100755 roles/neo4j-backup/tasks/main.yml create mode 100644 roles/neo4j-backup/templates/backup_script.j2 create mode 100644 roles/neo4j-cluster/defaults/main.yml create mode 100644 roles/neo4j-cluster/tasks/main.yml create mode 100644 roles/neo4j-cluster/templates/neo4j-wrapper.conf.j2 create mode 100644 roles/neo4j-cluster/templates/neo4j.conf.arbiter.j2 create mode 100644 roles/neo4j-cluster/templates/neo4j.conf.j2 create mode 100644 roles/neo4j-deploy/defaults/main.yml create mode 100644 roles/neo4j-deploy/tasks/main.yml create mode 100644 roles/neo4j-deploy/templates/logstash-lp.j2 create mode 100644 roles/redis/defaults/main.yml create mode 100755 roles/redis/tasks/main.yml create mode 100644 roles/redis/templates/redis.conf.j2 create mode 100644 roles/redis/templates/stop_script.j2 create mode 100644 roles/samza-job-monitor/files/samza_alerts.zip create mode 100644 roles/samza-job-monitor/tasks/main.yml create mode 100644 roles/samza-job-monitor/templates/samza-monitor create mode 100644 roles/samza-job-monitor/templates/samza-monitor-systemd create mode 100644 roles/samza-job-server/tasks/main.yml create mode 100644 roles/samza-job-server/templates/samza-job-server.sh create mode 100644 roles/samza-jobs-additional-config/defaults/main.yml create mode 100644 roles/samza-jobs-additional-config/tasks/main.yml create mode 100644 roles/samza-jobs-additional-config/templates/es-router-additional-config.json create mode 100644 roles/samza-jobs-additional-config/templates/es-router-additional-secondary-config.json create mode 100644 roles/samza-jobs-additional-config/templates/object-denormalization-additional-config.json create mode 100644 roles/samza-jobs-telemetry-schemas/tasks/main.yml create mode 100644 roles/samza-jobs/defaults/main.yml create mode 100644 roles/samza-jobs/files/find_job_name.sh create mode 100644 roles/samza-jobs/files/get_all_job_name.sh create mode 100644 roles/samza-jobs/files/get_all_running_app_id.sh create mode 100644 roles/samza-jobs/files/get_all_running_app_name.sh create mode 100644 roles/samza-jobs/files/kill_all_app.sh create mode 100644 roles/samza-jobs/files/kill_jobs.sh create mode 100644 roles/samza-jobs/files/remove_old_tar.sh create mode 100644 roles/samza-jobs/files/start_jobs.sh create mode 100644 roles/samza-jobs/files/update_new_job_name.sh create mode 100644 roles/samza-jobs/tasks/deploy.yml create mode 100644 roles/samza-jobs/tasks/main.yml create mode 100644 roles/samza-jobs/tasks/start_jobs.yml create mode 100644 roles/samza-jobs/tasks/stop_jobs.yml create mode 100644 roles/search-service-deploy/defaults/main.yml create mode 100644 roles/search-service-deploy/tasks/main.yml create mode 100644 roles/search-service-deploy/templates/search-service.conf.j2 create mode 100644 roles/search-service-deploy/templates/servicify-process.j2 create mode 100644 roles/search-service/defaults/main.yml create mode 100644 roles/search-service/tasks/main.yml create mode 100644 roles/search-service/templates/servicify-process.j2 create mode 100644 roles/setup-kafka/defaults/main.yml create mode 100644 roles/setup-kafka/tasks/main.yml create mode 100644 roles/tomcat/defaults/main.yml create mode 100644 roles/tomcat/tasks/main.yml create mode 100644 roles/tomcat/templates/catalina.j2 create mode 100644 roles/tomcat/templates/server.xml create mode 100755 roles/tomcat/templates/tomcat-initscript.j2 create mode 100644 roles/yarn/defaults/main.yml create mode 100644 roles/yarn/files/truncate_logs.sh create mode 100644 roles/yarn/tasks/common.yml create mode 100644 roles/yarn/tasks/main.yml create mode 100644 roles/yarn/tasks/truncate-logs.yml create mode 100644 roles/yarn/templates/capacity-scheduler.xml create mode 100644 roles/yarn/templates/core-site.xml create mode 100644 roles/yarn/templates/hadoop-env.sh create mode 100644 roles/yarn/templates/log4j.properties create mode 100644 roles/yarn/templates/yarn-site.xml create mode 100644 roles/zookeeper-upgrade/defaults/main.yml create mode 100644 roles/zookeeper-upgrade/handlers/main.yml create mode 100644 roles/zookeeper-upgrade/tasks/Debian.yml create mode 100644 roles/zookeeper-upgrade/tasks/RedHat.yml create mode 100644 roles/zookeeper-upgrade/tasks/main.yml create mode 100644 roles/zookeeper-upgrade/templates/environment.j2 create mode 100644 roles/zookeeper-upgrade/templates/log4j.properties.j2 create mode 100644 roles/zookeeper-upgrade/templates/myid.j2 create mode 100644 roles/zookeeper-upgrade/templates/zoo.cfg.j2 create mode 100644 roles/zookeeper-upgrade/templates/zookeeper.conf.j2 create mode 100644 samza_jobs_alert.yml create mode 100644 samza_logs_provision.yml create mode 100644 ssh.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15d5974 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.backup +*.terrahelpbkp +.terraform +ekstep-terra-infra/terraform.tfstate.admin +ekstep-terra-infra/terraform.tfstate.admin.backup +ekstep-terra-infra/terraform.tfstate.devqa +ekstep-terra-infra/terraform.tfstate.devqa.backup +ekstep-terra-infra/terraform.tfstate.prod +ekstep-terra-infra/terraform.tfstate.prod.backup +.DS_Store +*.retry +Session.vim diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..3a86aef --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,3 @@ +#TODO Refactor and remove! +[defaults] +allow_world_readable_tmpfiles=true diff --git a/artifacts/test b/artifacts/test new file mode 100644 index 0000000..e69de29 diff --git a/es_composite_search_cluster_setup.yml b/es_composite_search_cluster_setup.yml new file mode 100644 index 0000000..93eea21 --- /dev/null +++ b/es_composite_search_cluster_setup.yml @@ -0,0 +1,50 @@ +--- +- hosts: composite-search-cluster + name: Setup composite search ES cluster + become: yes + pre_tasks: + - name: Create ecosystem group + become: yes + group: + state: present + name: "{{ ecosystem_group }}" + system: yes + - name: Create ecosystem user + become: yes + user: + state: present + name: "{{ ecosystem_user }}" + comment: ecosystem user + system: yes + createhome: yes + - name: Uncompressing and copying to system path + unarchive: + src: https://sunbirdpublic.blob.core.windows.net/installation/jre-8u144-linux-x64.tar.gz + dest: /opt/ + remote_src: yes + keep_newer: yes + become: yes + register: tar + - name: Updating java jre to system path + become: yes + shell: update-alternatives --install /usr/bin/java java /opt/jre1.8.0_144/bin/java 9999 + - name: Registering node name + set_fact: + es_instance_name: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}cs-node-{{ loop.index }}{% endif %}{% endfor %}" + + remote_user: ecosystem + roles: + - { role: es6, + es_config: { + cluster.name: "elasticsearch-composite-search", + discovery.zen.ping.unicast.hosts: "{{ groups['composite-search-cluster'] }}", + http.port: 9200, + transport.tcp.port: 9300, + node.data: "true", + node.master: "true", + bootstrap.memory_lock: true, + }, + es_heap_size: "2g", + es_etc_discovery_zen_ping_unicast_hosts: "{{ groups['composite-search-cluster'] }}", + es_etc_cluster_name: "elasticsearch-composite-search" + } diff --git a/lp_cassandra_db_update.yml b/lp_cassandra_db_update.yml new file mode 100755 index 0000000..9d4d4a1 --- /dev/null +++ b/lp_cassandra_db_update.yml @@ -0,0 +1,4 @@ +- hosts: lp-cassandra-new + become: yes + roles: + - cassandra-db-update diff --git a/lp_cassandra_provision.yml b/lp_cassandra_provision.yml new file mode 100644 index 0000000..ea5cae0 --- /dev/null +++ b/lp_cassandra_provision.yml @@ -0,0 +1,14 @@ +- hosts: lp-cassandra + # Install cassandra + become: yes + roles: + - jdk-1.8.0_121 + - cassandra-3.7.0 + tags: provision + +- hosts: lp_cassandra + become: yes + # Create Schema + roles: + - cassandra-db-update + tags: deploy diff --git a/lp_kafka_provision.yml b/lp_kafka_provision.yml new file mode 100644 index 0000000..d1614b6 --- /dev/null +++ b/lp_kafka_provision.yml @@ -0,0 +1,46 @@ +--- +- hosts: processing-cluster-kafka + pre_tasks: + - name: Create ecosytem group + become: yes + group: + state: present + name: "{{ ecosystem_group }}" + system: yes + - name: Create ecosystem user + become: yes + user: + state: present + name: "{{ ecosystem_user }}" + comment: ecosystem user + system: yes + createhome: yes + group: "{{ ecosystem_group }}" + - service: name=monit state=stopped + become: yes + ignore_errors: true + - name: Uncompressing and copying to system path + unarchive: + src: https://sunbirdpublic.blob.core.windows.net/installation/jre-8u144-linux-x64.tar.gz + dest: /opt/ + remote_src: yes + keep_newer: yes + become: yes + register: tar + - name: Updating java jre to system path + become: yes + shell: update-alternatives --install /usr/bin/java java /opt/jre1.8.0_144/bin/java 9999 + - name: Registering kafka_id + set_fact: + kafka_id: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}{{ loop.index }}{% endif %}{% endfor %}" + - name: Print kafka_id + debug: + var: kafka_id + become: yes + roles: + - ansible-kafka-upgrade + become: yes + post_tasks: + - service: name=monit state=started + become: yes + ignore_errors: true diff --git a/lp_kafka_setup.yml b/lp_kafka_setup.yml new file mode 100644 index 0000000..b9844ed --- /dev/null +++ b/lp_kafka_setup.yml @@ -0,0 +1,13 @@ +--- +- hosts: processing-cluster-kafka + remote_user: "{{ ecosystem_user }}" + become: yes + pre_tasks: + - name: Registering kafka_id + set_fact: + kafka_id: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}{{ loop.index }}{% endif %}{% endfor %}" + - name: Print kafka_id + debug: + var: kafka_id + roles: + - setup-kafka diff --git a/lp_learning_deploy.yml b/lp_learning_deploy.yml new file mode 100644 index 0000000..bffb2f7 --- /dev/null +++ b/lp_learning_deploy.yml @@ -0,0 +1,10 @@ +- hosts: learningall + vars_files: + - "{{ secrets_path }}" + pre_tasks: + - name: Registering mw_shard_id + set_fact: + mw_shard_id: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}{{ loop.index }}{% endif %}{% endfor %}" + roles: + - learning-service + serial: 1 diff --git a/lp_learning_neo4j_deploy.yml b/lp_learning_neo4j_deploy.yml new file mode 100644 index 0000000..3ff5a89 --- /dev/null +++ b/lp_learning_neo4j_deploy.yml @@ -0,0 +1,4 @@ +- hosts: learning-neo4j-cluster + roles: + - neo4j-deploy + \ No newline at end of file diff --git a/lp_learning_neo4j_provision.yml b/lp_learning_neo4j_provision.yml new file mode 100644 index 0000000..193baed --- /dev/null +++ b/lp_learning_neo4j_provision.yml @@ -0,0 +1,25 @@ +- hosts: learning-neo4j-cluster + pre_tasks: + - name: Create learner group + become: yes + group: + state: present + name: "{{ learner_group }}" + system: yes + - name: Create learner user + become: yes + user: + state: present + name: "{{ learner_user }}" + comment: learner user + system: yes + createhome: yes + group: "{{ learner_group }}" + - name: Registering server_id + set_fact: + server_id: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}{{ loop.index }}{% endif %}{% endfor %}" + roles: + - java + - neo4j-cluster + - logstash + diff --git a/lp_learning_provision.yml b/lp_learning_provision.yml new file mode 100644 index 0000000..414cb9d --- /dev/null +++ b/lp_learning_provision.yml @@ -0,0 +1,27 @@ +- hosts: learningall + pre_tasks: + - name: Create learner group + become: yes + group: + state: present + name: "{{ learner_group }}" + system: yes + - name: Create learner user + become: yes + user: + state: present + name: "{{ learner_user }}" + comment: learner user + system: yes + createhome: yes + group: "{{ learner_group }}" + - name: create folder data for learning + become: yes + file: path={{ item }} state=directory mode=0775 owner={{learner_user}} group={{learner_user}} + with_items: "{{ learnings.paths }}" + roles: + - java + - tomcat + - ffmpeg + - imagemagick + - logstash diff --git a/lp_learning_validation.yml b/lp_learning_validation.yml new file mode 100644 index 0000000..cea7b24 --- /dev/null +++ b/lp_learning_validation.yml @@ -0,0 +1,6 @@ +- hosts: learningall + vars_files: + - "{{ secrets_path }}" + roles: + - lp-learning-validation + serial: 1 diff --git a/lp_logstash_deploy.yml b/lp_logstash_deploy.yml new file mode 100644 index 0000000..3962a2c --- /dev/null +++ b/lp_logstash_deploy.yml @@ -0,0 +1,5 @@ +- hosts: "{{ remote }}" + roles: + - logstash-deploy + serial: 1 + \ No newline at end of file diff --git a/lp_neo4j-backup.yml b/lp_neo4j-backup.yml new file mode 100644 index 0000000..9261ff3 --- /dev/null +++ b/lp_neo4j-backup.yml @@ -0,0 +1,4 @@ +- hosts: learning-neo4j-node1 + remote_user: learning + roles: + - neo4j-backup \ No newline at end of file diff --git a/lp_redis_provision.yml b/lp_redis_provision.yml new file mode 100644 index 0000000..16f1cde --- /dev/null +++ b/lp_redis_provision.yml @@ -0,0 +1,5 @@ +- hosts: redisall + roles: + - redis + serial: 1 + \ No newline at end of file diff --git a/lp_samza_deploy.yml b/lp_samza_deploy.yml new file mode 100644 index 0000000..2e42be3 --- /dev/null +++ b/lp_samza_deploy.yml @@ -0,0 +1,31 @@ +--- +- name: "Start Nodemanager on Slaves" + hosts: "yarn-slave" + become: yes + tasks: + - name: Ensure yarn nodemanager is running + become_user: hduser + shell: | + (ps aux | grep yarn-hduser-nodemanager | grep -v grep) || /usr/local/hadoop/sbin/yarn-daemon.sh --config /usr/local/hadoop-{{hadoop_version}}/conf/ start nodemanager || sleep 10 + + - name: Install mysql client + apt: name=mysql-client state=present + + - name: install imagemagick + apt: name=imagemagick state=present update_cache=yes + +- name: "Copy Samza jobs additional configuration to slaves" + become: yes + hosts: "yarn-slave" + roles: + - samza-jobs-additional-config + +- name: "Deploy Samza jobs" + hosts: "yarn-master" + become: yes + vars_files: + - "{{ secrets_path }}" + vars: + deploy_jobs: true + roles: + - samza-jobs diff --git a/lp_samza_telemetry_schemas.yml b/lp_samza_telemetry_schemas.yml new file mode 100644 index 0000000..d630e4f --- /dev/null +++ b/lp_samza_telemetry_schemas.yml @@ -0,0 +1,26 @@ +--- +- name: "Copy validation schema files to Yarn Slaves" + hosts: "yarn-slave" + become: yes + tasks: + - name: cloning the telemetry schema repo + git: + repo: "{{schema_repo_url}}" + dest: "{{telemetry_schema_directory}}" + version: "{{version}}" + force: yes + - name: Create schema directory + file: path={{telemetry_schema_directory}} owner=hduser group=hadoop recurse=yes state=directory + + - name: get schema dir names + raw: find {{telemetry_schema_path}} -type f -name "*.*" + register: schemas + + - name: change internal schema file reference + replace: + dest: "{{item}}" + regexp: "http://localhost:7070/schemas/" + replace: "file://{{telemetry_schema_path}}/" + owner: hduser + group: hadoop + with_items: "{{ schemas.stdout_lines }}" diff --git a/lp_search_deploy.yml b/lp_search_deploy.yml new file mode 100644 index 0000000..66fc4ff --- /dev/null +++ b/lp_search_deploy.yml @@ -0,0 +1,4 @@ +- hosts: searchall + roles: + - search-service-deploy + serial: 1 diff --git a/lp_search_provision.yml b/lp_search_provision.yml new file mode 100644 index 0000000..c1f1fda --- /dev/null +++ b/lp_search_provision.yml @@ -0,0 +1,26 @@ +- hosts: searchall + pre_tasks: + - name: Create learner group + become: yes + group: + state: present + name: "{{ learner_group }}" + system: yes + - name: Create learner user + become: yes + user: + state: present + name: "{{ learner_user }}" + comment: learner user + system: yes + createhome: yes + group: "{{ learner_group }}" + - name: create folder data for learning + become: yes + file: path={{ item }} state=directory mode=0755 owner={{learner_user}} group={{learner_group}} + with_items: "{{ searchs.paths }}" + roles: + - java + - logstash + - search-service + serial: 1 diff --git a/lp_start_neo4j.yml b/lp_start_neo4j.yml new file mode 100644 index 0000000..8331f3b --- /dev/null +++ b/lp_start_neo4j.yml @@ -0,0 +1,15 @@ +- hosts: learning-neo4j-cluster + tasks: + - name: Check if neo4j is running + become_user: "{{ learner_user }}" + shell: ps -ef | grep "{{ neo4j_home }}" | grep -v grep | wc -l + register: neo4j_process + + - name: Start neo4j + become: yes + become_user: "{{ learner_user }}" + shell: bin/neo4j start + args: + chdir: "{{ neo4j_home }}" + when: "neo4j_process.stdout == '0'" + serial: 1 \ No newline at end of file diff --git a/lp_stop_neo4j.yml b/lp_stop_neo4j.yml new file mode 100644 index 0000000..2bea98a --- /dev/null +++ b/lp_stop_neo4j.yml @@ -0,0 +1,15 @@ +- hosts: learning-neo4j-cluster + tasks: + - name: Check if neo4j is running + become_user: "{{ learner_user }}" + shell: ps -ef | grep "{{ neo4j_home }}" | grep -v grep | wc -l + register: neo4j_process + + - name: stop the neo4j + become: yes + become_user: "{{ learner_user }}" + shell: bin/neo4j stop + args: + chdir: "{{ neo4j_home }}" + when: "neo4j_process.stdout != '0'" + serial: 1 \ No newline at end of file diff --git a/lp_synctool_deploy.yml b/lp_synctool_deploy.yml new file mode 100644 index 0000000..a313e87 --- /dev/null +++ b/lp_synctool_deploy.yml @@ -0,0 +1,5 @@ +- hosts: learning1 + vars_files: + - "{{ secrets_path }}" + roles: + - lp-synctool-deploy \ No newline at end of file diff --git a/lp_yarn_provision.yml b/lp_yarn_provision.yml new file mode 100644 index 0000000..ce5e19f --- /dev/null +++ b/lp_yarn_provision.yml @@ -0,0 +1,36 @@ +--- +- hosts: yarn + become: yes + vars_files: + - "{{ secrets_path }}" + tasks: + - name: Create group + group: + name: hadoop + state: present + - name: Create user + user: + name: hduser + comment: "hduser" + group: hadoop + groups: sudo + shell: /bin/bash + +- name: Install samza job server + hosts: "yarn-master" + become: yes + vars_files: + - "{{ secrets_path }}" + roles: + - java + - yarn + - samza-job-server + +- name: Install java on all yarn slaves + hosts: "yarn-slave" + become: yes + vars_files: + - "{{ secrets_path }}" + remote_user: hduser + roles: + - java diff --git a/lp_zookeeper_provision.yml b/lp_zookeeper_provision.yml new file mode 100644 index 0000000..cb6397e --- /dev/null +++ b/lp_zookeeper_provision.yml @@ -0,0 +1,30 @@ +--- +- hosts: zookeeper + pre_tasks: + - name: Create ecosytem group + become: yes + group: + state: present + name: "{{ ecosystem_group }}" + system: yes + - name: Create ecosystem user + become: yes + user: + state: present + name: "{{ ecosystem_user }}" + comment: ecosystem user + system: yes + createhome: yes + group: "{{ ecosystem_group }}" + - service: name=monit state=stopped + become: yes + ignore_errors: true + remote_user: "{{ ecosystem_user }}" + become: yes + roles: + - java + - zookeeper-upgrade + post_tasks: + - service: name=monit state=started + become: yes + ignore_errors: true diff --git a/resources/copy_azure.sh b/resources/copy_azure.sh new file mode 100644 index 0000000..7a71845 --- /dev/null +++ b/resources/copy_azure.sh @@ -0,0 +1,25 @@ +#!/bin/bash +#set -x + +##Variables## +NOW=$(date +"%F-%T") +LOG_PATH=logs/userlogs/$4 +CONTAINER_NAME=$1 +ACCOUNT_NAME=$2 +ACCOUNT_KEY=$3 +application_id=$4 +IP=$(hostname -i) + +if [ -d $LOG_PATH ] ; then + zip -r $IP-$NOW.zip $LOG_PATH + az storage blob upload -c $CONTAINER_NAME -n $IP-$NOW.zip -f $IP-$NOW.zip --account-name $ACCOUNT_NAME --account-key $ACCOUNT_KEY + status=$? + if [ $status != 0 ] ; then + echo "something went wrong: $status - push failed" + exit 1 + fi + rm $IP-$NOW.zip +else + echo "$LOG_PATH is not exist" + exit 1 +fi diff --git a/resources/upload_samza_logs b/resources/upload_samza_logs new file mode 100644 index 0000000..343dc1c --- /dev/null +++ b/resources/upload_samza_logs @@ -0,0 +1,24 @@ +#!/bin/bash +#set -x + +##Variables## +NOW=$(date +"%F-%T") +LOG_PATH=logs/userlogs +CONTAINER_NAME=$1 +ACCOUNT_NAME=$2 +ACCOUNT_KEY=$3 +IP=$(hostname -i) + +if [ -d $LOG_PATH ] ; then + zip -r $IP-$NOW.zip $LOG_PATH + az storage blob upload -c $CONTAINER_NAME -n $IP-$NOW.zip -f $IP-$NOW.zip --account-name $ACCOUNT_NAME --account-key $ACCOUNT_KEY + status=$? + if [ $status != 0 ] ; then + echo "something went wrong: $status - push failed" + exit 1 + fi + rm $IP-$NOW.zip +else + echo "$LOG_PATH is not exist" + exit 1 +fi diff --git a/roles/add_user/tasks/main.yml b/roles/add_user/tasks/main.yml new file mode 100644 index 0000000..72d661b --- /dev/null +++ b/roles/add_user/tasks/main.yml @@ -0,0 +1,15 @@ +- name: Add group + group: name="{{ ssh_user }}" state=present + become: yes + +- name: Create user + become: yes + user: state=present name="{{ ssh_user }}" group="{{ group }}" groups=sudo shell=/bin/bash createhome=yes password="{{ password }}" update_password=always + +- name: Add ssh public key + authorized_key: user="{{ ssh_user }}" key="{{ public_key }}" + become: yes + +- name: change permission + become: yes + command: chown -R "{{ ssh_user }}":"{{ ssh_user }}" /home/"{{ ssh_user }}" \ No newline at end of file diff --git a/roles/ansible-kafka-upgrade/README.md b/roles/ansible-kafka-upgrade/README.md new file mode 100644 index 0000000..993f6bc --- /dev/null +++ b/roles/ansible-kafka-upgrade/README.md @@ -0,0 +1,20 @@ +#Kafka +Installs [kafka](https://kafka.apache.org/) + +##Requirements +- kafka_hosts - comma separated list of host:port pairs in the cluster, defaults to 'ansible_fqdn:9092' for a single node +- zookeeper_hosts - comma separated list of host:port pairs. + +##Optional +- kafka_listen_address - defines a specifc address for kafka to listen on, by defaults listens on all interfaces +- kafka_id - Id to be used if one can't or shouldn't be derived from kafka_hosts. This will happen if kafka_hosts doesn't contain the fqdn but an alias +- monasca_log_level - Log level to be used for Kafka logs. Defaults to WARN +- run_mode - One of Deploy, Stop, Install, Start, or Use. The default is Deploy which will do Install, Configure, then Start. + +##License +Apache + +##Author Information +Tim Kuhlman + +Monasca Team email monasca@lists.launchpad.net diff --git a/roles/ansible-kafka-upgrade/defaults/main.yml b/roles/ansible-kafka-upgrade/defaults/main.yml new file mode 100644 index 0000000..bfbe5b6 --- /dev/null +++ b/roles/ansible-kafka-upgrade/defaults/main.yml @@ -0,0 +1,53 @@ +--- +apache_mirror: http://apache.mirrors.tds.net +apache_mirror_archive: https://archive.apache.org/dist +kafka_hosts: "{{ groups['processing-cluster-kafka']|join(':9092,')}}:9092" +kafka_version: 1.1.0 +kafka_version_old: 0.10.0.1 +kafka_scala_version: 2.12 +run_mode: Deploy +skip_install: False + +kafka_group: kafka +kafka_user: kafka + +kafka_num_network_threads: 2 +kafka_num_io_threads: 2 +kafka_num_partitions: 1 +kafka_port: 9092 +zookeeper_port: 2181 +kafka_socket_send_buffer_bytes: 1048576 +kafka_socket_receive_buffer_bytes: 1048576 +kafka_socket_request_max_bytes: 104857600 +kafka_log_flush_interval_messages: 10000 +kafka_log_flush_interval_ms: 1000 +kafka_log_retention_bytes: 104857600 #100 M +kafka_log_retention_hours: 2400 +kafka_log_segment_bytes: "{{kafka_log_retention_bytes}}" +kafka_log_cleanup_interval_mins: 1 +kafka_jvm_opts: "-Xmx1G -Xms1G" +kafka_heap_opts: "{{kafka_jvm_opts}}" +kafka_tarball_location: /root +kafka_tarball_name: "kafka_{{kafka_scala_version}}-{{kafka_version}}.tgz" +zookeeper_connection_timeout_ms: 1000000 +zk_port: 2181 + +num_replica_fetchers: 1 + +verify: True + +jmx_agent_dir: /opt/jolokia-jvm-agent +jmx_agent_download_url: https://search.maven.org/remotecontent?filepath=org/jolokia/jolokia-jvm/1.3.4/jolokia-jvm-1.3.4-agent.jar +jmx_agent_file: jolokia-jvm-1.3.4-agent.jar +kafka_jmx_port: 8778 +kafka_opts: "-javaagent:{{jmx_agent_dir}}/{{jmx_agent_file}}=port={{kafka_jmx_port}},host=0.0.0.0" + +kafka_upstart_conf: /etc/init/kafka.conf +kafka_conf_dir: /etc/kafka +kafka_data_dir: /var/kafka +kafka_log_dir: /var/log/kafka +monasca_log_level: INFO +user: ecosystem +kafka_systemd_service: /etc/systemd/system/kafka.service +kafka_auto_create_topics: "false" +delete_topic_enable: "true" diff --git a/roles/ansible-kafka-upgrade/files/truncate_logs.sh b/roles/ansible-kafka-upgrade/files/truncate_logs.sh new file mode 100644 index 0000000..0d43006 --- /dev/null +++ b/roles/ansible-kafka-upgrade/files/truncate_logs.sh @@ -0,0 +1,7 @@ +# Truncate zookeeper logs +ZOOKEEPER_VERSION_2=/var/log/zookeeper/version-2/log.* + +for f in $ZOOKEEPER_VERSION_2 +do + tail -n 100 $f > $f.tmp && cat $f.tmp > $f && rm $f.tmp +done \ No newline at end of file diff --git a/roles/ansible-kafka-upgrade/handlers/main.yml b/roles/ansible-kafka-upgrade/handlers/main.yml new file mode 100644 index 0000000..bde17bb --- /dev/null +++ b/roles/ansible-kafka-upgrade/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart kafka + service: name=kafka state=restarted enabled=yes + when: run_mode == 'Deploy' + become: yes diff --git a/roles/ansible-kafka-upgrade/meta/main.yml b/roles/ansible-kafka-upgrade/meta/main.yml new file mode 100644 index 0000000..bfc8671 --- /dev/null +++ b/roles/ansible-kafka-upgrade/meta/main.yml @@ -0,0 +1,18 @@ +--- +galaxy_info: + author: Tim Kuhlman + description: Installs kafka + company: HP + license: Apache + min_ansible_version: 1.7 + platforms: + - name: Ubuntu + versions: + - trusty + - name: Debian + versions: + - jessie + categories: + - clustering + - system +dependencies: [] diff --git a/roles/ansible-kafka-upgrade/tasks/configure.yml b/roles/ansible-kafka-upgrade/tasks/configure.yml new file mode 100644 index 0000000..a2f0366 --- /dev/null +++ b/roles/ansible-kafka-upgrade/tasks/configure.yml @@ -0,0 +1,75 @@ +--- + +- name: Link /opt/kafka to the right version + file: path=/opt/kafka state=link src=/opt/kafka_{{kafka_scala_version}}-{{kafka_version}} owner={{kafka_user}} group={{kafka_group}} + +- name: Overwrite the start script so the Java Opts can be changed if Kafka 0.10.0.1 + lineinfile: dest=/opt/kafka_{{kafka_scala_version}}-{{kafka_version}}/bin/kafka-server-start.sh regexp="^export KAFKA_HEAP_OPTS=" line="export KAFKA_HEAP_OPTS=\"{{ kafka_heap_opts }}\"" + notify: + - restart kafka + when: kafka_version == "{{kafka_version}}" + +- name: Insert KAFKA_OPTS to kafka-server-start.sh + lineinfile: dest=/opt/kafka_{{kafka_scala_version}}-{{kafka_version}}/bin/kafka-server-start.sh insertafter="^COMMAND=" line="export KAFKA_OPTS={{ kafka_opts }}" + notify: + - restart kafka + +- name: Detect if this is a systemd based system + command: cat /proc/1/comm + register: init +- set_fact: use_systemd=True + when: init.stdout == 'systemd' +- set_fact: use_systemd=False + when: init.stdout != 'systemd' + +- name: create upstart config + template: dest={{kafka_upstart_conf}} owner=root group=root mode=644 src=kafka.conf.j2 + notify: + - restart kafka + when: not use_systemd + +- name: create systemd config + template: dest={{kafka_systemd_service}} owner=root group=root mode=644 src=kafka.service.j2 + notify: + - restart kafka + when: use_systemd + +- command: systemctl daemon-reload + when: use_systemd + +- name: Create data_dir + file: path={{kafka_data_dir}} state=directory owner={{kafka_user}} group={{kafka_group}} mode=755 + +- name: Remove lost+found in the datadir + file: path="{{kafka_data_dir}}/lost+found" state=absent + +- name: Create log_dir + file: path={{kafka_log_dir}} state=directory owner={{kafka_user}} group={{kafka_group}} mode=755 + +- name: link conf_dir to /opt/kafka/config + file: path={{kafka_conf_dir}} state=link src=/opt/kafka/config + +# Setup log4j.properties +- name: create log4j.properties + template: dest="{{kafka_conf_dir}}/log4j.properties" owner={{kafka_user}} group={{kafka_group}} mode=644 src=log4j.properties.j2 + notify: + - restart kafka + +# Setup server.properties +- name: create server.properties + template: dest="{{kafka_conf_dir}}/server.properties" owner={{kafka_user}} group={{kafka_group}} mode=640 src=server.properties.j2 + notify: + - restart kafka + +- meta: flush_handlers + +- name: Create JMX agent directory + file: path={{jmx_agent_dir}} state=directory owner={{kafka_user}} group={{kafka_group}} mode=755 recurse=yes + +- name: Download JMX agent, for exposing monitoring metrics + get_url: + url: "{{jmx_agent_download_url}}" + dest: "{{jmx_agent_dir}}/{{jmx_agent_file}}" + owner: "{{kafka_user}}" + group: "{{kafka_group}}" + mode: 0440 diff --git a/roles/ansible-kafka-upgrade/tasks/main.yml b/roles/ansible-kafka-upgrade/tasks/main.yml new file mode 100644 index 0000000..955ba50 --- /dev/null +++ b/roles/ansible-kafka-upgrade/tasks/main.yml @@ -0,0 +1,26 @@ +--- +- include: stop.yml + when: run_mode == 'Stop' + +- name: setup group + group: name={{kafka_group}} system=yes + +- name: Setup user + user: name={{kafka_user}} system=yes group={{kafka_group}} + +- name: Install kafka + unarchive: + remote_src: yes + creates: "/opt/kafka_{{kafka_scala_version}}-{{kafka_version}}" + dest: /opt + src: "{{apache_mirror}}/kafka/{{kafka_version}}/{{kafka_tarball_name}}" + owner: "{{kafka_user}}" + group: "{{kafka_group}}" + when: not skip_install and ( run_mode == 'Install' or run_mode == 'Deploy' ) + become: yes + +- include: configure.yml + when: run_mode == 'Configure' or run_mode == 'Deploy' + +- include: start.yml + when: run_mode == 'Start' or run_mode == 'Deploy' diff --git a/roles/ansible-kafka-upgrade/tasks/start.yml b/roles/ansible-kafka-upgrade/tasks/start.yml new file mode 100644 index 0000000..814f45e --- /dev/null +++ b/roles/ansible-kafka-upgrade/tasks/start.yml @@ -0,0 +1,12 @@ +--- +- name: wait for zookeeper port + wait_for: host={{zookeeper_listen_address| default('localhost')}} port={{zookeeper_port}} state=started timeout=30 + when: verify + +- name: Enable and Start Kafka + service: name=kafka state=started enabled=yes + become: yes + +- name: wait for kafka port + wait_for: host={{kafka_listen_address| default('localhost')}} port={{kafka_port}} state=started timeout=30 + when: verify diff --git a/roles/ansible-kafka-upgrade/tasks/stop.yml b/roles/ansible-kafka-upgrade/tasks/stop.yml new file mode 100644 index 0000000..9c20ca1 --- /dev/null +++ b/roles/ansible-kafka-upgrade/tasks/stop.yml @@ -0,0 +1,4 @@ +--- +- name: Stop Kafka + service: name=kafka state=stopped + become: yes diff --git a/roles/ansible-kafka-upgrade/templates/kafka.conf.j2 b/roles/ansible-kafka-upgrade/templates/kafka.conf.j2 new file mode 100644 index 0000000..38fe93e --- /dev/null +++ b/roles/ansible-kafka-upgrade/templates/kafka.conf.j2 @@ -0,0 +1,11 @@ +description "Kafka" + +start on runlevel [2345] +stop on runlevel [!2345] + +respawn + +limit nofile 32768 32768 + +# Rather than using setuid/setgid sudo is used because the pre-start task must run as root +exec sudo -Hu kafka -g kafka KAFKA_HEAP_OPTS="{{ kafka_heap_opts }}" /opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties \ No newline at end of file diff --git a/roles/ansible-kafka-upgrade/templates/kafka.service.j2 b/roles/ansible-kafka-upgrade/templates/kafka.service.j2 new file mode 100644 index 0000000..89f6117 --- /dev/null +++ b/roles/ansible-kafka-upgrade/templates/kafka.service.j2 @@ -0,0 +1,15 @@ +[Unit] +Description=Kafka Daemon +After=zookeeper.service + +[Service] +Type=simple +User=kafka +Group=kafka +LimitNOFILE=32768 +Restart=on-failure +Environment="KAFKA_HEAP_OPTS={{ kafka_heap_opts }}" +ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties + +[Install] +WantedBy=multi-user.target diff --git a/roles/ansible-kafka-upgrade/templates/log4j.properties.j2 b/roles/ansible-kafka-upgrade/templates/log4j.properties.j2 new file mode 100644 index 0000000..d8cb381 --- /dev/null +++ b/roles/ansible-kafka-upgrade/templates/log4j.properties.j2 @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +log4j.rootLogger={{ monasca_log_level }}, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=[%d] %p %m (%c)%n + +log4j.appender.kafkaAppender=org.apache.log4j.RollingFileAppender +log4j.appender.kafkaAppender.MaxFileSize=50MB +log4j.appender.kafkaAppender.MaxBackupIndex=4 +log4j.appender.kafkaAppender.File={{kafka_log_dir}}/server.log +log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n + +log4j.appender.stateChangeAppender=org.apache.log4j.RollingFileAppender +log4j.appender.stateChangeAppender.MaxFileSize=50MB +log4j.appender.stateChangeAppender.MaxBackupIndex=4 +log4j.appender.stateChangeAppender.File={{kafka_log_dir}}/state-change.log +log4j.appender.stateChangeAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.stateChangeAppender.layout.ConversionPattern=[%d] %p %m (%c)%n + +log4j.appender.controllerAppender=org.apache.log4j.RollingFileAppender +log4j.appender.controllerAppender.MaxFileSize=50MB +log4j.appender.controllerAppender.MaxBackupIndex=4 +log4j.appender.controllerAppender.File={{kafka_log_dir}}/controller.log +log4j.appender.controllerAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.controllerAppender.layout.ConversionPattern=[%d] %p %m (%c)%n + +# Turn on all our debugging info +#log4j.logger.kafka.producer.async.DefaultEventHandler=DEBUG, kafkaAppender +#log4j.logger.kafka.client.ClientUtils=DEBUG, kafkaAppender +#log4j.logger.kafka.perf=DEBUG, kafkaAppender +#log4j.logger.kafka.perf.ProducerPerformance$ProducerThread=DEBUG, kafkaAppender +#log4j.logger.org.I0Itec.zkclient.ZkClient=DEBUG +log4j.logger.kafka={{ monasca_log_level }}, kafkaAppender + +# Tracing requests results in large logs +#log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender +#log4j.appender.requestAppender.MaxFileSize=50MB +#log4j.appender.requestAppender.MaxBackupIndex=4 +#log4j.appender.requestAppender.File={{kafka_log_dir}}/kafka-request.log +#log4j.appender.requestAppender.layout=org.apache.log4j.PatternLayout +#log4j.appender.requestAppender.layout.ConversionPattern=[%d] %p %m (%c)%n +# +#log4j.logger.kafka.network.RequestChannel$=TRACE, requestAppender +#log4j.additivity.kafka.network.RequestChannel$=false +# +#log4j.logger.kafka.network.Processor=TRACE, requestAppender +#log4j.logger.kafka.server.KafkaApis=TRACE, requestAppender +#log4j.additivity.kafka.server.KafkaApis=false +#log4j.logger.kafka.request.logger=TRACE, requestAppender +#log4j.additivity.kafka.request.logger=false + +log4j.logger.kafka.controller={{ monasca_log_level }}, controllerAppender +log4j.additivity.kafka.controller=false + +log4j.logger.state.change.logger={{ monasca_log_level }}, stateChangeAppender +log4j.additivity.state.change.logger=false + diff --git a/roles/ansible-kafka-upgrade/templates/server.properties.j2 b/roles/ansible-kafka-upgrade/templates/server.properties.j2 new file mode 100644 index 0000000..4ead0b2 --- /dev/null +++ b/roles/ansible-kafka-upgrade/templates/server.properties.j2 @@ -0,0 +1,122 @@ +############################# Server Basics ############################# + +# The id of the broker. This must be set to a unique integer for each broker. +{% for url in kafka_hosts.split(',') %} + {%- set url_host = url.split(':')[0] -%} + {%- if url_host == ansible_fqdn or url_host in ansible_all_ipv4_addresses -%} +broker.id={{loop.index0 + 1}} + +############################# Socket Server Settings ############################# + +# The port the socket server listens on +port={{url.split(':')[1]}} + {% endif %} +{% endfor %} + +# Hostname the broker will bind to. If not set, the server will bind to all interfaces +{% if kafka_listen_address is defined %} +host.name={{kafka_listen_address}} +{% else %} +#host.name=localhost +{% endif %} + +# Hostname the broker will advertise to producers and consumers. If not set, it uses the +# value for "host.name" if configured. Otherwise, it will use the value returned from +# java.net.InetAddress.getCanonicalHostName(). +#advertised.host.name= + +# The port to publish to ZooKeeper for clients to use. If this is not set, +# it will publish the same port that the broker binds to. +#advertised.port= + +# The number of threads handling network requests +num.network.threads={{kafka_num_network_threads}} + +# The number of threads doing disk I/O +num.io.threads={{kafka_num_io_threads}} + +# The send buffer (SO_SNDBUF) used by the socket server +socket.send.buffer.bytes={{kafka_socket_send_buffer_bytes}} + +# The receive buffer (SO_RCVBUF) used by the socket server +socket.receive.buffer.bytes={{kafka_socket_receive_buffer_bytes}} + +# The maximum size of a request that the socket server will accept (protection against OOM) +socket.request.max.bytes={{kafka_socket_request_max_bytes}} + + +############################# Log Basics ############################# + +# A comma seperated list of directories under which to store log files +log.dirs={{kafka_data_dir}} + +auto.create.topics.enable={{kafka_auto_create_topics}} +# The number of logical partitions per topic per server. More partitions allow greater parallelism +# for consumption, but also mean more files. +num.partitions={{kafka_num_partitions}} + +delete.topic.enable={{delete_topic_enable}} + +# Number of threads used to replicate messages from leaders. Increasing this +# value can increase the degree of I/O parallelism in the follower broker. +# This is useful to temporarily increase if you have a broker that needs +# to catch up on messages to get back into the ISR. +num.replica.fetchers={{num_replica_fetchers}} + +############################# Log Flush Policy ############################# + +# Messages are immediately written to the filesystem but by default we only fsync() to sync +# the OS cache lazily. The following configurations control the flush of data to disk. +# There are a few important trade-offs here: +# 1. Durability: Unflushed data may be lost if you are not using replication. +# 2. Latency: Very large flush intervals may lead to latency spikes when the flush does occur as there will be a lot of data to flush. +# 3. Throughput: The flush is generally the most expensive operation, and a small flush interval may lead to exceessive seeks. +# The settings below allow one to configure the flush policy to flush data after a period of time or +# every N messages (or both). This can be done globally and overridden on a per-topic basis. + +# The number of messages to accept before forcing a flush of data to disk +log.flush.interval.messages={{kafka_log_flush_interval_messages}} + +# The maximum amount of time a message can sit in a log before we force a flush +log.flush.interval.ms={{kafka_log_flush_interval_ms}} + +############################# Log Retention Policy ############################# + +# The following configurations control the disposal of log segments. The policy can +# be set to delete segments after a period of time, or after a given size has accumulated. +# A segment will be deleted whenever *either* of these criteria are met. Deletion always happens +# from the end of the log. + +# The minimum age of a log file to be eligible for deletion +log.retention.hours={{kafka_log_retention_hours}} + +# A size-based retention policy for logs. Segments are pruned from the log as long as the remaining +# segments don't drop below log.retention.bytes. +# log.retention.bytes={{kafka_log_retention_bytes}} + +# The maximum size of a log segment file. When this size is reached a new log segment will be created. +log.segment.bytes={{kafka_log_segment_bytes}} + +# The interval at which log segments are checked to see if they can be deleted according +# to the retention policies +log.retention.check.interval.ms=60000 + +# By default the log cleaner is disabled and the log retention policy will default to just delete segments after their retention expires. +# If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction. +log.cleaner.enable=false + +############################# Zookeeper ############################# + +# Zookeeper connection string (see zookeeper docs for details). +# This is a comma separated host:port pairs, each corresponding to a zk +# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002". +# You can also append an optional chroot string to the urls to specify the +# root directory for all kafka znodes. +zookeeper.connect={% for host in groups['zookeeper'] %}{{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}:{{zk_port}}{% if not loop.last %},{% endif %}{% endfor %} + +# Timeout in ms for connecting to zookeeper +zookeeper.connection.timeout.ms={{zookeeper_connection_timeout_ms}} + + +inter.broker.protocol.version={{kafka_version_old}} +log.message.format.version={{kafka_version_old}} diff --git a/roles/ansible-kafka-upgrade/vars/main.yml b/roles/ansible-kafka-upgrade/vars/main.yml new file mode 100644 index 0000000..cd21505 --- /dev/null +++ b/roles/ansible-kafka-upgrade/vars/main.yml @@ -0,0 +1,2 @@ +--- + diff --git a/roles/azure-cli/tasks/main.yml b/roles/azure-cli/tasks/main.yml new file mode 100644 index 0000000..24c64bf --- /dev/null +++ b/roles/azure-cli/tasks/main.yml @@ -0,0 +1,9 @@ +- name: Add Azure apt repository + apt_repository: repo='deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ xenial main' state=present + +- name: Import Azure signing key + become: yes + shell: curl -L https://packages.microsoft.com/keys/microsoft.asc | apt-key add - + +- name: ensure azure-cli and apt-transport-https is installed + shell: apt update && apt install -y apt-transport-https azure-cli diff --git a/roles/cassandra-3.7.0/defaults/main.yml b/roles/cassandra-3.7.0/defaults/main.yml new file mode 100644 index 0000000..7c4ee20 --- /dev/null +++ b/roles/cassandra-3.7.0/defaults/main.yml @@ -0,0 +1,15 @@ +cassandra_repo: "deb http://debian.datastax.com/datastax-ddc 3.7 main" +data_file_directories: /data/cassandra/data +commitlog_directory: /data/cassandra/commitlog +saved_caches_directory: /data/cassandra/saved_caches +seeds: "{{ inventory_hostname }}" +listen_address: "{{ inventory_hostname }}" +broadcast_rpc_address: "{{ inventory_hostname }}" +paths: ['/data/cassandra', '/data/cassandra/commitlog', '/data/cassandra/data', '/data/cassandra/saved_caches', '/data/cassandra/logs'] +cassandra_user: cassandra +cassandra_lib: "/usr/share/cassandra/lib/" +cassandra_lib_src: "templates/cassandra-lib.tgz" +cassandra_conf: "/etc/cassandra/" +cassandra_env_file: "/etc/cassandra/cassandra-env.sh" +keyspace_prefix: '{{ env }}_' +replication_factor: 1 diff --git a/roles/cassandra-3.7.0/handlers/main.yml b/roles/cassandra-3.7.0/handlers/main.yml new file mode 100644 index 0000000..98b43bb --- /dev/null +++ b/roles/cassandra-3.7.0/handlers/main.yml @@ -0,0 +1,5 @@ +# handlers file for ansible-cassandra +- name: restart cassandra + systemd: + name: cassandra + state: restarted \ No newline at end of file diff --git a/roles/cassandra-3.7.0/tasks/main.yml b/roles/cassandra-3.7.0/tasks/main.yml new file mode 100644 index 0000000..c18140d --- /dev/null +++ b/roles/cassandra-3.7.0/tasks/main.yml @@ -0,0 +1,85 @@ +## Cassandra Provisioning ## +- name: Cassandra | Make sure the ansible required dependencies are installed + become: yes + apt: pkg={{ item }} state=present + with_items: + - python-pycurl + - python-pip + +- name: install cassandra driver + become: yes + pip: name=cassandra-driver state=present + +- name: export cqlsh variable + become: yes + lineinfile: + dest: /etc/bash.bashrc + line: 'export CQLSH_NO_BUNDLED=TRUE' + state: present + create: yes + +- name: Cassandra | Add the datastax repository apt-key + become: yes + apt_key: + url: "http://debian.datastax.com/debian/repo_key" + state: present + +- name: Cassandra | Add the cassandra 3.7 repository + become: yes + apt_repository: + repo: "{{ cassandra_repo }}" + state: present + +- name: Cassandra | Install the cassandra package + become: yes + apt: + name: cassandra + state: present + update_cache: yes + +- name: Cassandra | Update the cassandra configuration + become: yes + template: + src: "cassandra.j2" + dest: "/etc/cassandra/cassandra.yaml" + mode: 0644 + +- name: Cassandra | Update the cassandra rackdc configuration + become: yes + template: + src: "cassandra-rackdc.properties.j2" + dest: "/etc/cassandra/cassandra-rackdc.properties" + mode: 0644 + +- name: Cassandra | Create directories for cassandra + become: yes + file: path={{ item }} owner={{ cassandra_user }} group={{ cassandra_user }} state=directory + with_items: "{{ paths }}" + + +- name: Clear cassandra libraries + file: path={{ item }} state=absent + become: yes + with_fileglob: + - "{{ cassandra_lib }}/metrics-core-*.jar" + - "{{ cassandra_lib }}/reporter-config-base-*.jar" + - "{{ cassandra_lib }}/reporter-config3-*.jar" + +- name: Unarchive the files + unarchive: + src: "{{ cassandra_lib_src }}" + dest: "{{ cassandra_lib }}" + become: yes + +- name: Add JAVA_OPTS + lineinfile: dest="{{ cassandra_env_file }}" line='JVM_OPTS="$JVM_OPTS -Dcassandra.metricsReporterConfigFile=graphite.yaml"' + become: yes + +- name: restart cassandra + systemd: + name: cassandra + state: restarted + +#- name: Cassandra | Restart cassandra +# become: yes +# meta: flush_handlers diff --git a/roles/cassandra-3.7.0/templates/cassandra-lib.tgz b/roles/cassandra-3.7.0/templates/cassandra-lib.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2dcfaed2188c8a5978392bf6ef470fbf0deb5c54 GIT binary patch literal 616042 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�*%`I9;2T{;|LC+qn*c( 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�laXL2W0tu?jY!S2zqoj*`bJJhGUWn1=*1*FyjyA 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

$ko-aHV*WS!*8&_@i!L%V=8`6~ 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%0Dv>W|BI!Uu)V9D%l~8Pb!~slhV+-$A9M;- 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

e}@ZgdOgrQVwnsU)XY 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 cUBhi$YFA%W8Ec~p&Yf0pSV75cYq z45u_!lX&wBliB58DY-O@bjR#xU$9XyD$E(nkw!Q`SMtPi^5)Re2acc}zSfV3z(<3& zk!iQl%{?@9P;IDqN5U2xVKtJb6e2!>=PE~!bW9ya-HxRdLDIiDo!7X~3xm~i{4KR7 z?FhjVjeS;0iD%fu1c)p7vGu+qI=F9PG-J%ivBIQ*PP}2T0zPai#P%2cYc}}6+mtHb zrT-S&NGk``lF_1qxJrF3!a9Yi@+a_7ptpy9>`&muQ$y^TwsWZ9!mWq)fsG|eo$qmg z&0brmpU59)j+9M|7KgP?8asDjBr`x)jXh$;{B)b;6jVo&K1ayN1XxSp8sLp4NMn|= zD$2n86dVeKI0%#@eDMykv16kOM^1^6A(B-_wc?L%y;Z3BQ+O-1$!dgl#qKq-At8x8 z7ie?@DDJ>LbSKd4b1M{4Udl>i?`?fzIDbvztt32@=2xR(_VV}Y&mN>bx^~`I-mRzc zyPuB^&sS07A)%{Q2>J$VTwXTK**a^aRE)4d468$TG|xA!ryyAotu)A_Cw!v(S+ zwx>u%G!R6*+074JwprC%1{;=6C*^S72pj~fQ--lAfeXJn5W4@Yipe8;w30{>%U=*j zuV=Z^!RK|8rrzx+Viv>iuQwXzEU#BW3Wi=IwE_h%|57Zw#$1D40FW|Za|9kCEehQO z*okuDLFXRomi`i8kn|7IEKD6yOEil=1rfK8jr1{K*e=d8fbwqb;wNxW9Vt^X`i21J z2pvm1_NUocc55sON%S)yf9

    K3RkLL9y|3}9#X-ntjcsoh;DYoWL{C^zIp!7i!g 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 +# +# chkconfig: 2345 80 20 +# description: Starts and stops a single elasticsearch instance on this system +# + +### BEGIN INIT INFO +# Provides: Elasticsearch +# Required-Start: $network $named +# Required-Stop: $network $named +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: This service manages the elasticsearch daemon +# Description: Elasticsearch is a very scalable, schema-free and high-performance search solution supporting multi-tenancy and near realtime search. +### END INIT INFO + +# +# init.d / servicectl compatibility (openSUSE) +# +if [ -f /etc/rc.status ]; then + . /etc/rc.status + rc_reset +fi + +# +# Source function library. +# +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions +fi + +# Sets the default values for elasticsearch variables used in this script +ES_USER="{{es_user}}" +ES_GROUP="{{es_group}}" +ES_HOME="{{es_home}}" +{% if es_max_open_files is defined %} +MAX_OPEN_FILES={{es_max_open_files}} +{% endif %} +# Maximum number of VMA (Virtual Memory Areas) a process can own +{% if es_max_map_count is defined %} +MAX_MAP_COUNT={{es_max_map_count}} +{% endif %} + +LOG_DIR="{{log_dir}}" +DATA_DIR={{ data_dirs | array_to_str }} +CONF_DIR="{{conf_dir}}" +ES_PATH_CONF="{{ conf_dir }}" + +PID_DIR="{{pid_dir}}" + +# Source the default env file +ES_ENV_FILE="{{instance_default_file}}" +if [ -f "$ES_ENV_FILE" ]; then + . "$ES_ENV_FILE" +fi + +if [ "$ES_USER" != "elasticsearch" ] || [ "$ES_GROUP" != "elasticsearch" ]; then + echo "WARNING: ES_USER and ES_GROUP are deprecated and will be removed in the next major version of Elasticsearch, got: [$ES_USER:$ES_GROUP]" +fi + +# CONF_FILE setting was removed +if [ ! -z "$CONF_FILE" ]; then + echo "CONF_FILE setting is no longer supported. elasticsearch.yml must be placed in the config directory and cannot be renamed." + exit 1 +fi + +exec="$ES_HOME/bin/elasticsearch" +prog="{{es_instance_name}}_{{default_file | basename}}" +pidfile="$PID_DIR/${prog}.pid" + +export ES_JAVA_OPTS +export JAVA_HOME +export ES_INCLUDE +export ES_JVM_OPTIONS +export ES_STARTUP_SLEEP_TIME +export ES_PATH_CONF + +# export unsupported variables so bin/elasticsearch can reject them and inform the user these are unsupported +if test -n "$ES_MIN_MEM"; then export ES_MIN_MEM; fi +if test -n "$ES_MAX_MEM"; then export ES_MAX_MEM; fi +if test -n "$ES_HEAP_SIZE"; then export ES_HEAP_SIZE; fi +if test -n "$ES_HEAP_NEWSIZE"; then export ES_HEAP_NEWSIZE; fi +if test -n "$ES_DIRECT_SIZE"; then export ES_DIRECT_SIZE; fi +if test -n "$ES_USE_IPV4"; then export ES_USE_IPV4; fi +if test -n "$ES_GC_OPTS"; then export ES_GC_OPTS; fi +if test -n "$ES_GC_LOG_FILE"; then export ES_GC_LOG_FILE; fi + +lockfile=/var/lock/subsys/$prog + +# backwards compatibility for old config sysconfig files, pre 0.90.1 +if [ -n $USER ] && [ -z $ES_USER ] ; then + ES_USER=$USER +fi + +if [ ! -x "$exec" ]; then + echo "The elasticsearch startup script does not exists or it is not executable, tried: $exec" + exit 1 +fi + +checkJava() { + if [ -x "$JAVA_HOME/bin/java" ]; then + JAVA="$JAVA_HOME/bin/java" + else + JAVA=`which java` + fi + + if [ ! -x "$JAVA" ]; then + echo "Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME" + exit 1 + fi +} + +start() { + checkJava + [ -x $exec ] || exit 5 + + if [ -n "$MAX_OPEN_FILES" ]; then + ulimit -n $MAX_OPEN_FILES + fi + if [ -n "$MAX_LOCKED_MEMORY" ]; then + ulimit -l $MAX_LOCKED_MEMORY + fi + if [ -n "$MAX_THREADS" ]; then + ulimit -u $MAX_THREADS + fi + if [ -n "$MAX_MAP_COUNT" -a -f /proc/sys/vm/max_map_count ]; then + sysctl -q -w vm.max_map_count=$MAX_MAP_COUNT + fi + + # Ensure that the PID_DIR exists (it is cleaned at OS startup time) + if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then + mkdir -p "$PID_DIR" && chown "$ES_USER":"$ES_GROUP" "$PID_DIR" + fi + if [ -n "$pidfile" ] && [ ! -e "$pidfile" ]; then + touch "$pidfile" && chown "$ES_USER":"$ES_GROUP" "$pidfile" + fi + + cd $ES_HOME + echo -n $"Starting $prog: " + # if not running, start it up here, usually something like "daemon $exec" +{% if (es_version | version_compare('6.0.0', '<')) %} + daemon --user $ES_USER --pidfile $pidfile $exec -p $pidfile -d -Edefault.path.logs=$LOG_DIR -Edefault.path.data=$DATA_DIR -Edefault.path.conf=$CONF_DIR +{% else %} + daemon --user $ES_USER --pidfile $pidfile $exec -p $pidfile -d +{% endif %} + retval=$? + echo + [ $retval -eq 0 ] && touch $lockfile + return $retval +} + +stop() { + echo -n $"Stopping $prog: " + # stop it here, often "killproc $prog" + killproc -p $pidfile -d 86400 $prog + retval=$? + echo + [ $retval -eq 0 ] && rm -f $lockfile + return $retval +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status -p $pidfile $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + + +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac +exit $? diff --git a/roles/es6/templates/jvm.options.j2 b/roles/es6/templates/jvm.options.j2 new file mode 100644 index 0000000..ad30851 --- /dev/null +++ b/roles/es6/templates/jvm.options.j2 @@ -0,0 +1,118 @@ +## JVM configuration + +################################################################ +## IMPORTANT: JVM heap size +################################################################ +## +## You should always set the min and max JVM heap +## size to the same value. For example, to set +## the heap to 4 GB, set: +## +## -Xms4g +## -Xmx4g +## +## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html +## for more information +## +################################################################ + +# Xms represents the initial size of total heap space +# Xmx represents the maximum size of total heap space +{% if es_heap_size is defined %} +-Xms{{ es_heap_size }} +-Xmx{{ es_heap_size }} +{% else %} +-Xms2g +-Xmx2g +{% endif %} + +################################################################ +## Expert settings +################################################################ +## +## All settings below this section are considered +## expert settings. Don't tamper with them unless +## you understand what you are doing +## +################################################################ + +## GC configuration +-XX:+UseConcMarkSweepGC +-XX:CMSInitiatingOccupancyFraction=75 +-XX:+UseCMSInitiatingOccupancyOnly + +## optimizations + +# pre-touch memory pages used by the JVM during initialization +-XX:+AlwaysPreTouch + +## basic + +# force the server VM +-server + +# set to headless, just in case +-Djava.awt.headless=true + +# ensure UTF-8 encoding by default (e.g. filenames) +-Dfile.encoding=UTF-8 + +# use our provided JNA always versus the system one +-Djna.nosys=true + +# use old-style file permissions on JDK9 +-Djdk.io.permissionsUseCanonicalPath=true + +# flags to configure Netty +-Dio.netty.noUnsafe=true +-Dio.netty.noKeySetOptimization=true +-Dio.netty.recycler.maxCapacityPerThread=0 + +# log4j 2 +-Dlog4j.shutdownHookEnabled=false +-Dlog4j2.disable.jmx=true +-Dlog4j.skipJansi=true + +## heap dumps + +# generate a heap dump when an allocation from the Java heap fails +# heap dumps are created in the working directory of the JVM +-XX:+HeapDumpOnOutOfMemoryError + +# specify an alternative path for heap dumps +# ensure the directory exists and has sufficient space +#-XX:HeapDumpPath=${heap.dump.path} + +## GC logging + +#-XX:+PrintGCDetails +#-XX:+PrintGCTimeStamps +#-XX:+PrintGCDateStamps +#-XX:+PrintClassHistogram +#-XX:+PrintTenuringDistribution +#-XX:+PrintGCApplicationStoppedTime + +# log GC status to a file with time stamps +# ensure the directory exists +#-Xloggc:${loggc} + + +# By default, the GC log file will not rotate. +# By uncommenting the lines below, the GC log file +# will be rotated every 128MB at most 32 times. +#-XX:+UseGCLogFileRotation +#-XX:NumberOfGCLogFiles=32 +#-XX:GCLogFileSize=128M + +# Elasticsearch 5.0.0 will throw an exception on unquoted field names in JSON. +# If documents were already indexed with unquoted fields in a previous version +# of Elasticsearch, some operations may throw errors. +# +# WARNING: This option will be removed in Elasticsearch 6.0.0 and is provided +# only for migration purposes. +#-Delasticsearch.json.allow_unquoted_field_names=true +{% if es_jvm_custom_parameters !='' %} +{% for item in es_jvm_custom_parameters %} +{{ item }} +{% endfor %} +{% endif %} diff --git a/roles/es6/templates/log4j2.properties.j2 b/roles/es6/templates/log4j2.properties.j2 new file mode 100644 index 0000000..269be52 --- /dev/null +++ b/roles/es6/templates/log4j2.properties.j2 @@ -0,0 +1,117 @@ +status = error + +# log action execution errors for easier debugging +logger.action.name = org.elasticsearch.action +logger.action.level = debug + +appender.console.type = Console +appender.console.name = console +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n + +appender.rolling.type = RollingFile +appender.rolling.name = rolling +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.rolling.fileName = ${sys:es.logs}.log +{% else %} +appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log +{% endif %} +appender.rolling.layout.type = PatternLayout +appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log +{% else %} +appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz +{% endif %} +appender.rolling.policies.type = Policies +appender.rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.rolling.policies.time.interval = 1 +appender.rolling.policies.time.modulate = true +{% if (es_version | version_compare('6.0.0', '>')) %} +appender.rolling.policies.size.type = SizeBasedTriggeringPolicy +appender.rolling.policies.size.size = 128MB +appender.rolling.strategy.type = DefaultRolloverStrategy +appender.rolling.strategy.fileIndex = nomax +appender.rolling.strategy.action.type = Delete +appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} +appender.rolling.strategy.action.condition.type = IfFileName +appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* +appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize +appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB +{% endif %} +rootLogger.level = info +rootLogger.appenderRef.console.ref = console +rootLogger.appenderRef.rolling.ref = rolling + +appender.deprecation_rolling.type = RollingFile +appender.deprecation_rolling.name = deprecation_rolling +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.deprecation_rolling.fileName = ${sys:es.logs}_deprecation.log +{% else %} +appender.deprecation_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.log +{% endif %} +appender.deprecation_rolling.layout.type = PatternLayout +appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.deprecation_rolling.filePattern = ${sys:es.logs}_deprecation-%i.log.gz +{% else %} +appender.deprecation_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%i.log.gz +{% endif %} +appender.deprecation_rolling.policies.type = Policies +appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy +appender.deprecation_rolling.policies.size.size = 1GB +appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy +appender.deprecation_rolling.strategy.max = 4 + +logger.deprecation.name = org.elasticsearch.deprecation +logger.deprecation.level = warn +logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_rolling +logger.deprecation.additivity = false + +appender.index_search_slowlog_rolling.type = RollingFile +appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.index_search_slowlog_rolling.fileName = ${sys:es.logs}_index_search_slowlog.log +{% else %} +appender.index_search_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog.log +{% endif %} +appender.index_search_slowlog_rolling.layout.type = PatternLayout +appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs}_index_search_slowlog-%d{yyyy-MM-dd}.log +{% else %} +appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog-%d{yyyy-MM-dd}.log +{% endif %} +appender.index_search_slowlog_rolling.policies.type = Policies +appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.index_search_slowlog_rolling.policies.time.interval = 1 +appender.index_search_slowlog_rolling.policies.time.modulate = true + +logger.index_search_slowlog_rolling.name = index.search.slowlog +logger.index_search_slowlog_rolling.level = trace +logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling +logger.index_search_slowlog_rolling.additivity = false + +appender.index_indexing_slowlog_rolling.type = RollingFile +appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs}_index_indexing_slowlog.log +{% else %} +appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog.log +{% endif %} +appender.index_indexing_slowlog_rolling.layout.type = PatternLayout +appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n +{% if (es_version | version_compare('6.0.0', '<')) %} +appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs}_index_indexing_slowlog-%d{yyyy-MM-dd}.log +{% else %} +appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog-%d{yyyy-MM-dd}.log +{% endif %} +appender.index_indexing_slowlog_rolling.policies.type = Policies +appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.index_indexing_slowlog_rolling.policies.time.interval = 1 +appender.index_indexing_slowlog_rolling.policies.time.modulate = true + +logger.index_indexing_slowlog.name = index.indexing.slowlog.index +logger.index_indexing_slowlog.level = trace +logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling +logger.index_indexing_slowlog.additivity = false diff --git a/roles/es6/templates/security/role_mapping.yml.j2 b/roles/es6/templates/security/role_mapping.yml.j2 new file mode 100644 index 0000000..2584375 --- /dev/null +++ b/roles/es6/templates/security/role_mapping.yml.j2 @@ -0,0 +1 @@ +{{ es_role_mapping | to_nice_yaml }} \ No newline at end of file diff --git a/roles/es6/templates/security/roles.yml.j2 b/roles/es6/templates/security/roles.yml.j2 new file mode 100644 index 0000000..9f211f2 --- /dev/null +++ b/roles/es6/templates/security/roles.yml.j2 @@ -0,0 +1 @@ +{{ es_roles.file | to_nice_yaml }} \ No newline at end of file diff --git a/roles/es6/templates/security/users_roles.j2 b/roles/es6/templates/security/users_roles.j2 new file mode 100644 index 0000000..1c0acfa --- /dev/null +++ b/roles/es6/templates/security/users_roles.j2 @@ -0,0 +1 @@ +{{users_roles | join("\n") }} \ No newline at end of file diff --git a/roles/es6/templates/systemd/elasticsearch.j2 b/roles/es6/templates/systemd/elasticsearch.j2 new file mode 100644 index 0000000..8bd5545 --- /dev/null +++ b/roles/es6/templates/systemd/elasticsearch.j2 @@ -0,0 +1,76 @@ +[Unit] +Description=Elasticsearch-{{es_instance_name}} +Documentation=http://www.elastic.co +Wants=network-online.target +After=network-online.target + +[Service] +Environment=ES_HOME={{es_home}} +Environment=CONF_DIR={{conf_dir}} +Environment=ES_PATH_CONF={{conf_dir}} +Environment=DATA_DIR={{ data_dirs | array_to_str }} +Environment=LOG_DIR={{log_dir}} +Environment=PID_DIR={{pid_dir}} +EnvironmentFile=-{{instance_default_file}} + +WorkingDirectory={{es_home}} + +User={{es_user}} +Group={{es_group}} + +{% if (es_version | version_compare('6.0.0', '<')) %} +ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec +{% endif %} + +ExecStart={{es_home}}/bin/elasticsearch \ + -p ${PID_DIR}/elasticsearch.pid \ +{% if (es_version | version_compare('6.0.0', '<')) %} + -Edefault.path.logs=${LOG_DIR} \ + -Edefault.path.data=${DATA_DIR} \ + -Edefault.path.conf=${CONF_DIR} \ +{% endif %} + --quiet + + +# StandardOutput is configured to redirect to journalctl since +# some error messages may be logged in standard output before +# elasticsearch logging system is initialized. Elasticsearch +# stores its logs in /var/log/elasticsearch and does not use +# journalctl by default. If you also want to enable journalctl +# logging, you can simply remove the "quiet" option from ExecStart. +StandardOutput=journal +StandardError=inherit + +# Specifies the maximum file descriptor number that can be opened by this process +{% if es_max_open_files is defined %} +LimitNOFILE={{es_max_open_files}} +{% endif %} + +# Specifies the maximum number of bytes of memory that may be locked into RAM +# Set to "infinity" if you use the 'bootstrap.memory_lock: true' option +# in elasticsearch.yml and 'MAX_LOCKED_MEMORY=unlimited' in {{instance_default_file}} +{% if m_lock_enabled %} +LimitMEMLOCK=infinity +{% endif %} + +# Specifies the maximum number of threads that can be started. Elasticsearch requires a +# minimum of 2048. +LimitNPROC={{ es_max_threads }} + +# Disable timeout logic and wait until process is stopped +TimeoutStopSec=0 + +# SIGTERM signal is used to stop the Java process +KillSignal=SIGTERM + +# Send the signal only to the JVM rather than its control group +KillMode=process + +# Java process is never killed +SendSIGKILL=no + +# When a JVM receives a SIGTERM signal it exits with code 143 +SuccessExitStatus=143 + +[Install] +WantedBy=multi-user.target diff --git a/roles/es6/vars/Debian.yml b/roles/es6/vars/Debian.yml new file mode 100644 index 0000000..071736e --- /dev/null +++ b/roles/es6/vars/Debian.yml @@ -0,0 +1,4 @@ +--- +java: "{% if es_java is defined %}{{es_java}}{% else %}openjdk-8-jre-headless{% endif %}" +default_file: "/etc/default/elasticsearch" +es_home: "/usr/share/elasticsearch" diff --git a/roles/es6/vars/RedHat.yml b/roles/es6/vars/RedHat.yml new file mode 100644 index 0000000..b0aa42b --- /dev/null +++ b/roles/es6/vars/RedHat.yml @@ -0,0 +1,4 @@ +--- +java: "{{ es_java | default('java-1.8.0-openjdk.x86_64') }}" +default_file: "/etc/sysconfig/elasticsearch" +es_home: "/usr/share/elasticsearch" \ No newline at end of file diff --git a/roles/es6/vars/main.yml b/roles/es6/vars/main.yml new file mode 100644 index 0000000..b3bd126 --- /dev/null +++ b/roles/es6/vars/main.yml @@ -0,0 +1,8 @@ +--- +es_package_url: "https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch" +es_conf_dir: "/etc/elasticsearch" +sysd_script: "/usr/lib/systemd/system/elasticsearch.service" +init_script: "/etc/init.d/elasticsearch" +#add supported features here +supported_xpack_features: ["alerting","monitoring","graph","security"] +reserved_xpack_users: ["elastic","kibana","logstash_system"] \ No newline at end of file diff --git a/roles/ffmpeg/defaults/main.yml b/roles/ffmpeg/defaults/main.yml new file mode 100644 index 0000000..67d651e --- /dev/null +++ b/roles/ffmpeg/defaults/main.yml @@ -0,0 +1,2 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} diff --git a/roles/ffmpeg/tasks/main.yml b/roles/ffmpeg/tasks/main.yml new file mode 100755 index 0000000..e4333db --- /dev/null +++ b/roles/ffmpeg/tasks/main.yml @@ -0,0 +1,52 @@ +- name: Install required utils + apt: name={{ item }} state=present + become: yes + with_items: + - git + - git-core + - zip + - gcc + - make + + +- name: Git clone FFmpeg repo + become: yes + git: repo=https://github.com/FFmpeg/FFmpeg.git dest=/home/{{learner_user}}/ffmpeg version=release/3.0 + ignore_errors: yes + + +- name: change the permissions of ffmpeg + become: yes + file: path=/home/{{learner_user}}/ffmpeg owner={{learner_user}} group={{learner_user}} recurse=yes + + +- name: run the command ./configure + become: yes + become_user: "{{learner_user}}" + command: chdir=/home/{{learner_user}}/ffmpeg ./configure --disable-yasm + + +- name: run the command make + become: yes + command: chdir=/home/{{learner_user}}/ffmpeg make + + +- name: run the command make install + become: yes + command: chdir=/home/{{learner_user}}/ffmpeg make install + +- name: move ffmpeg files + become: yes + command: cp {{ learner_user_home }}/ffmpeg/{{ item }} /usr/local/bin + with_items: + - ffmpeg + - ffprobe + - ffserver + +- name: Change permissions after copying ffmpeg files + become: yes + file: path=/usr/local/bin/{{ item }} owner={{learner_user}} group={{learner_user}} mode=0755 + with_items: + - ffmpeg + - ffprobe + - ffserver \ No newline at end of file diff --git a/roles/imagemagick/tasks/main.yml b/roles/imagemagick/tasks/main.yml new file mode 100755 index 0000000..6a84dc7 --- /dev/null +++ b/roles/imagemagick/tasks/main.yml @@ -0,0 +1,5 @@ +--- +# tasks file for imagemagick +- name: install imagemagick + become: yes + apt: name=imagemagick state=present update_cache=yes diff --git a/roles/java/tasks/main.yml b/roles/java/tasks/main.yml new file mode 100755 index 0000000..1805990 --- /dev/null +++ b/roles/java/tasks/main.yml @@ -0,0 +1,28 @@ +- name: Add Java repository to sources + action: apt_repository repo='ppa:webupd8team/java' + become: yes + +- name: Autoaccept license for Java + action: shell echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections + become: yes + + +- name: Update APT package cache + action: apt update_cache=yes + become: yes + + +- name: Install Java 8 + action: apt pkg=oracle-java8-installer state=latest install_recommends=yes + become: yes + + +- name: Set Java 8 Env + action: apt pkg=oracle-java8-set-default state=latest install_recommends=yes + become: yes + + +- name: setup envkeep + become: yes + lineinfile: dest=/etc/sudoers line='Defaults env_keep += "JAVA_HOME"' state=present insertafter=EOF create=yes + \ No newline at end of file diff --git a/roles/jdk-1.8.0_121/README.md b/roles/jdk-1.8.0_121/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/roles/jdk-1.8.0_121/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/roles/jdk-1.8.0_121/tasks/main.yml b/roles/jdk-1.8.0_121/tasks/main.yml new file mode 100644 index 0000000..a8bdee7 --- /dev/null +++ b/roles/jdk-1.8.0_121/tasks/main.yml @@ -0,0 +1,25 @@ +--- +# This role is for installing jdk1.8.0_121 +# Because cassandra 3.7 is not compatible with other latest java versions + +- name: Uncompressing and copying to system path + unarchive: + src: https://sunbirdpublic.blob.core.windows.net/installation/jdk-8u121-linux-x64.tar.gz + dest: /opt/ + remote_src: yes + keep_newer: yes + register: tar + +- name: Updating java jdk to system path + shell: | + update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_121/bin/java 9999 + update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_121/bin/java 9999 + when: tar.changed + +- name: Checking java version + shell: java -version + register: java + +- name: Java version + debug: + var: java.stderr diff --git a/roles/jre-1.8.0_144/README.md b/roles/jre-1.8.0_144/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/roles/jre-1.8.0_144/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/roles/jre-1.8.0_144/tasks/main.yml b/roles/jre-1.8.0_144/tasks/main.yml new file mode 100644 index 0000000..db1843f --- /dev/null +++ b/roles/jre-1.8.0_144/tasks/main.yml @@ -0,0 +1,23 @@ +--- +# This role is for installing jre1.8.0_144 +# Because cassandra 3.9 is not compatible with other latest java versions + +- name: Uncompressing and copying to system path + unarchive: + src: https://sunbirdpublic.blob.core.windows.net/installation/jre-8u144-linux-x64.tar.gz + dest: /opt/ + remote_src: yes + keep_newer: yes + register: tar + +- name: Updating java jre to system path + shell: update-alternatives --install /usr/bin/java java /opt/jre1.8.0_144/bin/java 9999 + when: tar.changed + +- name: Checking java version + shell: java -version + register: java + +- name: Java version + debug: + var: java.stderr diff --git a/roles/learning-service/defaults/main.yml b/roles/learning-service/defaults/main.yml new file mode 100644 index 0000000..5cce75b --- /dev/null +++ b/roles/learning-service/defaults/main.yml @@ -0,0 +1,62 @@ +learner_user: learning +learner_group: learning +learner_user_home: /home/{{learner_user}} +tomcat_major_version: 8 +tomcat_minor_version: 0.36 +tomcat_home: "{{learner_user_home}}/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}" +learner_service_url: "{{inventory_hostname}}:8080" + +instance: "{{env}}" +instance_name: sunbird + +redis_host: "{{ groups['learning1'][0] }}" +redis_port: 6379 +cassandra_host: "{{ groups['lp-cassandra'][0] }}" +cassandra_port: 9042 +content_keyspace_name: "{{env}}_content_store" +hierarchy_keyspace_name: "{{env}}_hierarchy_store" +orchestrator_keyspace_name: "{{env}}_script_store" +content_keyspace_table: content_data + +environment_id: 10000000 + +dialcode_keyspace_name: "{{env}}_dialcode_store" +dial_es_index_host: "{{ groups['composite-search-cluster']|join(':9200,')}}:9200" +audit_es_index_host: "{{ groups['composite-search-cluster']|join(':9200,')}}:9200" +es_index_host : "{{ groups['composite-search-cluster']|join(':9200,')}}:9200" + +learning_neo4j_bolt_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +language_neo4j_bolt_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +learning_read_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +learning_write_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +language_read_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +language_write_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +graphevent_kafka_url: "{{groups['processing-cluster-zookeepers']|join(':9092,')}}:9092" +kafka_topics_instruction: "{{env}}.learning.job.request" +object_bookmark_expiry_in_seconds: 15 +platform_api_url: "http://{{ groups['learning1'][0] }}:8080/learning-service" + +graph_passport_key: "{{ vault_graph_passport_key }}" +dial_service_authorization: "{{ vault_dial_service_authorization }}" +language_service_url: language_url +youtube_app_name: fetch-youtube-license +youtube_api_key: "{{ vault_youtube_api_key }}" + + +cloud_store: azure +azure_public_container: +azure_account_name: +azure_account_key: "{{ vault_azure_storage_secret }}" + +content_media_base_url: +plugin_media_base_url: +dial_service_search_url: +content_to_vec_url: +learning_content_h5p_library_path: +orchestrator_url: + +cloud_storage_config_environment: "{{env}}" + +tomcat_init_mem: -Xms1024m +tomcat_max_mem: -Xmx4096m +search_index_host: "{{ groups['composite-search-cluster']|join(':9200,')}}:9200" diff --git a/roles/learning-service/tasks/main.yml b/roles/learning-service/tasks/main.yml new file mode 100644 index 0000000..8508c2c --- /dev/null +++ b/roles/learning-service/tasks/main.yml @@ -0,0 +1,68 @@ +- name: Stop tomcat + become: yes + systemd: name=tomcat state=stopped + ignore_errors: yes + +- name: Delete Catalina + become: yes + file: path={{ tomcat_home }}/conf/Catalina state=absent + +- name: Delete existing configuration files + become: yes + become_user: "{{learner_user}}" + file: name=/data/properties/learning state=absent + +- name: Copy application.conf file + become: yes + become_user: "{{learner_user}}" + template: src=application.conf.j2 dest=/data/properties/application.conf mode=755 owner={{ learner_user }} group={{ learner_group }} + +- name: Copy the artifact files to tomcat webapps folder + become: yes + become_user: "{{learner_user}}" + copy: src=learning-service.war dest={{learner_user_home}}/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}/webapps + +- name: Remove learning-service folder from tomcat webapps + become: yes + file: name={{learner_user_home}}/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}/webapps/learning-service state=absent + +- name: Start tomcat + become: yes + systemd: name=tomcat state=started + delay: 10 + +- name: Check learning-service health + become: yes + become_user: "{{learner_user}}" + shell: "curl http://{{ learner_service_url }}/learning-service/health | grep \"healthy\":false | wc -l" + register: learning_process + +- name: Print the health status to console + debug: + var: learning_process + +- name: Failed learning-service health check + become: yes + become_user: "{{learner_user}}" + fail: msg="Health check failed for learning-service" + when: "learning_process.stdout >= '1'" + +- name: Copy elastic search index (suggestions) creation script and config + become: yes + become_user: "{{learner_user}}" + template: src={{ item }}.j2 dest={{learner_user_home}}/{{ item }} mode=755 owner={{ learner_user }} group={{ learner_group }} + with_items: + - 'create_lp_suggestions_index.sh' + - 'lp_suggestions_index.json' + +- name: Run script to create elastic search index + become: yes + become_user: "{{learner_user}}" + command: "{{learner_user_home}}/create_lp_suggestions_index.sh" + register: suggestions_index_create_status + +- name: Print create elastic search index status to console + become: yes + become_user: "{{learner_user}}" + debug: + var: suggestions_index_create_status diff --git a/roles/learning-service/templates/application.conf.j2 b/roles/learning-service/templates/application.conf.j2 new file mode 100644 index 0000000..4d2df15 --- /dev/null +++ b/roles/learning-service/templates/application.conf.j2 @@ -0,0 +1,241 @@ +#Platform Configuration +platform.services=["learning", "language", "config"] + +# Learning-Service Configuration +learning.graph_ids=["domain"] +content.metadata.visibility.parent=["textbookunit", "courseunit", "lessonplanunit"] + +# Language-Service Configuration +language.graph_ids=["as","bn","en","gu","hi","hoc","jun","ka","mai","mr","unx","or","san","sat","ta","te","urd"] + +# Redis Configuration +redis.host="{{ redis_host }}" +redis.port={{ redis_port }} +redis.maxConnections=128 + +# Cassandra Configuration +orchestrator.keyspace.name="{{ orchestrator_keyspace_name }}" +orchestrator.keyspace.table="script_data" +content.keyspace.name="{{ content_keyspace_name }}" +hierarchy.keyspace.name="{{ hierarchy_keyspace_name }}" +content.hierarchy.table="content_hierarchy" +cassandra.host="{{ cassandra_host }}" +cassandra.port={{ cassandra_port }} + +dialcode.keyspace.name="{{ dialcode_keyspace_name }}" +dialcode.keyspace.table="dial_code" +dialcode.max_count=1000 + +system.config.keyspace.name="{{ dialcode_keyspace_name }}" +system.config.table="system_config" +publisher.keyspace.name="{{ dialcode_keyspace_name }}" +publisher.keyspace.table="publisher" + +#DIAL Code Generator Configuration +dialcode.strip.chars="0" +dialcode.length=6.0 +dialcode.large.prime_number=1679979167 + +dialcode.es_conn_info="{{ dial_es_index_host }}" +dialcode.search.limit=1000 + +#DIAL Code ElasticSearch Configuration +{{ dialcode_keyspace_name }}.dial_code.index=true +{{ dialcode_keyspace_name }}.dial_code.object_type="DialCode" + +audit.es_conn_info="{{ audit_es_index_host }}" + +#Assessment Item Configuration +assessment.keyspace.name="{{ content_keyspace_name }}" +assessment.keyspace.table="question_data" + +# Actor System Configuration +LearningActorSystem { + akka { + actor { + default-dispatcher { + type = "Dispatcher" + executor = "fork-join-executor" + fork-join-executor { + parallelism-min = 1 + parallelism-factor = 2.0 + parallelism-max = 4 + } + # Throughput for default Dispatcher, set to 1 for as fair as possible + throughput = 1 + } + deployment { + /SearchManager + { + router = smallest-mailbox-pool + nr-of-instances = 5 + } + /HealthCheckManager + { + router = smallest-mailbox-pool + nr-of-instances = 5 + } + } + } + } +} + +LanguageActorSystem { + akka { + actor { + default-dispatcher { + type = "Dispatcher" + executor = "fork-join-executor" + fork-join-executor { + parallelism-min = 1 + parallelism-factor = 2.0 + parallelism-max = 4 + } + # Throughput for default Dispatcher, set to 1 for as fair as possible + throughput = 1 + } + deployment { + /SearchManager + { + router = smallest-mailbox-pool + nr-of-instances = 5 + } + /HealthCheckManager + { + router = smallest-mailbox-pool + nr-of-instances = 5 + } + } + } + } +} + +# Orchestrator Configuration +env="{{ orchestrator_url }}" + +#Current environment +cloud_storage.env = "{{ cloud_storage_config_environment }}" + +#Folder configuration +cloud_storage.content.folder = "content" +cloud_storage.asset.folder = "assets" +cloud_storage.artefact.folder = "artifact" +cloud_storage.bundle.folder = "bundle" +cloud_storage.media.folder = "media" +cloud_storage.ecar.folder = "ecar_files" +cloud_storage.upload.url.ttl = 600 + + +# Media download configuration +content.media.base.url="{{content_media_base_url}}" +plugin.media.base.url="{{plugin_media_base_url}}" + + +# Content Extraction Configuration + +#directory location where store unzip file +dist.directory = "/data/tmp/dist/" +output.zipfile = "/data/tmp/story.zip" +source.folder = "/data/tmp/temp2/" +save.directory = "/data/tmp/temp/" + +# Content 2 vec analytics URL +CONTENT_TO_VEC_URL="{{ content_to_vec_url }}" + +# FOR CONTENT WORKFLOW PIPELINE (CWP) + +#--Content Workflow Pipeline Mode +OPERATION_MODE = "TEST" + +#--Maximum Content Package File Size Limit in Bytes (50 MB) +MAX_CONTENT_PACKAGE_FILE_SIZE_LIMIT = 52428800 + +#--Maximum Asset File Size Limit in Bytes (20 MB - 20971520) +MAX_ASSET_FILE_SIZE_LIMIT = 52428800 + +#--No of Retry While File Download Fails +RETRY_ASSET_DOWNLOAD_COUNT = 1 + +# H5P Library Path +content.h5p.library.path="{{ learning_content_h5p_library_path }}" + +# ElasticSearch Configuration +search.es_conn_info="{{ es_index_host }}" +search.fields.query=["name^100","title^100","lemma^100","code^100","domain","subject","description^10","keywords^100","ageGroup^10","filter^10","theme^10","genre^10","objects^25","contentType^100","language^200","teachingMode^25","skills^10","learningObjective^10","curriculum^100","gradeLevel^100","developer^100","attributions^10","owner^50","text","words","releaseNotes"] +search.fields.date=["lastUpdatedOn","createdOn","versionDate","lastSubmittedOn","lastPublishedOn"] +search.batch.size=500 +search.connection.timeout=30 + +platform-api-url="{{ platform_api_url }}" + +# Language Index Configuration +ignoreStartWordsList=[" \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +# Get standard environment variables +PRGDIR=`dirname "$PRG"` + +# Only set CATALINA_HOME if not already set +[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` + +# Copy CATALINA_BASE from CATALINA_HOME if not already set +[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" + +# Ensure that any user defined CLASSPATH variables are not used on startup, +# but allow them to be specified in setenv.sh, in rare case when it is needed. +CLASSPATH= + +if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then + . "$CATALINA_BASE/bin/setenv.sh" +elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then + . "$CATALINA_HOME/bin/setenv.sh" +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"` + [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"` + [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"` + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon +# as this is used as the separator in the classpath and Java provides no +# mechanism for escaping if the same character appears in the path. +case $CATALINA_HOME in + *:*) echo "Using CATALINA_HOME: $CATALINA_HOME"; + echo "Unable to start as CATALINA_HOME contains a colon (:) character"; + exit 1; +esac +case $CATALINA_BASE in + *:*) echo "Using CATALINA_BASE: $CATALINA_BASE"; + echo "Unable to start as CATALINA_BASE contains a colon (:) character"; + exit 1; +esac + +# For OS400 +if $os400; then + # Set job priority to standard for interactive (interactive - 6) by using + # the interactive priority - 6, the helper threads that respond to requests + # will be running at the same priority as interactive jobs. + COMMAND='chgjob job('$JOBNAME') runpty(6)' + system $COMMAND + + # Enable multi threading + export QIBM_MULTI_THREADED=Y +fi + +# Get standard Java environment variables +if $os400; then + # -r will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + . "$CATALINA_HOME"/bin/setclasspath.sh +else + if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then + . "$CATALINA_HOME"/bin/setclasspath.sh + else + echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh" + echo "This file is needed to run this program" + exit 1 + fi +fi + +# Add on extra jar files to CLASSPATH +if [ ! -z "$CLASSPATH" ] ; then + CLASSPATH="$CLASSPATH": +fi +CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar + +if [ -z "$CATALINA_OUT" ] ; then + CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out +fi + +if [ -z "$CATALINA_TMPDIR" ] ; then + # Define the java.io.tmpdir to use for Catalina + CATALINA_TMPDIR="$CATALINA_BASE"/temp +fi + +# Add tomcat-juli.jar to classpath +# tomcat-juli.jar can be over-ridden per instance +if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then + CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar +else + CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar +fi + +# Bugzilla 37848: When no TTY is available, don't output to console +have_tty=0 +if [ "`tty`" != "not a tty" ]; then + have_tty=1 +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` + JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"` + CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"` + CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"` + CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` +fi + +if [ -z "$JSSE_OPTS" ] ; then + JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" +fi +JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS" + +# Set juli LogManager config file if it is present and an override has not been issued +if [ -z "$LOGGING_CONFIG" ]; then + if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then + LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" + else + # Bugzilla 45585 + LOGGING_CONFIG="-Dnop" + fi +fi + +if [ -z "$LOGGING_MANAGER" ]; then + LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +fi + +# Uncomment the following line to make the umask available when using the +# org.apache.catalina.security.SecurityListener +#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`" + +# ----- Execute The Requested Command ----------------------------------------- + +# Bugzilla 37848: only output this if we have a TTY +if [ $have_tty -eq 1 ]; then + echo "Using CATALINA_BASE: $CATALINA_BASE" + echo "Using CATALINA_HOME: $CATALINA_HOME" + echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR" + if [ "$1" = "debug" ] ; then + echo "Using JAVA_HOME: $JAVA_HOME" + else + echo "Using JRE_HOME: $JRE_HOME" + fi + echo "Using CLASSPATH: $CLASSPATH" + if [ ! -z "$CATALINA_PID" ]; then + echo "Using CATALINA_PID: $CATALINA_PID" + fi +fi + +if [ "$1" = "jpda" ] ; then + if [ -z "$JPDA_TRANSPORT" ]; then + JPDA_TRANSPORT="dt_socket" + fi + if [ -z "$JPDA_ADDRESS" ]; then + JPDA_ADDRESS="localhost:8000" + fi + if [ -z "$JPDA_SUSPEND" ]; then + JPDA_SUSPEND="n" + fi + if [ -z "$JPDA_OPTS" ]; then + JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND" + fi + CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS" + shift +fi + +if [ "$1" = "debug" ] ; then + if $os400; then + echo "Debug command not available on OS400" + exit 1 + else + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Djava.security.manager \ + -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + fi + +elif [ "$1" = "run" ]; then + + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + +elif [ "$1" = "start" ] ; then + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + echo "Existing PID file found during start." + if [ -r "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + ps -p $PID >/dev/null 2>&1 + if [ $? -eq 0 ] ; then + echo "Tomcat appears to still be running with PID $PID. Start aborted." + echo "If the following process is not a Tomcat process, remove the PID file and try again:" + ps -f -p $PID + exit 1 + else + echo "Removing/clearing stale PID file." + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "Unable to remove or clear stale PID file. Start aborted." + exit 1 + fi + fi + fi + else + echo "Unable to read PID file. Start aborted." + exit 1 + fi + else + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ ! -w "$CATALINA_PID" ]; then + echo "Unable to remove or write to empty PID file. Start aborted." + exit 1 + fi + fi + fi + fi + fi + + shift + touch "$CATALINA_OUT" + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + else + eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + fi + + if [ ! -z "$CATALINA_PID" ]; then + echo $! > "$CATALINA_PID" + fi + + echo "Tomcat started." + +elif [ "$1" = "stop" ] ; then + + shift + + SLEEP=5 + if [ ! -z "$1" ]; then + echo $1 | grep "[^0-9]" >/dev/null 2>&1 + if [ $? -gt 0 ]; then + SLEEP=$1 + shift + fi + fi + + FORCE=0 + if [ "$1" = "-force" ]; then + shift + FORCE=1 + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + echo "PID file found but no matching process was found. Stop aborted." + exit 1 + fi + else + echo "PID file is empty and has been ignored." + fi + else + echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted." + exit 1 + fi + fi + + eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" stop + + # stop failed. Shutdown port disabled? Try a normal kill. + if [ $? != 0 ]; then + if [ ! -z "$CATALINA_PID" ]; then + echo "The stop command failed. Attempting to signal the process to stop through OS signal." + kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1 + fi + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + while [ $SLEEP -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + # If Tomcat has stopped don't try and force a stop with an empty PID file + FORCE=0 + else + echo "The PID file could not be removed or cleared." + fi + fi + echo "Tomcat stopped." + break + fi + if [ $SLEEP -gt 0 ]; then + sleep 1 + fi + if [ $SLEEP -eq 0 ]; then + echo "Tomcat did not stop in time." + if [ $FORCE -eq 0 ]; then + echo "PID file was not removed." + fi + echo "To aid diagnostics a thread dump has been written to standard out." + kill -3 `cat "$CATALINA_PID"` + fi + SLEEP=`expr $SLEEP - 1 ` + done + fi + fi + + KILL_SLEEP_INTERVAL=5 + if [ $FORCE -eq 1 ]; then + if [ -z "$CATALINA_PID" ]; then + echo "Kill failed: \$CATALINA_PID not set" + else + if [ -f "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + echo "Killing Tomcat with the PID: $PID" + kill -9 $PID + while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "The PID file could not be removed." + fi + fi + echo "The Tomcat process has been killed." + break + fi + if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then + sleep 1 + fi + KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 ` + done + if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then + echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE." + fi + fi + fi + fi + +elif [ "$1" = "configtest" ] ; then + + eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap configtest + result=$? + if [ $result -ne 0 ]; then + echo "Configuration error detected!" + fi + exit $result + +elif [ "$1" = "version" ] ; then + + "$_RUNJAVA" \ + -classpath "$CATALINA_HOME/lib/catalina.jar" \ + org.apache.catalina.util.ServerInfo + +else + + echo "Usage: catalina.sh ( commands ... )" + echo "commands:" + if $os400; then + echo " debug Start Catalina in a debugger (not available on OS400)" + echo " debug -security Debug Catalina with a security manager (not available on OS400)" + else + echo " debug Start Catalina in a debugger" + echo " debug -security Debug Catalina with a security manager" + fi + echo " jpda start Start Catalina under JPDA debugger" + echo " run Start Catalina in the current window" + echo " run -security Start in the current window with security manager" + echo " start Start Catalina in a separate window" + echo " start -security Start in a separate window with security manager" + echo " stop Stop Catalina, waiting up to 5 seconds for the process to end" + echo " stop n Stop Catalina, waiting up to n seconds for the process to end" + echo " stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running" + echo " stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running" + echo " configtest Run a basic syntax check on server.xml - check exit code for result" + echo " version What version of tomcat are you running?" + echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined" + exit 1 + +fi diff --git a/roles/learning-service/templates/create_lp_suggestions_index.sh.j2 b/roles/learning-service/templates/create_lp_suggestions_index.sh.j2 new file mode 100644 index 0000000..2267749 --- /dev/null +++ b/roles/learning-service/templates/create_lp_suggestions_index.sh.j2 @@ -0,0 +1,18 @@ +#!/bin/bash + +ALIAS_EXIST=`curl '{{ search_index_host }}:9200/_cat/aliases' | grep "lp_suggestion_index_alias" | wc -l` + +if [ $ALIAS_EXIST -eq 0 ] +then + curl -XPUT '{{ search_index_host }}:9200/lp_suggestion_index_v1?pretty' -H 'Content-Type: application/json' -d '@/home/learning/lp_suggestions_index.json' + curl -XPOST '{{ search_index_host }}:9200/_aliases?pretty' -H 'Content-Type: application/json' -d' + { + "actions" : [ + { "add" : { "index" : "lp_suggestion_index_v1", "alias" : "lp_suggestion_index_alias" } } + ] + }' + echo "lp_suggestion_index_alias created." +else + echo "lp_suggestion_index_alias already exist." +fi +exit 0 \ No newline at end of file diff --git a/roles/learning-service/templates/lp_suggestions_index.json.j2 b/roles/learning-service/templates/lp_suggestions_index.json.j2 new file mode 100644 index 0000000..6d273ed --- /dev/null +++ b/roles/learning-service/templates/lp_suggestions_index.json.j2 @@ -0,0 +1,738 @@ +{ + "settings": { + "index": { + "index": "lp_suggestion_index_v1", + "type": "sg", + "analysis": { + "analyzer": { + "sg_index_analyzer": { + "type": "custom", + "tokenizer": "standard", + "filter": [ + "lowercase", + "mynGram" + ] + }, + "sg_search_analyzer": { + "type": "custom", + "tokenizer": "standard", + "filter": [ + "standard", + "lowercase" + ] + }, + "keylower": { + "tokenizer": "keyword", + "filter": "lowercase" + } + }, + "filter": { + "mynGram": { + "type": "nGram", + "min_gram": 1, + "max_gram": 20, + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ] + } + } + } + } + }, + "mappings": { + "sg": { + "dynamic_templates": [ + { + "longs": { + "match_mapping_type": "long", + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + } + } + }, + { + "booleans": { + "match_mapping_type": "boolean", + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + } + } + }, + { + "doubles": { + "match_mapping_type": "double", + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + } + } + }, + { + "dates": { + "match_mapping_type": "date", + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + } + } + }, + { + "strings": { + "match_mapping_type": "string", + "mapping": { + "type": "string", + "copy_to": "all_fields", + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + } + } + } + } + ], + "properties": { + "all_fields": { + "type": "string", + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + } + }, + "command": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "comment": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "comments": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "createdOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "es_metadata_id": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "lastUpdatedBy": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectId": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "params": { + "properties": { + "Language": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "ageGroup": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "ageGrups": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "attributions": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "audience": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "code": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "concepts": { + "properties": { + "description": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "identifier": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "name": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relation": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relationName": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "description": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "domain": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "domains": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "genre": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "gradeLevel": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "language": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "medium": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "methods": { + "properties": { + "description": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "identifier": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "name": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relation": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relationName": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "name": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "subject": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "tags": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "templateType": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "request": { + "properties": { + "content": { + "properties": { + "comments": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "status": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + } + } + }, + "status": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "suggestedBy": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "suggestion_id": { + "type": "string", + "fields": { + "raw": { + "type": "string", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + } + } +} \ No newline at end of file diff --git a/roles/learning-service/templates/server.xml b/roles/learning-service/templates/server.xml new file mode 100755 index 0000000..4f5f4b0 --- /dev/null +++ b/roles/learning-service/templates/server.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/roles/logstash-deploy/defaults/main.yml b/roles/logstash-deploy/defaults/main.yml new file mode 100644 index 0000000..25d138e --- /dev/null +++ b/roles/logstash-deploy/defaults/main.yml @@ -0,0 +1,9 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} +logstash_home: "{{learner_user_home}}/logstash-{{logstash_version}}" +graphevent_kafka_url: "{{groups['processing-cluster-zookeepers']|join(':9092,')}}:9092" +graphevent_kafka_topic_id: "{{env}}.learning.graph.events" +rawtelemetry_event_topic_id: "{{env}}.telemetry.raw" +logstash_version: 6.3.1 +platform: + logstash_config: ['logstash-lp'] diff --git a/roles/logstash-deploy/tasks/main.yml b/roles/logstash-deploy/tasks/main.yml new file mode 100644 index 0000000..aa065db --- /dev/null +++ b/roles/logstash-deploy/tasks/main.yml @@ -0,0 +1,36 @@ + +- name: permissions + become: yes + #become_user: "{{learner_user}}" + file: path={{ logstash_home }} mode=775 owner={{ learner_user }} group={{ learner_user }} recurse=yes + +- name: Copy logstash configuration files for platform + become: yes + become_user: "{{learner_user}}" + template: src={{item}}.j2 dest={{ logstash_home }}/{{item}}.conf + with_items: "{{ platform.logstash_config }}" + +- name: Stop logstash processes related to platform + become: yes + systemd: name=logstash state=stopped + ignore_errors: yes + +- name: create folder for logs + become: yes + become_user: "{{learner_user}}" + file: path={{logstash_home}}/logs state=directory mode=0755 + +#- name: remove sincedb file +# become: yes +# become_user: "{{learner_user}}" +# file: path={{logstash_home}}/{{ item }} state=absent +# with_items: +# - '.sincedb_config_telemetry_event_mw' +# - '.sincedb_language_telemetry_event_mw' +# - '.sincedb_learning_service_mw' +# - '.sincedb_learning_telemetry_event_mw' +# - '.sincedb_search_telemetry_event_mw' + +- name: Start logstash processes related to platform + become: yes + systemd: name=logstash state=started diff --git a/roles/logstash-deploy/templates/logstash-lp.j2 b/roles/logstash-deploy/templates/logstash-lp.j2 new file mode 100644 index 0000000..627cd8c --- /dev/null +++ b/roles/logstash-deploy/templates/logstash-lp.j2 @@ -0,0 +1,84 @@ + +input { + file { + start_position =>"beginning" + type => "raw_event" + path => ["/data/logs/learning_telemetry_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_learning_telemetry_event_mw" + } + file { + start_position =>"beginning" + type => "raw_event" + path => ["/data/logs/language_telemetry_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_language_telemetry_event_mw" + } + file { + start_position =>"beginning" + type => "raw_event" + path => ["/data/logs/config_telemetry_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_config_telemetry_event_mw" + } + file { + start_position =>"beginning" + type => "raw_event" + path => ["/data/logs/search_telemetry_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_search_telemetry_event_mw" + } + file { + start_position =>"beginning" + type => "raw_event" + path => ["/data/logs/learning_service_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_learning_service_mw" + } + file { + start_position =>"beginning" + type => "graph_event" + path => ["/data/logs/learning_graph_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_learning_graph_event_mw" + } + file { + start_position =>"beginning" + type => "graph_event" + path => ["/data/logs/language_graph_event_mw.log"] + sincedb_path => "/home/learning/logstash-6.3.1/.sincedb_language_graph_event_mw" + } +} + +filter { + grok { + match => [ "message", + "%{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:msg}"] + } + mutate { + gsub => [ "message","%{timestamp}","" ] + strip => [ "message" ] + } + json { + source => "message" + } +} + +output { + if [type] == "graph_event" { + kafka { + bootstrap_servers => "{{ graphevent_kafka_url }}" + codec => plain { + format => "%{message}" + } + message_key => "%{nodeUniqueId}" + topic_id => "{{ graphevent_kafka_topic_id }}" + retries => 20 + retry_backoff_ms => 180000 + } + } else if [type] == "raw_event" { + kafka { + bootstrap_servers => "{{ graphevent_kafka_url }}" + codec => plain { + format => "%{message}" + } + topic_id => "{{ rawtelemetry_event_topic_id }}" + retries => 20 + retry_backoff_ms => 180000 + } + } +} diff --git a/roles/logstash/defaults/main.yml b/roles/logstash/defaults/main.yml new file mode 100644 index 0000000..a6ba5d9 --- /dev/null +++ b/roles/logstash/defaults/main.yml @@ -0,0 +1,10 @@ +--- +# vars file for logstash +learner_user: learning +learner_user_home: /home/{{learner_user}} +logstash_home: "{{learner_user_home}}/logstash-{{logstash_version}}" +ip: localhost +port: 9092 +logstash_version: 6.3.1 +logstash_systemd_service: /etc/systemd/system/logstash.service +logstash_jvm_opts: "-Xms1g -Xmx1g" diff --git a/roles/logstash/tasks/main.yml b/roles/logstash/tasks/main.yml new file mode 100644 index 0000000..506c3fa --- /dev/null +++ b/roles/logstash/tasks/main.yml @@ -0,0 +1,46 @@ +--- +# tasks file for logstash +- name: add permissions + become: yes + file: path={{learner_user_home}} mode=0755 recurse=yes owner={{learner_user}} group={{learner_user}} + +- name: Download the zip + become: yes + become_user: "{{learner_user}}" + get_url: url=https://artifacts.elastic.co/downloads/logstash/logstash-{{logstash_version}}.tar.gz dest={{learner_user_home}} timeout=1000 force=yes + +- name: unzip + become: yes + become_user: "{{learner_user}}" + unarchive: src={{learner_user_home}}/logstash-{{logstash_version}}.tar.gz dest={{learner_user_home}} copy=no group={{learner_user}} owner={{learner_user}} creates={{learner_user_home}}/logstash-{{logstash_version}} + +- name: set permissions + become: yes + file: path={{learner_user_home}}/logstash-{{logstash_version}} owner={{learner_user}} group={{learner_user}} mode=0755 recurse=yes + +- name: Delete the logstash zip file + become: yes + become_user: "{{ learner_user }}" + file: path={{learner_user_home}}/logstash-{{logstash_version}}.tar.gz state=absent + +- name: Detect if this is a systemd based system + command: cat /proc/1/comm + register: init +- set_fact: use_systemd=True + when: init.stdout == 'systemd' +- set_fact: use_systemd=False + when: init.stdout != 'systemd' + +- name: Copy template for logstash service + become: yes + template: src=logstash.j2 dest=/etc/init.d/logstash mode=755 + when: init.stdout != 'systemd' + +- name: create systemd config + become: yes + template: src=logstash.service.j2 dest={{logstash_systemd_service}} owner=root group=root mode=644 + when: use_systemd + +- command: systemctl daemon-reload + become: yes + when: use_systemd diff --git a/roles/logstash/templates/logstash.j2 b/roles/logstash/templates/logstash.j2 new file mode 100644 index 0000000..84aae3c --- /dev/null +++ b/roles/logstash/templates/logstash.j2 @@ -0,0 +1,78 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: +# Required-Start: $local_fs $network $named $time $syslog +# Required-Stop: $local_fs $network $named $time $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Description: +### END INIT INFO + +SCRIPT='{{learner_user_home}}/logstash-{{logstash_version}}/bin/logstash -f {{learner_user_home}}/logstash-{{logstash_version}}/logstash-lp.conf --verbose' +RUNAS="{{ learner_user }}" + +PROCESS_NUM='ps -ef | grep "$SCRIPT" | grep -v "grep" | wc -l' +PIDFILE=/var/run/logstash.pid +LOGFILE="{{learner_user_home}}/logstash-{{logstash_version}}/logs/logstash-lp.log" + +start() { + if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then + echo 'Service already running' >&2 + return 1 + fi + echo 'Starting service…' >&2 + local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!" + su -c "$CMD" $RUNAS > "$PIDFILE" + echo 'Service started' >&2 +} + +stop() { + if [ ! -f "$PIDFILE" ]; then + echo 'Service not running' >&2 + exit 1 + else + echo 'Stopping service…' >&2 + kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE" + echo 'Service stopped' >&2 + fi +} + +status(){ + if [ -f $PIDFILE ]; then echo "Logstash is running with pid:" $(cat "$PIDFILE"); + else echo "logstash is not running" + fi +} + +uninstall() { + echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] " + local SURE + read SURE + if [ "$SURE" = "yes" ]; then + stop + rm -f "$PIDFILE" + echo "Notice: log file is not be removed: '$LOGFILE'" >&2 + update-rc.d -f remove + rm -fv "$0" + fi +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + uninstall) + uninstall + ;; + status) + status + ;; + retart) + stop + start + ;; + *) + echo "Usage: $0 {start|stop|restart|uninstall}" +esac diff --git a/roles/logstash/templates/logstash.service.j2 b/roles/logstash/templates/logstash.service.j2 new file mode 100644 index 0000000..cd43889 --- /dev/null +++ b/roles/logstash/templates/logstash.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=logstash Daemon + +[Service] +Type=simple +User={{learner_user}} +Group={{learner_user}} +LimitNOFILE=32768 +Restart=on-failure +#Environment="{{ logstash_jvm_opts }}" +ExecStart={{logstash_home}}/bin/logstash -f {{logstash_home}}/logstash-lp.conf -w 1 --verbose + +[Install] +WantedBy=multi-user.target diff --git a/roles/lp-learning-validation/defaults/main.yml b/roles/lp-learning-validation/defaults/main.yml new file mode 100644 index 0000000..5af93ce --- /dev/null +++ b/roles/lp-learning-validation/defaults/main.yml @@ -0,0 +1,3 @@ +user: learning +service_url: "{{inventory_hostname}}:8080" +search_service_url: "{{ groups['searchall'][0] }}:9000" diff --git a/roles/lp-learning-validation/files/sunbird-logo.png b/roles/lp-learning-validation/files/sunbird-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f29a234acc8f108b4e875c7ce17760a92fc4edd5 GIT binary patch literal 4410 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 Ao&W#< literal 0 HcmV?d00001 diff --git a/roles/lp-learning-validation/files/test.pdf b/roles/lp-learning-validation/files/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ec5c3dd2b553ece0633ca6c227c970060a9cf147 GIT binary patch literal 58437 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 z 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 LQ}gp*R+IlPc?1FY literal 0 HcmV?d00001 diff --git a/roles/lp-learning-validation/tasks/main.yml b/roles/lp-learning-validation/tasks/main.yml new file mode 100644 index 0000000..62b0da6 --- /dev/null +++ b/roles/lp-learning-validation/tasks/main.yml @@ -0,0 +1,227 @@ +- name: Check learning-service health + become: yes + become_user: "{{user}}" + shell: "curl http://{{service_url}}/learning-service/health" + register: learning_process + +- name: Print the learning-service health status to console + debug: + var: learning_process + +- name: Failed learning-service health check + become: yes + become_user: "{{user}}" + fail: msg="Health check failed for learning-service" + when: learning_process.stdout.find('"healthy":"false"') > 0 + +- name: Check search-service health + become: yes + become_user: "{{user}}" + shell: "curl http://{{search_service_url}}/health" + register: search_process + +- name: Print the search-service health status to console + debug: + var: search_process + +- name: Failed search-service health check + become: yes + become_user: "{{user}}" + fail: msg="Health check failed for search-service" + when: search_process.stdout.find('"healthy":"false"') > 0 + +- name: Generare random UUID to create a content. + become: yes + become_user: "{{user}}" + shell: echo "test_"{{ ansible_date_time.iso8601_micro | to_uuid }} + register: content_id + +- name: Print the content ID to console + debug: + var: content_id + +- name: Create content + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/create -H 'Content-Type: application/json' -H 'user-id: mahesh' -d '{\"request\": {\"content\": {\"identifier\": \"{{content_id.stdout}}\", \"name\": \"Untitled Resource\",\"code\": \"test.pdf.1\",\"mimeType\": \"application/pdf\",\"tags\": [\"colors\", \"games\"],\"contentType\": \"Resource\",\"resourceType\": \"Read\"}}}'" + register: create_result + +- name: Print the create content result to console + debug: + var: create_result + +- name: Failed create content check + become: yes + become_user: "{{user}}" + fail: msg="Content Creation Failed" + when: create_result.stdout.find('"status":"successful"') < 1 + +- name: Copy the pdf file to upload + become: yes + copy: src=test.pdf dest=/tmp/test.pdf mode=777 + +- name: Upload content + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/upload/{{content_id.stdout}} -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' -H 'user-id: mahesh' -F file=@/tmp/test.pdf" + register: upload_result + +- name: Print the upload content result to console + debug: + var: upload_result + +- name: Failed upload content check + become: yes + become_user: "{{user}}" + fail: msg="Content Upload failed" + when: upload_result.stdout.find('"status":"successful"') < 1 + +- name: Send content for review + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/review/{{content_id.stdout}} -H 'Cache-Control: no-cache' -H 'Content-Type: application/json' -d '{ \"request\": { \"content\": { } } }'" + register: review_result + +- name: Print the review curl result to console + debug: + var: review_result + +- name: Send for review curl command failure check + become: yes + become_user: "{{user}}" + fail: msg="Send for review failed" + when: review_result.stdout.find('"status":"successful"') < 1 + +- name: Read content and check whether it is in review status + become: yes + become_user: "{{user}}" + shell: "curl http://localhost:8080/learning-service/content/v3/read/{{content_id.stdout}}" + register: read_result_post_review + +- name: Print the read curl result post review to console + debug: + var: read_result_post_review + +- name: Read content post review failure check + become: yes + become_user: "{{user}}" + fail: msg="Read content post review failed" + when: read_result_post_review.stdout.find('"status":"successful"') < 1 or read_result_post_review.stdout.find('"status":"Review"') < 1 + +- name: Publish content + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/publish/{{content_id.stdout}} -H 'Content-Type: application/json' -H 'Cache-Control: no-cache' -d '{ \"request\": { \"content\": { \"publisher\": \"EkStep\", \"lastPublishedBy\": \"Ekstep\" } } }'" + register: publish_result + +- name: Print the publish content result to console + debug: + var: publish_result + +- name: Publish content failure check + become: yes + become_user: "{{user}}" + fail: msg="Publish content failed" + when: publish_result.stdout.find('"status":"successful"') < 1 + +- name: Pause for 60 seconds to publish content + pause: + seconds: 60 + +- name: Read content and check whether it is in live status + become: yes + become_user: "{{user}}" + shell: "curl http://localhost:8080/learning-service/content/v3/read/{{content_id.stdout}}" + register: read_result_post_publish + +- name: Print the read curl result post publish to console + debug: + var: read_result_post_publish + +- name: Read content post publish failure check + become: yes + become_user: "{{user}}" + fail: msg="Read content post publish failed" + when: read_result_post_publish.stdout.find('"status":"successful"') < 1 or read_result_post_publish.stdout.find('"status":"Live"') < 1 + +- name: Search content + become: yes + become_user: "{{user}}" + shell: "curl -X POST {{search_service_url}}/v3/search -H 'Content-Type: application/json' -H 'user-id: mahesh' -d '{ \"request\": { \"filters\": { \"identifier\": \"{{content_id.stdout}}\", \"status\": [] }, \"limit\": 5 } }'" + register: search_result + +- name: Print the search content result to console + debug: + var: search_result + +- name: Failed search content check + become: yes + become_user: "{{user}}" + fail: msg="Search Content failed to locate the content" + when: search_result.stdout.find('"status":"successful"') < 1 or search_result.stdout.find('"count":1') < 1 + +- name: Copy the image file to upload + become: yes + copy: src=sunbird-logo.png dest=/tmp/sunbird-logo.png mode=777 + +- name: Generare random UUID to create a image asset + become: yes + become_user: "{{user}}" + shell: echo "testimage_"{{ ansible_date_time.iso8601_micro | to_uuid }} + register: image_asset_id + +- name: Print the image asset id to console + debug: + var: image_asset_id + +- name: Create image asset + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/create -H 'Content-Type: application/json' -H 'user-id: mahesh' -d '{\"request\": {\"content\": {\"identifier\": \"{{image_asset_id.stdout}}\", \"code\": \"test\", \"name\": \"testasset\", \"mimeType\": \"image/jpeg\", \"mediaType\":\"image\", \"contentType\": \"Asset\", \"description\": \"test asset\"}}}'" + register: create_image_result + +- name: Print the create image result to console + debug: + var: create_image_result + +- name: Failed create image content check + become: yes + become_user: "{{user}}" + fail: msg="Image Content Creation Failed" + when: create_image_result.stdout.find('"status":"successful"') < 1 + +- name: Upload Image + become: yes + become_user: "{{user}}" + shell: "curl -X POST http://localhost:8080/learning-service/content/v3/upload/{{image_asset_id.stdout}} -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' -H 'user-id: mahesh' -F file=@/tmp/sunbird-logo.png" + register: upload_image_result + +- name: Print the upload image content result to console + debug: + var: upload_image_result + +- name: Failed upload image content check + become: yes + become_user: "{{user}}" + fail: msg="Image Content Upload failed" + when: upload_image_result.stdout.find('"status":"successful"') < 1 + +- name: Pause for 60 seconds to publish image + pause: + seconds: 60 + +- name: Read uploaded image content + become: user + become_user: "{{user}}" + shell: "curl http://localhost:8080/learning-service/content/v3/read/{{image_asset_id.stdout}}" + register: read_image_content_result + +- name: Print the read image content result to console + debug: + var: read_image_content_result + +- name: Check for variants + become: yes + become_user: "{{user}}" + fail: msg="Variants check failed for image content" + when: read_image_content_result.stdout.find('"status":"successful"') < 1 or read_image_content_result.stdout.find('"variants"') < 1 or read_image_content_result.stdout.find('"status":"Live"') < 1 \ No newline at end of file diff --git a/roles/lp-synctool-deploy/defaults/main.yml b/roles/lp-synctool-deploy/defaults/main.yml new file mode 100644 index 0000000..112e6c6 --- /dev/null +++ b/roles/lp-synctool-deploy/defaults/main.yml @@ -0,0 +1,21 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} + +graph_passport_key: "{{ vault_graph_passport_key }}" +learning_neo4j_bolt_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +language_neo4j_bolt_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +learning_read_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +learning_write_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:7687 +language_read_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +language_write_elb_url: bolt://{{ groups['learning-neo4j-node1'][0] }}:8687 +object_bookmark_expiry_in_seconds: 15 +environment_id: 10000000 +search_index_host: "{{ groups['composite-search-cluster'][0] }}:9200" +cassandra_host: "{{ groups['lp-cassandra'][0] }}" +cassandra_port: 9042 +hierarchy_keyspace_name: "{{env}}_hierarchy_store" +language_service_url: language_url +youtube_app_name: fetch-youtube-license +youtube_api_key: "{{ vault_youtube_api_key }}" +instance: "{{env}}" +instance_name: diff --git a/roles/lp-synctool-deploy/tasks/main.yml b/roles/lp-synctool-deploy/tasks/main.yml new file mode 100644 index 0000000..38e57b5 --- /dev/null +++ b/roles/lp-synctool-deploy/tasks/main.yml @@ -0,0 +1,47 @@ +--- +- name: Print the command to console + become: yes + become_user: "{{learner_user}}" + debug: + var: command + +- name: Print the parameters to console + become: yes + become_user: "{{learner_user}}" + debug: + var: parameters + +- name: Delete existing configuration files + become: yes + become_user: "{{learner_user}}" + file: name="{{learner_user_home}}/sync_tool" state=absent + +- name: Create directory + become: yes + file: name={{learner_user_home}}/sync_tool state=directory mode=755 owner="{{learner_user}}" group="{{learner_user}}" + +- name: Copy application.conf file + become: yes + become_user: "{{learner_user}}" + template: src=application.conf.j2 dest={{learner_user_home}}/sync_tool/application.conf + +- name: Copy jar file. + become: yes + become_user: "{{learner_user}}" + copy: src=sync-tool-0.0.1-SNAPSHOT.jar dest={{learner_user_home}}/sync_tool/ + +- name: Run Sync tool with given command and parameters. + become: yes + become_user: "{{learner_user}}" + shell: "java -Dconfig.file={{learner_user_home}}/sync_tool/application.conf -jar sync-tool-0.0.1-SNAPSHOT.jar {{command}} {{parameters}}" + async: 3600 + poll: 10 + args: + chdir: "{{learner_user_home}}/sync_tool/" + register: job_status + +- name: Print the job status to console + become: yes + become_user: "{{learner_user}}" + debug: + var: job_status diff --git a/roles/lp-synctool-deploy/templates/application.conf.j2 b/roles/lp-synctool-deploy/templates/application.conf.j2 new file mode 100644 index 0000000..323b620 --- /dev/null +++ b/roles/lp-synctool-deploy/templates/application.conf.j2 @@ -0,0 +1,51 @@ +SyncActorSystem{ + akka { + actor { + default-dispatcher { + type = "Dispatcher" + executor = "fork-join-executor" + fork-join-executor { + parallelism-min = 1 + parallelism-factor = 2.0 + parallelism-max = 4 + } + # Throughput for default Dispatcher, set to 1 for as fair as possible + throughput = 1 + } + } + } +} + + +# Neo4j Graph Configuration +graph.dir="/data/graphDB" +akka.request_timeout=30 +environment.id={{ environment_id }} +graph.passport.key.base="{{ graph_passport_key }}" +route.domain="{{ learning_neo4j_bolt_url }}" +route.bolt.read.domain="{{ learning_read_elb_url }}" +route.bolt.write.domain="{{ learning_write_elb_url }}" +route.all="{{ language_neo4j_bolt_url }}" +route.bolt.read.all="{{ language_read_elb_url }}" +route.bolt.write.all="{{ language_write_elb_url }}" +platform.auth.check.enabled=false +platform.cache.ttl=3600000 + +telemetry_env={{instance}} +batch.size=100 + +# Elastic Search Configuration +search.es_conn_info="{{ search_index_host }}" +search.fields.query=["name^100","title^100","lemma^100","code^100","tags^100","domain","subject","description^10","keywords^25","ageGroup^10","filter^10","theme^10","genre^10","objects^25","contentType^100","language^200","teachingMode^25","skills^10","learningObjective^10","curriculum^100","gradeLevel^100","developer^100","attributions^10","owner^50","text","words","releaseNotes"] +search.fields.date=["lastUpdatedOn","createdOn","versionDate","lastSubmittedOn","lastPublishedOn"] +search.batch.size=500 +search.connection.timeout=30 + +nested.fields=["badgeAssertions"] +channel.default="in.ekstep" + +# Cassandra Configurations +hierarchy.keyspace.name="{{ hierarchy_keyspace_name }}" +content.hierarchy.table="content_hierarchy" +cassandra.host="{{ cassandra_host }}" +cassandra.port={{ cassandra_port }} \ No newline at end of file diff --git a/roles/neo4j-backup/defaults/main.yml b/roles/neo4j-backup/defaults/main.yml new file mode 100644 index 0000000..7a806cd --- /dev/null +++ b/roles/neo4j-backup/defaults/main.yml @@ -0,0 +1,9 @@ +learner_user: learning +learner_group: learning +learner_user_home: /home/{{learner_user}} + +machine: -dev +var3: "-neo4j-node1" +var4: "_graph" +service: learning +graph_machine: "{{service}}{{var4}}" \ No newline at end of file diff --git a/roles/neo4j-backup/tasks/main.yml b/roles/neo4j-backup/tasks/main.yml new file mode 100755 index 0000000..486f728 --- /dev/null +++ b/roles/neo4j-backup/tasks/main.yml @@ -0,0 +1,47 @@ +- name: delete learning_graph or language_graph + become: yes + file: path={{learner_user_home}}/{{graph_machine}} state=absent + +- name: create directory + become: yes + file: path={{learner_user_home}}/{{graph_machine}} state=directory owner={{ learner_user }} group={{ learner_user }} recurse=yes + +- name: copy template of scripthell script to stop service + become: yes + template: src=backup_script.j2 dest={{learner_user_home}}/backup_script.sh mode=777 owner={{ learner_user }} group={{ learner_user }} + +- name: run script + become: yes + become_user: learning + command: "{{learner_user_home}}/backup_script.sh" + +- name: ls backup directory + become: yes + become_user: "{{ learner_user }}" + command: ls {{learner_user_home}}/backup/ + register: var1 + +- name: debugging variable + debug: + var: var1.stdout + +- name: Ensure azure blob storage container exists + command: az storage container create --name {{ neo4j_backup_azure_container_name }} + ignore_errors: true + environment: + AZURE_STORAGE_ACCOUNT: "{{ neo4j_backup_azure_storage_account_name }}" + AZURE_STORAGE_KEY: "{{ neo4j_backup_azure_storage_access_key }}" + +- name: Upload to azure blob storage + command: "az storage blob upload --name {{ var1.stdout }} --file /home/learning/backup/{{ var1.stdout }} --container-name {{ neo4j_backup_azure_container_name }}" + environment: + AZURE_STORAGE_ACCOUNT: "{{ neo4j_backup_azure_storage_account_name }}" + AZURE_STORAGE_KEY: "{{ neo4j_backup_azure_storage_access_key }}" + async: 3600 + poll: 10 + +- name: clean up backup dir after upload + file: path={{learner_user_home}}/backup state=absent + + + \ No newline at end of file diff --git a/roles/neo4j-backup/templates/backup_script.j2 b/roles/neo4j-backup/templates/backup_script.j2 new file mode 100644 index 0000000..22450a4 --- /dev/null +++ b/roles/neo4j-backup/templates/backup_script.j2 @@ -0,0 +1,15 @@ +#!/bin/sh +cd {{neo4j_home}} +bin/neo4j-backup --from={{backup_add}} --to=/home/learning/{{graph_machine}} +time="$(date '+%e%b%Y')" +var="{{graph_machine}}" +var1="_" +var3="{{instance}}" +time1="$(date '+%H%M%S')" +var4=".tar.gz" +var2="$time$var1$time1$var1$var$var1$var3$var4" +echo "$var2" +cd /home/learning +tar -cvzf $var2 {{graph_machine}} +mkdir /home/learning/backup +mv $var2 /home/learning/backup \ No newline at end of file diff --git a/roles/neo4j-cluster/defaults/main.yml b/roles/neo4j-cluster/defaults/main.yml new file mode 100644 index 0000000..a236229 --- /dev/null +++ b/roles/neo4j-cluster/defaults/main.yml @@ -0,0 +1,24 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} + +neo4j_dir: neo4j-learning +neo4j_home: "{{learner_user_home}}/{{neo4j_dir}}/neo4j-enterprise-3.3.0" +neo4j_zip: #neo4j enterprise zip file +neo4j_enterprise: "false" +dbms_memory_heap_initial_size: 1024 +dbms_memory_heap_max_size: 1024 +dbms_memory_pagecache_size: 2g +dbms_backup_enabled: true +dbms_backup_address: "0.0.0.0:7362" +neo4j_dbms_shell_port: "1337" +dbms_connector_bolt_address: "0.0.0.0:7687" +dbms_connector_http_address: "0.0.0.0:7474" +dbms_connector_https_address: "localhost:7473" +instance: "{{env}}" +product: lp + +#server_id: 1 +dbms_mode: HA +initial_hosts: "{{groups['learning-neo4j-cluster'][0]}}:7001" +host_coordination: "{{inventory_hostname}}:7001" +ha_host_data: "{{inventory_hostname}}:6001" diff --git a/roles/neo4j-cluster/tasks/main.yml b/roles/neo4j-cluster/tasks/main.yml new file mode 100644 index 0000000..219d5f5 --- /dev/null +++ b/roles/neo4j-cluster/tasks/main.yml @@ -0,0 +1,56 @@ +- name: install + become: yes + apt: name={{item}} state=present + with_items: + - python-dev + - python-pip + - unzip + +- name: create folder data for learning + become: yes + file: path={{ item }} state=directory mode=0755 owner={{learner_user}} group={{learner_user}} + with_items: + - /data + - /data/logs + +- name: Create Paths + become: yes + file: path={{learner_user_home}}/{{neo4j_dir}} state=directory owner="{{learner_user}}" group="{{learner_user}}" + +- debug: + msg: "System {{ neo4j_dir }}" + +- name: copy the neo4j cluster zip file + become: yes + become_user: "{{learner_user}}" + copy: src=artifacts/{{neo4j_zip}} dest={{learner_user_home}} + +- name: Extract archive {{neo4j_zip}} + become: yes + become_user: "{{learner_user}}" + unarchive: src={{learner_user_home}}/{{neo4j_zip}} dest={{learner_user_home}}/{{neo4j_dir}} copy=no group={{learner_user}} owner={{learner_user}} creates={{ neo4j_home }} + +- name: Change Permissions neo4j-enterprise-3.0.4 + become: yes + file: path={{ neo4j_home }} mode=0755 owner={{learner_user}} group={{learner_user}} recurse=yes + + +- name: Copy the template neo4j.conf file + become: yes + become_user: "{{learner_user}}" + template: src=neo4j.conf.j2 dest={{ neo4j_home }}/conf/neo4j.conf group={{learner_user}} owner={{learner_user}} mode=755 + when: dbms_mode != "ARBITER" + + +- name: Copy the template neo4j.conf.arbiter file + become: yes + become_user: "{{learner_user}}" + template: src=neo4j.conf.arbiter.j2 dest={{ neo4j_home }}/conf/neo4j.conf group={{learner_user}} owner={{learner_user}} + when: dbms_mode == "ARBITER" + +- name: Copy the template neo4j-wrapper.conf file + become: yes + become_user: "{{learner_user}}" + template: src=neo4j-wrapper.conf.j2 dest={{ neo4j_home }}/conf/neo4j-wrapper.conf group={{learner_user}} owner={{learner_user}} + when: dbms_mode != "ARBITER" + diff --git a/roles/neo4j-cluster/templates/neo4j-wrapper.conf.j2 b/roles/neo4j-cluster/templates/neo4j-wrapper.conf.j2 new file mode 100644 index 0000000..1a34b8e --- /dev/null +++ b/roles/neo4j-cluster/templates/neo4j-wrapper.conf.j2 @@ -0,0 +1,77 @@ +#******************************************************************** +# JVM Parameters +#******************************************************************** + +# Java Heap Size: by default the Java heap size is dynamically +# calculated based on available system resources. +# Uncomment these lines to set specific initial and maximum +# heap size in MB. + +dbms.memory.heap.initial_size={{dbms_memory_heap_initial_size}} +dbms.memory.heap.max_size={{dbms_memory_heap_max_size}} + +# G1GC generally strikes a good balance between throughput and tail +# latency, without too much tuning. +dbms.jvm.additional=-XX:+UseG1GC + +# Have common exceptions keep producing stack traces, so they can be +# debugged regardless of how often logs are rotated. +dbms.jvm.additional=-XX:-OmitStackTraceInFastThrow + +# Reduce probability of objects getting the same identity hash code +# via a race, by computing them with thread-local PRNGs. +dbms.jvm.additional=-XX:hashCode=5 + +dbms.jvm.additional=-XX:NewRatio=1 + +# Make sure that `initmemory` is not only allocated, but committed to +# the process, before starting the database. This reduces memory +# fragmentation, increasing the effectiveness of transparent huge +# pages. It also reduces the possibility of seeing performance drop +# due to heap-growing GC events, where a decrease in available page +# cache leads to an increase in mean IO response time. +# Try reducing the heap memory, if this flag degrades performance. +dbms.jvm.additional=-XX:+AlwaysPreTouch + +# Trust that non-static final fields are really final. +# This allows more optimisations and improves overall performance. +# NOTE: Disable this if you use embedded mode, or have extensions or depencies that may use reflection or serialization +# to change the value of final fields! +dbms.jvm.additional=-XX:+UnlockExperimentalVMOptions +dbms.jvm.additional=-XX:+TrustFinalNonStaticFields + +# Disable explicit garbage collection, which is occasionally invoked by the JDK itself. +dbms.jvm.additional=-XX:+DisableExplicitGC + +# Remote JMX monitoring, uncomment and adjust the following lines as needed. +# Also make sure to update the jmx.access and jmx.password files with appropriate permission roles and passwords, +# the shipped configuration contains only a read only role called 'monitor' with password 'Neo4j'. +# For more details, see: http://download.oracle.com/javase/8/docs/technotes/guides/management/agent.html +# On Unix based systems the jmx.password file needs to be owned by the user that will run the server, +# and have permissions set to 0600. +# For details on setting these file permissions on Windows see: +# http://docs.oracle.com/javase/8/docs/technotes/guides/management/security-windows.html +#dbms.jvm.additional=-Dcom.sun.management.jmxremote.port=3637 +#dbms.jvm.additional=-Dcom.sun.management.jmxremote.authenticate=true +#dbms.jvm.additional=-Dcom.sun.management.jmxremote.ssl=false +#dbms.jvm.additional=-Dcom.sun.management.jmxremote.password.file=conf/jmx.password +#dbms.jvm.additional=-Dcom.sun.management.jmxremote.access.file=conf/jmx.access + +# Some systems cannot discover host name automatically, and need this line configured: +#dbms.jvm.additional=-Djava.rmi.server.hostname=$THE_NEO4J_SERVER_HOSTNAME + +#******************************************************************** +# Wrapper Windows NT/2000/XP Service Properties +#******************************************************************** +# WARNING - Do not modify any of these properties when an application +# using this configuration file has been installed as a service. +# Please uninstall the service before modifying this section. The +# service can then be reinstalled. + +# Name of the service +dbms.windows_service_name=neo4j + +#******************************************************************** +# Other Neo4j system properties +#******************************************************************** +dbms.jvm.additional=-Dunsupported.dbms.udc.source=tarball diff --git a/roles/neo4j-cluster/templates/neo4j.conf.arbiter.j2 b/roles/neo4j-cluster/templates/neo4j.conf.arbiter.j2 new file mode 100644 index 0000000..73f2a9f --- /dev/null +++ b/roles/neo4j-cluster/templates/neo4j.conf.arbiter.j2 @@ -0,0 +1,242 @@ +#***************************************************************** +# Neo4j configuration +#***************************************************************** + +# The name of the database to mount +#dbms.active_database=graph.db + +# Paths of directories in the installation. +#dbms.directories.data=data +#dbms.directories.plugins=plugins +#dbms.directories.certificates=certificates + +# This setting constrains all `LOAD CSV` import files to be under the `import` directory. Remove or uncomment it to +# allow files to be loaded from anywhere in filesystem; this introduces possible security problems. See the `LOAD CSV` +# section of the manual for details. +dbms.directories.import=import + +# Whether requests to Neo4j are authenticated. +# To disable authentication, uncomment this line +dbms.security.auth_enabled=false + +# Enable this to be able to upgrade a store from an older version. +#dbms.allow_format_migration=true + +# The amount of memory to use for mapping the store files, in bytes (or +# kilobytes with the 'k' suffix, megabytes with 'm' and gigabytes with 'g'). +# If Neo4j is running on a dedicated server, then it is generally recommended +# to leave about 2-4 gigabytes for the operating system, give the JVM enough +# heap to hold all your transaction state and query context, and then leave the +# rest for the page cache. +# The default page cache memory assumes the machine is dedicated to running +# Neo4j, and is heuristically set to 50% of RAM minus the max Java heap size. +dbms.memory.pagecache.size=1g + +# Enable online backups to be taken from this database. +dbms.backup.enabled={{dbms_backup_enabled}} + +# To allow remote backups, uncomment this line: +dbms.backup.address={{dbms_backup_address}} + +#***************************************************************** +# Network connector configuration +#***************************************************************** + +# Bolt connector +dbms.connector.bolt.type=BOLT +dbms.connector.bolt.enabled=true +dbms.connector.bolt.tls_level=OPTIONAL +# To have Bolt accept non-local connections, uncomment this line +dbms.connector.bolt.address={{dbms_connector_bolt_address}} + +# HTTP Connector +dbms.connector.http.type=HTTP +dbms.connector.http.enabled=true +# To accept non-local HTTP connections, uncomment this line +dbms.connector.http.address={{dbms_connector_http_address}} + +# HTTPS Connector +dbms.connector.https.type=HTTP +dbms.connector.https.enabled=true +dbms.connector.https.encryption=TLS +# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0' +dbms.connector.https.address={{dbms_connector_https_address}} + +# Number of Neo4j worker threads. +#dbms.threads.worker_count= + +#***************************************************************** +# Logging configuration +#***************************************************************** + +# To enable HTTP logging, uncomment this line +#dbms.logs.http.enabled=true + +# Number of HTTP logs to keep. +#dbms.logs.http.rotation.keep_number=5 + +# Size of each HTTP log that is kept. +#dbms.logs.http.rotation.size=20m + +# To enable GC Logging, uncomment this line +dbms.logs.gc.enabled=true + +# GC Logging Options +# see http://docs.oracle.com/cd/E19957-01/819-0084-10/pt_tuningjava.html#wp57013 for more information. +dbms.logs.gc.options=-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution + +# Number of GC logs to keep. +dbms.logs.gc.rotation.keep_number=5 + +# Size of each GC log that is kept. +dbms.logs.gc.rotation.size=20m + +# Size threshold for rotation of the debug log. If set to zero then no rotation will occur. Accepts a binary suffix "k", +# "m" or "g". +#dbms.logs.debug.rotation.size=20m + +# Maximum number of history files for the internal log. +#dbms.logs.debug.rotation.keep_number=7 + +# To enable Query Log, To Log executed queries that take longer than the configured threshold. +dbms.logs.query.enabled=true + +# To Log parameters for executed queries that take longer than the configured threshold. +dbms.logs.query.parameter_logging_enabled=true + +# Number of Query logs to keep. +dbms.logs.query.rotation.keep_number=7 + +# Size of each Query log that is kept. +dbms.logs.query.rotation.size=200M + +# If the execution of query takes more time than this threshold, the query is logged - provided query logging is enabled. Defaults to 0 seconds, that is all queries are logged. +dbms.logs.query.threshold=1 + +# To log detailed time information for the executed queries being logged. +dbms.logs.query.time_logging_enabled=true + +# To log page hits and page faults for the executed queries being logged. +dbms.logs.query.page_logging_enabled=true + +#***************************************************************** +# HA configuration +#***************************************************************** + +# Uncomment and specify these lines for running Neo4j in High Availability mode. +# See the High availability setup tutorial for more details on these settings +# http://neo4j.com/docs/operations-manual/current/#tutorials + +# Database mode +# Allowed values: +# HA - High Availability +# SINGLE - Single mode, default. +# To run in High Availability mode uncomment this line: +dbms.mode={{dbms_mode}} + +# ha.server_id is the number of each instance in the HA cluster. It should be +# an integer (e.g. 1), and should be unique for each cluster instance. +ha.server_id={{server_id}} + +# ha.initial_hosts is a comma-separated list (without spaces) of the host:port +# where the ha.host.coordination of all instances will be listening. Typically +# this will be the same for all cluster instances. +ha.initial_hosts={{initial_hosts}} +# IP and port for this instance to listen on, for communicating cluster status +# information iwth other instances (also see ha.initial_hosts). The IP +# must be the configured IP address for one of the local interfaces. +ha.host.coordination={{host_coordination}} + +# IP and port for this instance to listen on, for communicating transaction +# data with other instances (also see ha.initial_hosts). The IP +# must be the configured IP address for one of the local interfaces. +ha.host.data={{ha_host_data}} + +# The interval at which slaves will pull updates from the master. Comment out +# the option to disable periodic pulling of updates. Unit is seconds. +ha.pull_interval=10 + +# Amount of slaves the master will try to push a transaction to upon commit +# (default is 1). The master will optimistically continue and not fail the +# transaction even if it fails to reach the push factor. Setting this to 0 will +# increase write performance when writing through master but could potentially +# lead to branched data (or loss of transaction) if the master goes down. +#ha.tx_push_factor=1 + +# Strategy the master will use when pushing data to slaves (if the push factor +# is greater than 0). There are three options available "fixed_ascending" (default), +# "fixed_descending" or "round_robin". Fixed strategies will start by pushing to +# slaves ordered by server id (accordingly with qualifier) and are useful when +# planning for a stable fail-over based on ids. +#ha.tx_push_strategy=fixed_ascending + +# Policy for how to handle branched data. +#ha.branched_data_policy=keep_all + +# How often heartbeat messages should be sent. Defaults to ha.default_timeout. +#ha.heartbeat_interval=5s + +# Timeout for heartbeats between cluster members. Should be at least twice that of ha.heartbeat_interval. +#ha.heartbeat_timeout=11s + +# If you are using a load-balancer that doesn't support HTTP Auth, you may need to turn off authentication for the +# HA HTTP status endpoint by uncommenting the following line. +dbms.security.ha_status_auth_enabled=false + +# Whether this instance should only participate as slave in cluster. If set to +# true, it will never be elected as master. +#ha.slave_only=false + +#***************************************************************** +# Miscellaneous configuration +#***************************************************************** + +# Enable this to specify a parser other than the default one. +#cypher.default_language_version=3.0 + +# Determines if Cypher will allow using file URLs when loading data using +# `LOAD CSV`. Setting this value to `false` will cause Neo4j to fail `LOAD CSV` +# clauses that load data from the file system. +#dbms.security.allow_csv_import_from_file_urls=true + +# Retention policy for transaction logs needed to perform recovery and backups. +#dbms.tx_log.rotation.retention_policy=7 days + +# Limit the number of IOs the background checkpoint process will consume per second. +# This setting is advisory, is ignored in Neo4j Community Edition, and is followed to +# best effort in Enterprise Edition. +# An IO is in this case a 8 KiB (mostly sequential) write. Limiting the write IO in +# this way will leave more bandwidth in the IO subsystem to service random-read IOs, +# which is important for the response time of queries when the database cannot fit +# entirely in memory. The only drawback of this setting is that longer checkpoint times +# may lead to slightly longer recovery times in case of a database or system crash. +# A lower number means lower IO pressure, and consequently longer checkpoint times. +# The configuration can also be commented out to remove the limitation entirely, and +# let the checkpointer flush data as fast as the hardware will go. +# Set this to -1 to disable the IOPS limit. +# dbms.checkpoint.iops.limit=1000 + +# Enable a remote shell server which Neo4j Shell clients can log in to. +#dbms.shell.enabled=true +# The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). +#dbms.shell.host=127.0.0.1 +# The port the shell will listen on, default is 1337. +#dbms.shell.port=1337 + +# Only allow read operations from this Neo4j instance. This mode still requires +# write access to the directory for lock purposes. +#dbms.read_only=false + +# Comma separated list of JAX-RS packages containing JAX-RS resources, one +# package name for each mountpoint. The listed package names will be loaded +# under the mountpoints specified. Uncomment this line to mount the +# org.neo4j.examples.server.unmanaged.HelloWorldResource.java from +# neo4j-server-examples under /examples/unmanaged, resulting in a final URL of +# http://localhost:7474/examples/unmanaged/helloworld/{nodeId} +#dbms.unmanaged_extension_classes=org.neo4j.examples.server.unmanaged=/examples/unmanaged + +# Specified comma separated list of id types (like node or relationship) that should be reused. +# When some type is specified database will try to reuse corresponding ids as soon as it will be safe to do so. +# Currently only 'node' and 'relationship' types are supported. +# This settings is ignored in Neo4j Community Edition. +#dbms.ids.reuse.types.override=node,relationship diff --git a/roles/neo4j-cluster/templates/neo4j.conf.j2 b/roles/neo4j-cluster/templates/neo4j.conf.j2 new file mode 100644 index 0000000..c8ad01f --- /dev/null +++ b/roles/neo4j-cluster/templates/neo4j.conf.j2 @@ -0,0 +1,264 @@ +#***************************************************************** +# Neo4j configuration +#***************************************************************** + +# The name of the database to mount +#dbms.active_database=graph.db + +# Paths of directories in the installation. +#dbms.directories.data=data +#dbms.directories.plugins=plugins +#dbms.directories.certificates=certificates + +# This setting constrains all `LOAD CSV` import files to be under the `import` directory. Remove or uncomment it to +# allow files to be loaded from anywhere in filesystem; this introduces possible security problems. See the `LOAD CSV` +# section of the manual for details. +dbms.directories.import=import + +# Whether requests to Neo4j are authenticated. +# To disable authentication, uncomment this line +dbms.security.auth_enabled=false + +# Enable this to be able to upgrade a store from an older version. +#dbms.allow_format_migration=true + +# The amount of memory to use for mapping the store files, in bytes (or +# kilobytes with the 'k' suffix, megabytes with 'm' and gigabytes with 'g'). +# If Neo4j is running on a dedicated server, then it is generally recommended +# to leave about 2-4 gigabytes for the operating system, give the JVM enough +# heap to hold all your transaction state and query context, and then leave the +# rest for the page cache. +# The default page cache memory assumes the machine is dedicated to running +# Neo4j, and is heuristically set to 50% of RAM minus the max Java heap size. +dbms.memory.pagecache.size={{dbms_memory_pagecache_size}} + +# Enable online backups to be taken from this database. +dbms.backup.enabled={{dbms_backup_enabled}} + +# To allow remote backups, uncomment this line: +dbms.backup.address={{dbms_backup_address}} + +#***************************************************************** +# Network connector configuration +#***************************************************************** + +# Bolt connector +dbms.connector.bolt.type=BOLT +dbms.connector.bolt.enabled=true +dbms.connector.bolt.tls_level=OPTIONAL +# To have Bolt accept non-local connections, uncomment this line +dbms.connector.bolt.address={{dbms_connector_bolt_address}} + +# HTTP Connector +dbms.connector.http.type=HTTP +dbms.connector.http.enabled=true +# To accept non-local HTTP connections, uncomment this line +dbms.connector.http.address={{dbms_connector_http_address}} + +# HTTPS Connector +dbms.connector.https.type=HTTP +dbms.connector.https.enabled=true +dbms.connector.https.encryption=TLS +# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0' +dbms.connector.https.address={{dbms_connector_https_address}} + +# Number of Neo4j worker threads. +#dbms.threads.worker_count= + +#***************************************************************** +# Logging configuration +#***************************************************************** + +# To enable HTTP logging, uncomment this line +#dbms.logs.http.enabled=true + +# Number of HTTP logs to keep. +#dbms.logs.http.rotation.keep_number=5 + +# Size of each HTTP log that is kept. +#dbms.logs.http.rotation.size=20m + +# To enable GC Logging, uncomment this line +dbms.logs.gc.enabled=true + +# GC Logging Options +# see http://docs.oracle.com/cd/E19957-01/819-0084-10/pt_tuningjava.html#wp57013 for more information. +dbms.logs.gc.options=-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution + +# Number of GC logs to keep. +dbms.logs.gc.rotation.keep_number=5 + +# Size of each GC log that is kept. +dbms.logs.gc.rotation.size=20m + +# Size threshold for rotation of the debug log. If set to zero then no rotation will occur. Accepts a binary suffix "k", +# "m" or "g". +#dbms.logs.debug.rotation.size=20m + +# Maximum number of history files for the internal log. +#dbms.logs.debug.rotation.keep_number=7 + +# To enable Query Log, To Log executed queries that take longer than the configured threshold. +dbms.logs.query.enabled=true + +# To Log parameters for executed queries that take longer than the configured threshold. +dbms.logs.query.parameter_logging_enabled=true + +# Number of Query logs to keep. +dbms.logs.query.rotation.keep_number=7 + +# Size of each Query log that is kept. +dbms.logs.query.rotation.size=200M + +# If the execution of query takes more time than this threshold, the query is logged - provided query logging is enabled. Defaults to 0 seconds, that is all queries are logged. +dbms.logs.query.threshold=1 + +# To log detailed time information for the executed queries being logged. +dbms.logs.query.time_logging_enabled=true + +# To log page hits and page faults for the executed queries being logged. +dbms.logs.query.page_logging_enabled=true + +#***************************************************************** +# HA configuration +#***************************************************************** + +# Uncomment and specify these lines for running Neo4j in High Availability mode. +# See the High availability setup tutorial for more details on these settings +# http://neo4j.com/docs/operations-manual/current/#tutorials + +# Database mode +# Allowed values: +# HA - High Availability +# SINGLE - Single mode, default. +# To run in High Availability mode uncomment this line: +dbms.mode={{dbms_mode}} + +# ha.server_id is the number of each instance in the HA cluster. It should be +# an integer (e.g. 1), and should be unique for each cluster instance. +ha.server_id={{server_id}} + +# ha.initial_hosts is a comma-separated list (without spaces) of the host:port +# where the ha.host.coordination of all instances will be listening. Typically +# this will be the same for all cluster instances. +ha.initial_hosts={{initial_hosts}} +# IP and port for this instance to listen on, for communicating cluster status +# information iwth other instances (also see ha.initial_hosts). The IP +# must be the configured IP address for one of the local interfaces. +ha.host.coordination={{host_coordination}} + +# IP and port for this instance to listen on, for communicating transaction +# data with other instances (also see ha.initial_hosts). The IP +# must be the configured IP address for one of the local interfaces. +ha.host.data={{ha_host_data}} + +# The interval at which slaves will pull updates from the master. Comment out +# the option to disable periodic pulling of updates. Unit is seconds. +ha.pull_interval=10 + +# Amount of slaves the master will try to push a transaction to upon commit +# (default is 1). The master will optimistically continue and not fail the +# transaction even if it fails to reach the push factor. Setting this to 0 will +# increase write performance when writing through master but could potentially +# lead to branched data (or loss of transaction) if the master goes down. +#ha.tx_push_factor=1 + +# Strategy the master will use when pushing data to slaves (if the push factor +# is greater than 0). There are three options available "fixed_ascending" (default), +# "fixed_descending" or "round_robin". Fixed strategies will start by pushing to +# slaves ordered by server id (accordingly with qualifier) and are useful when +# planning for a stable fail-over based on ids. +#ha.tx_push_strategy=fixed_ascending + +# Policy for how to handle branched data. +#ha.branched_data_policy=keep_all + +# How often heartbeat messages should be sent. Defaults to ha.default_timeout. +#ha.heartbeat_interval=5s + +# Timeout for heartbeats between cluster members. Should be at least twice that of ha.heartbeat_interval. +#ha.heartbeat_timeout=11s + +# If you are using a load-balancer that doesn't support HTTP Auth, you may need to turn off authentication for the +# HA HTTP status endpoint by uncommenting the following line. +dbms.security.ha_status_auth_enabled=false + +# Whether this instance should only participate as slave in cluster. If set to +# true, it will never be elected as master. +#ha.slave_only=false + +#***************************************************************** +# Miscellaneous configuration +#***************************************************************** + +# Enable this to specify a parser other than the default one. +#cypher.default_language_version=3.0 + +# Determines if Cypher will allow using file URLs when loading data using +# `LOAD CSV`. Setting this value to `false` will cause Neo4j to fail `LOAD CSV` +# clauses that load data from the file system. +#dbms.security.allow_csv_import_from_file_urls=true + +# Retention policy for transaction logs needed to perform recovery and backups. +#dbms.tx_log.rotation.retention_policy=7 days + +# Limit the number of IOs the background checkpoint process will consume per second. +# This setting is advisory, is ignored in Neo4j Community Edition, and is followed to +# best effort in Enterprise Edition. +# An IO is in this case a 8 KiB (mostly sequential) write. Limiting the write IO in +# this way will leave more bandwidth in the IO subsystem to service random-read IOs, +# which is important for the response time of queries when the database cannot fit +# entirely in memory. The only drawback of this setting is that longer checkpoint times +# may lead to slightly longer recovery times in case of a database or system crash. +# A lower number means lower IO pressure, and consequently longer checkpoint times. +# The configuration can also be commented out to remove the limitation entirely, and +# let the checkpointer flush data as fast as the hardware will go. +# Set this to -1 to disable the IOPS limit. +# dbms.checkpoint.iops.limit=1000 + +# Enable a remote shell server which Neo4j Shell clients can log in to. +#dbms.shell.enabled=true +# The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). +#dbms.shell.host=127.0.0.1 +# The port the shell will listen on, default is 1337. +dbms.shell.port={{neo4j_dbms_shell_port}} +# Only allow read operations from this Neo4j instance. This mode still requires +# write access to the directory for lock purposes. +#dbms.read_only=false + +# Comma separated list of JAX-RS packages containing JAX-RS resources, one +# package name for each mountpoint. The listed package names will be loaded +# under the mountpoints specified. Uncomment this line to mount the +# org.neo4j.examples.server.unmanaged.HelloWorldResource.java from +# neo4j-server-examples under /examples/unmanaged, resulting in a final URL of +# http://localhost:7474/examples/unmanaged/helloworld/{nodeId} +#dbms.unmanaged_extension_classes=org.neo4j.examples.server.unmanaged=/examples/unmanaged + +# Specified comma separated list of id types (like node or relationship) that should be reused. +# When some type is specified database will try to reuse corresponding ids as soon as it will be safe to do so. +# Currently only 'node' and 'relationship' types are supported. +# This settings is ignored in Neo4j Community Edition. +#dbms.ids.reuse.types.override=node,relationship + +#Neo4j -Metrics Configurations +# Setting for enabling all supported metrics. +metrics.enabled=true +# Setting for enabling all Neo4j specific metrics. +metrics.neo4j.enabled=true +#Setting for exposing metrics about transactions; number of transactions started, committed, etc. +metrics.neo4j.tx.enabled=true +# Setting for exposing metrics about the Neo4j page cache; page faults, evictions, flushes and exceptions, etc. +metrics.neo4j.pagecache.enabled=true +# Setting for exposing metrics about approximately entities are in the database; nodes, relationships, properties, etc. +metrics.neo4j.counts.enabled=true +# Setting for exposing metrics about the network usage of the HA cluster component. +metrics.neo4j.network.enabled=true +# Enable the Graphite integration. Default is 'false'. +metrics.graphite.enabled=true +# The IP and port of the Graphite server on the format :. +# The default port number for Graphite is 2003. +metrics.graphite.server=10.32.6.7:8746 +# How often to send data. Default is 1 minute. +metrics.graphite.interval=1m +# Prefix for Neo4j metrics on Graphite server. +metrics.prefix={{ instance }}-{{ product }}_team-{{ neo4j_dir }}-{{ server_id }} \ No newline at end of file diff --git a/roles/neo4j-deploy/defaults/main.yml b/roles/neo4j-deploy/defaults/main.yml new file mode 100644 index 0000000..dcbe89a --- /dev/null +++ b/roles/neo4j-deploy/defaults/main.yml @@ -0,0 +1,11 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} +logstash_version: 6.3.1 +neo4j_dir: neo4j-learning +neo4j_home: "{{learner_user_home}}/{{neo4j_dir}}/neo4j-enterprise-3.3.0" +graphevent_kafka_url: "{{groups['processing-cluster-zookeepers']|join(':9092,')}}:9092" +graphevent_kafka_topic_id: "{{env}}.learning.graph.events" +backend_event_topic_id: "{{env}}.telemetry.backend" + +zip_file: #learning-graphextension jar file +custom_procs_file: # custom-procedures jar file \ No newline at end of file diff --git a/roles/neo4j-deploy/tasks/main.yml b/roles/neo4j-deploy/tasks/main.yml new file mode 100644 index 0000000..b6f25e3 --- /dev/null +++ b/roles/neo4j-deploy/tasks/main.yml @@ -0,0 +1,24 @@ + +- name: Stop logstash process + become: yes + systemd: name=logstash state=stopped + ignore_errors: yes + +- name: Copy logstash configuration files for platform + become: yes + become_user: "{{learner_user}}" + template: src=logstash-lp.j2 dest={{learner_user_home}}/logstash-{{logstash_version}}/logstash-lp.conf + +- name: Copy the kernel extension jar file + become: yes + become_user: "{{learner_user}}" + copy: src={{ zip_file }} dest={{ neo4j_home }}/plugins/ owner={{ learner_user }} group={{ learner_user }} + +- name: Copy the custom procedures jar file + become: yes + become_user: "{{learner_user}}" + copy: src={{ custom_procs_file }} dest={{ neo4j_home }}/plugins/ owner={{ learner_user }} group={{ learner_user }} + +- name: Start logstash process + become: yes + systemd: name=logstash state=started diff --git a/roles/neo4j-deploy/templates/logstash-lp.j2 b/roles/neo4j-deploy/templates/logstash-lp.j2 new file mode 100644 index 0000000..082fb5e --- /dev/null +++ b/roles/neo4j-deploy/templates/logstash-lp.j2 @@ -0,0 +1,91 @@ + +input { + file { + type => "backend_event" + path => ["/data/logs/learning_telemetry_event_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/language_telemetry_event_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/config_telemetry_event_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/search_telemetry_event_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/learning_service_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/language_service_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/config_service_mw.log"] + } + file { + type => "backend_event" + path => ["/data/logs/search_service_mw.log"] + } + file { + type => "graph_event" + path => ["/data/logs/learning_graph_event_sync.log"] + } + file { + type => "graph_event" + path => ["/data/logs/learning_graph_event_mw.log"] + } + file { + type => "graph_event" + path => ["/data/logs/language_graph_event_mw.log"] + } + file { + type => "graph_event" + path => ["/data/logs/learning_graph_event_neo4j.log"] + } + file { + type => "graph_event" + path => ["/data/logs/language_graph_event_neo4j.log"] + } +} + +filter { + grok { + match => [ "message", + "%{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:msg}"] + } + mutate { + gsub => [ "message","%{timestamp}","" ] + strip => [ "message" ] + } +} + + +output { + if [type] == "backend_event" { + kafka { + bootstrap_servers => "{{ graphevent_kafka_url }}" + codec => plain { + format => "%{message}" + } + topic_id => "{{ backend_event_topic_id }}" + retries => 20 + retry_backoff_ms => 180000 + } + } else if [type] == "graph_event" { + kafka { + bootstrap_servers => "{{ graphevent_kafka_url }}" + codec => plain { + format => "%{message}" + } + topic_id => "{{ graphevent_kafka_topic_id }}" + retries => 20 + retry_backoff_ms => 180000 + } + } +} \ No newline at end of file diff --git a/roles/redis/defaults/main.yml b/roles/redis/defaults/main.yml new file mode 100644 index 0000000..0cd2c94 --- /dev/null +++ b/roles/redis/defaults/main.yml @@ -0,0 +1,4 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} +redis_home: "{{learner_user_home}}/redis-stable" +redis_tar_ball: http://download.redis.io/releases/redis-stable.tar.gz \ No newline at end of file diff --git a/roles/redis/tasks/main.yml b/roles/redis/tasks/main.yml new file mode 100755 index 0000000..d06b989 --- /dev/null +++ b/roles/redis/tasks/main.yml @@ -0,0 +1,45 @@ +--- +# tasks file for redis +- name: download redis zipfile + become: yes + become_user: "{{learner_user}}" + get_url: url={{redis_tar_ball}} dest={{learner_user_home}}/redis-stable.tar.gz timeout=50 force=no owner={{learner_user}} + +- name: unzip + become: yes + become_user: "{{learner_user}}" + unarchive: src={{learner_user_home}}/redis-stable.tar.gz dest={{learner_user_home}} copy=no group={{learner_user}} owner={{learner_user}} creates={{ redis_home }} + +- name: Change ownership of redis installation + become: yes + file: path={{ redis_home }} owner={{learner_user}} group={{learner_user}} state=directory recurse=yes + +- name: redis conf + become: yes + template: src=redis.conf.j2 dest={{learner_user_home}}/redis-stable/redis.conf + + +- name: Go to the folder and run make + become: yes + become_user: "{{learner_user}}" + command: chdir={{ redis_home }} make + +- name: copy template + become: yes + become_user: "{{learner_user}}" + template: src=stop_script.j2 dest={{ learner_user_home }}/stop_script.sh group={{learner_user}} owner={{learner_user}} mode=0775 + +- name: run script + become: yes + become_user: "{{learner_user}}" + shell: sh {{ learner_user_home }}/stop_script.sh + +- name: start redis + become: yes + become_user: "{{learner_user}}" + shell: nohup src/redis-server --protected-mode no & + args: + chdir: "{{learner_user_home}}/redis-stable/" + async: 60 + poll: 60 + diff --git a/roles/redis/templates/redis.conf.j2 b/roles/redis/templates/redis.conf.j2 new file mode 100644 index 0000000..2864274 --- /dev/null +++ b/roles/redis/templates/redis.conf.j2 @@ -0,0 +1,1023 @@ +# Redis configuration file example. +# +# Note that in order to read the configuration file, Redis must be +# started with the file path as first argument: +# +# ./redis-server /path/to/redis.conf + +# Note on units: when memory size is needed, it is possible to specify +# it in the usual form of 1k 5GB 4M and so forth: +# +# 1k => 1000 bytes +# 1kb => 1024 bytes +# 1m => 1000000 bytes +# 1mb => 1024*1024 bytes +# 1g => 1000000000 bytes +# 1gb => 1024*1024*1024 bytes +# +# units are case insensitive so 1GB 1Gb 1gB are all the same. + +################################## INCLUDES ################################### + +# Include one or more other config files here. This is useful if you +# have a standard template that goes to all Redis servers but also need +# to customize a few per-server settings. Include files can include +# other files, so use this wisely. +# +# Notice option "include" won't be rewritten by command "CONFIG REWRITE" +# from admin or Redis Sentinel. Since Redis always uses the last processed +# line as value of a configuration directive, you'd better put includes +# at the beginning of this file to avoid overwriting config change at runtime. +# +# If instead you are interested in using includes to override configuration +# options, it is better to use include as the last line. +# +# include /path/to/local.conf +# include /path/to/other.conf + +################################## NETWORK ##################################### + +# By default, if no "bind" configuration directive is specified, Redis listens +# for connections from all the network interfaces available on the server. +# It is possible to listen to just one or multiple selected interfaces using +# the "bind" configuration directive, followed by one or more IP addresses. +# +# Examples: +# +# bind 192.168.1.100 10.0.0.1 +# bind 127.0.0.1 ::1 +# +# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the +# internet, binding to all the interfaces is dangerous and will expose the +# instance to everybody on the internet. So by default we uncomment the +# following bind directive, that will force Redis to listen only into +# the IPv4 lookback interface address (this means Redis will be able to +# accept connections only from clients running into the same computer it +# is running). +# +# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES +# JUST COMMENT THE FOLLOWING LINE. +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# bind 127.0.0.1 + +# Protected mode is a layer of security protection, in order to avoid that +# Redis instances left open on the internet are accessed and exploited. +# +# When protected mode is on and if: +# +# 1) The server is not binding explicitly to a set of addresses using the +# "bind" directive. +# 2) No password is configured. +# +# The server only accepts connections from clients connecting from the +# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain +# sockets. +# +# By default protected mode is enabled. You should disable it only if +# you are sure you want clients from other hosts to connect to Redis +# even if no authentication is configured, nor a specific set of interfaces +# are explicitly listed using the "bind" directive. +protected-mode no + +# Accept connections on the specified port, default is 6379 (IANA #815344). +# If port 0 is specified Redis will not listen on a TCP socket. +port 6379 + +# TCP listen() backlog. +# +# In high requests-per-second environments you need an high backlog in order +# to avoid slow clients connections issues. Note that the Linux kernel +# will silently truncate it to the value of /proc/sys/net/core/somaxconn so +# make sure to raise both the value of somaxconn and tcp_max_syn_backlog +# in order to get the desired effect. +tcp-backlog 511 + +# Unix socket. +# +# Specify the path for the Unix socket that will be used to listen for +# incoming connections. There is no default, so Redis will not listen +# on a unix socket when not specified. +# +# unixsocket /tmp/redis.sock +# unixsocketperm 700 + +# Close the connection after a client is idle for N seconds (0 to disable) +timeout 0 + +# TCP keepalive. +# +# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence +# of communication. This is useful for two reasons: +# +# 1) Detect dead peers. +# 2) Take the connection alive from the point of view of network +# equipment in the middle. +# +# On Linux, the specified value (in seconds) is the period used to send ACKs. +# Note that to close the connection the double of the time is needed. +# On other kernels the period depends on the kernel configuration. +# +# A reasonable value for this option is 300 seconds, which is the new +# Redis default starting with Redis 3.2.1. +tcp-keepalive 300 + +################################# GENERAL ##################################### + +# By default Redis does not run as a daemon. Use 'yes' if you need it. +# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. +daemonize no + +# If you run Redis from upstart or systemd, Redis can interact with your +# supervision tree. Options: +# supervised no - no supervision interaction +# supervised upstart - signal upstart by putting Redis into SIGSTOP mode +# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET +# supervised auto - detect upstart or systemd method based on +# UPSTART_JOB or NOTIFY_SOCKET environment variables +# Note: these supervision methods only signal "process is ready." +# They do not enable continuous liveness pings back to your supervisor. +supervised no + +# If a pid file is specified, Redis writes it where specified at startup +# and removes it at exit. +# +# When the server runs non daemonized, no pid file is created if none is +# specified in the configuration. When the server is daemonized, the pid file +# is used even if not specified, defaulting to "/var/run/redis.pid". +# +# Creating a pid file is best effort: if Redis is not able to create it +# nothing bad happens, the server will start and run normally. +pidfile /var/run/redis_6379.pid + +# Specify the server verbosity level. +# This can be one of: +# debug (a lot of information, useful for development/testing) +# verbose (many rarely useful info, but not a mess like the debug level) +# notice (moderately verbose, what you want in production probably) +# warning (only very important / critical messages are logged) +loglevel notice + +# Specify the log file name. Also the empty string can be used to force +# Redis to log on the standard output. Note that if you use standard +# output for logging but daemonize, logs will be sent to /dev/null +logfile "" + +# To enable logging to the system logger, just set 'syslog-enabled' to yes, +# and optionally update the other syslog parameters to suit your needs. +# syslog-enabled no + +# Specify the syslog identity. +# syslog-ident redis + +# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. +# syslog-facility local0 + +# Set the number of databases. The default database is DB 0, you can select +# a different one on a per-connection basis using SELECT where +# dbid is a number between 0 and 'databases'-1 +databases 16 + +################################ SNAPSHOTTING ################################ +# +# Save the DB on disk: +# +# save +# +# Will save the DB if both the given number of seconds and the given +# number of write operations against the DB occurred. +# +# In the example below the behaviour will be to save: +# after 900 sec (15 min) if at least 1 key changed +# after 300 sec (5 min) if at least 10 keys changed +# after 60 sec if at least 10000 keys changed +# +# Note: you can disable saving completely by commenting out all "save" lines. +# +# It is also possible to remove all the previously configured save +# points by adding a save directive with a single empty string argument +# like in the following example: +# +# save "" + +save 900 1 +save 300 10 +save 60 10000 + +# By default Redis will stop accepting writes if RDB snapshots are enabled +# (at least one save point) and the latest background save failed. +# This will make the user aware (in a hard way) that data is not persisting +# on disk properly, otherwise chances are that no one will notice and some +# disaster will happen. +# +# If the background saving process will start working again Redis will +# automatically allow writes again. +# +# However if you have setup your proper monitoring of the Redis server +# and persistence, you may want to disable this feature so that Redis will +# continue to work as usual even if there are problems with disk, +# permissions, and so forth. +stop-writes-on-bgsave-error yes + +# Compress string objects using LZF when dump .rdb databases? +# For default that's set to 'yes' as it's almost always a win. +# If you want to save some CPU in the saving child set it to 'no' but +# the dataset will likely be bigger if you have compressible values or keys. +rdbcompression yes + +# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. +# This makes the format more resistant to corruption but there is a performance +# hit to pay (around 10%) when saving and loading RDB files, so you can disable it +# for maximum performances. +# +# RDB files created with checksum disabled have a checksum of zero that will +# tell the loading code to skip the check. +rdbchecksum yes + +# The filename where to dump the DB +dbfilename dump.rdb + +# The working directory. +# +# The DB will be written inside this directory, with the filename specified +# above using the 'dbfilename' configuration directive. +# +# The Append Only File will also be created inside this directory. +# +# Note that you must specify a directory here, not a file name. +dir "{{learner_user}}/redis-stable/" + +################################# REPLICATION ################################# + +# Master-Slave replication. Use slaveof to make a Redis instance a copy of +# another Redis server. A few things to understand ASAP about Redis replication. +# +# 1) Redis replication is asynchronous, but you can configure a master to +# stop accepting writes if it appears to be not connected with at least +# a given number of slaves. +# 2) Redis slaves are able to perform a partial resynchronization with the +# master if the replication link is lost for a relatively small amount of +# time. You may want to configure the replication backlog size (see the next +# sections of this file) with a sensible value depending on your needs. +# 3) Replication is automatic and does not need user intervention. After a +# network partition slaves automatically try to reconnect to masters +# and resynchronize with them. +# +# slaveof + +# If the master is password protected (using the "requirepass" configuration +# directive below) it is possible to tell the slave to authenticate before +# starting the replication synchronization process, otherwise the master will +# refuse the slave request. +# +# masterauth + +# When a slave loses its connection with the master, or when the replication +# is still in progress, the slave can act in two different ways: +# +# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will +# still reply to client requests, possibly with out of date data, or the +# data set may just be empty if this is the first synchronization. +# +# 2) if slave-serve-stale-data is set to 'no' the slave will reply with +# an error "SYNC with master in progress" to all the kind of commands +# but to INFO and SLAVEOF. +# +slave-serve-stale-data yes + +# You can configure a slave instance to accept writes or not. Writing against +# a slave instance may be useful to store some ephemeral data (because data +# written on a slave will be easily deleted after resync with the master) but +# may also cause problems if clients are writing to it because of a +# misconfiguration. +# +# Since Redis 2.6 by default slaves are read-only. +# +# Note: read only slaves are not designed to be exposed to untrusted clients +# on the internet. It's just a protection layer against misuse of the instance. +# Still a read only slave exports by default all the administrative commands +# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve +# security of read only slaves using 'rename-command' to shadow all the +# administrative / dangerous commands. +slave-read-only yes + +# Replication SYNC strategy: disk or socket. +# +# ------------------------------------------------------- +# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY +# ------------------------------------------------------- +# +# New slaves and reconnecting slaves that are not able to continue the replication +# process just receiving differences, need to do what is called a "full +# synchronization". An RDB file is transmitted from the master to the slaves. +# The transmission can happen in two different ways: +# +# 1) Disk-backed: The Redis master creates a new process that writes the RDB +# file on disk. Later the file is transferred by the parent +# process to the slaves incrementally. +# 2) Diskless: The Redis master creates a new process that directly writes the +# RDB file to slave sockets, without touching the disk at all. +# +# With disk-backed replication, while the RDB file is generated, more slaves +# can be queued and served with the RDB file as soon as the current child producing +# the RDB file finishes its work. With diskless replication instead once +# the transfer starts, new slaves arriving will be queued and a new transfer +# will start when the current one terminates. +# +# When diskless replication is used, the master waits a configurable amount of +# time (in seconds) before starting the transfer in the hope that multiple slaves +# will arrive and the transfer can be parallelized. +# +# With slow disks and fast (large bandwidth) networks, diskless replication +# works better. +repl-diskless-sync no + +# When diskless replication is enabled, it is possible to configure the delay +# the server waits in order to spawn the child that transfers the RDB via socket +# to the slaves. +# +# This is important since once the transfer starts, it is not possible to serve +# new slaves arriving, that will be queued for the next RDB transfer, so the server +# waits a delay in order to let more slaves arrive. +# +# The delay is specified in seconds, and by default is 5 seconds. To disable +# it entirely just set it to 0 seconds and the transfer will start ASAP. +repl-diskless-sync-delay 5 + +# Slaves send PINGs to server in a predefined interval. It's possible to change +# this interval with the repl_ping_slave_period option. The default value is 10 +# seconds. +# +# repl-ping-slave-period 10 + +# The following option sets the replication timeout for: +# +# 1) Bulk transfer I/O during SYNC, from the point of view of slave. +# 2) Master timeout from the point of view of slaves (data, pings). +# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings). +# +# It is important to make sure that this value is greater than the value +# specified for repl-ping-slave-period otherwise a timeout will be detected +# every time there is low traffic between the master and the slave. +# +# repl-timeout 60 + +# Disable TCP_NODELAY on the slave socket after SYNC? +# +# If you select "yes" Redis will use a smaller number of TCP packets and +# less bandwidth to send data to slaves. But this can add a delay for +# the data to appear on the slave side, up to 40 milliseconds with +# Linux kernels using a default configuration. +# +# If you select "no" the delay for data to appear on the slave side will +# be reduced but more bandwidth will be used for replication. +# +# By default we optimize for low latency, but in very high traffic conditions +# or when the master and slaves are many hops away, turning this to "yes" may +# be a good idea. +repl-disable-tcp-nodelay no + +# Set the replication backlog size. The backlog is a buffer that accumulates +# slave data when slaves are disconnected for some time, so that when a slave +# wants to reconnect again, often a full resync is not needed, but a partial +# resync is enough, just passing the portion of data the slave missed while +# disconnected. +# +# The bigger the replication backlog, the longer the time the slave can be +# disconnected and later be able to perform a partial resynchronization. +# +# The backlog is only allocated once there is at least a slave connected. +# +# repl-backlog-size 1mb + +# After a master has no longer connected slaves for some time, the backlog +# will be freed. The following option configures the amount of seconds that +# need to elapse, starting from the time the last slave disconnected, for +# the backlog buffer to be freed. +# +# A value of 0 means to never release the backlog. +# +# repl-backlog-ttl 3600 + +# The slave priority is an integer number published by Redis in the INFO output. +# It is used by Redis Sentinel in order to select a slave to promote into a +# master if the master is no longer working correctly. +# +# A slave with a low priority number is considered better for promotion, so +# for instance if there are three slaves with priority 10, 100, 25 Sentinel will +# pick the one with priority 10, that is the lowest. +# +# However a special priority of 0 marks the slave as not able to perform the +# role of master, so a slave with priority of 0 will never be selected by +# Redis Sentinel for promotion. +# +# By default the priority is 100. +slave-priority 100 + +# It is possible for a master to stop accepting writes if there are less than +# N slaves connected, having a lag less or equal than M seconds. +# +# The N slaves need to be in "online" state. +# +# The lag in seconds, that must be <= the specified value, is calculated from +# the last ping received from the slave, that is usually sent every second. +# +# This option does not GUARANTEE that N replicas will accept the write, but +# will limit the window of exposure for lost writes in case not enough slaves +# are available, to the specified number of seconds. +# +# For example to require at least 3 slaves with a lag <= 10 seconds use: +# +# min-slaves-to-write 3 +# min-slaves-max-lag 10 +# +# Setting one or the other to 0 disables the feature. +# +# By default min-slaves-to-write is set to 0 (feature disabled) and +# min-slaves-max-lag is set to 10. + +################################## SECURITY ################################### + +# Require clients to issue AUTH before processing any other +# commands. This might be useful in environments in which you do not trust +# others with access to the host running redis-server. +# +# This should stay commented out for backward compatibility and because most +# people do not need auth (e.g. they run their own servers). +# +# Warning: since Redis is pretty fast an outside user can try up to +# 150k passwords per second against a good box. This means that you should +# use a very strong password otherwise it will be very easy to break. +# +# requirepass foobared + +# Command renaming. +# +# It is possible to change the name of dangerous commands in a shared +# environment. For instance the CONFIG command may be renamed into something +# hard to guess so that it will still be available for internal-use tools +# but not available for general clients. +# +# Example: +# +# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 +# +# It is also possible to completely kill a command by renaming it into +# an empty string: +# +# rename-command CONFIG "" +# +# Please note that changing the name of commands that are logged into the +# AOF file or transmitted to slaves may cause problems. + +################################### LIMITS #################################### + +# Set the max number of connected clients at the same time. By default +# this limit is set to 10000 clients, however if the Redis server is not +# able to configure the process file limit to allow for the specified limit +# the max number of allowed clients is set to the current file limit +# minus 32 (as Redis reserves a few file descriptors for internal uses). +# +# Once the limit is reached Redis will close all the new connections sending +# an error 'max number of clients reached'. +# +# maxclients 10000 + +# Don't use more memory than the specified amount of bytes. +# When the memory limit is reached Redis will try to remove keys +# according to the eviction policy selected (see maxmemory-policy). +# +# If Redis can't remove keys according to the policy, or if the policy is +# set to 'noeviction', Redis will start to reply with errors to commands +# that would use more memory, like SET, LPUSH, and so on, and will continue +# to reply to read-only commands like GET. +# +# This option is usually useful when using Redis as an LRU cache, or to set +# a hard memory limit for an instance (using the 'noeviction' policy). +# +# WARNING: If you have slaves attached to an instance with maxmemory on, +# the size of the output buffers needed to feed the slaves are subtracted +# from the used memory count, so that network problems / resyncs will +# not trigger a loop where keys are evicted, and in turn the output +# buffer of slaves is full with DELs of keys evicted triggering the deletion +# of more keys, and so forth until the database is completely emptied. +# +# In short... if you have slaves attached it is suggested that you set a lower +# limit for maxmemory so that there is some free RAM on the system for slave +# output buffers (but this is not needed if the policy is 'noeviction'). +# +# maxmemory + +# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory +# is reached. You can select among five behaviors: +# +# volatile-lru -> remove the key with an expire set using an LRU algorithm +# allkeys-lru -> remove any key according to the LRU algorithm +# volatile-random -> remove a random key with an expire set +# allkeys-random -> remove a random key, any key +# volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with any of the above policies, Redis will return an error on write +# operations, when there are no suitable keys for eviction. +# +# At the date of writing these commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: +# +# maxmemory-policy noeviction + +# LRU and minimal TTL algorithms are not precise algorithms but approximated +# algorithms (in order to save memory), so you can tune it for speed or +# accuracy. For default Redis will check five keys and pick the one that was +# used less recently, you can change the sample size using the following +# configuration directive. +# +# The default of 5 produces good enough results. 10 Approximates very closely +# true LRU but costs a bit more CPU. 3 is very fast but not very accurate. +# +# maxmemory-samples 5 + +############################## APPEND ONLY MODE ############################### + +# By default Redis asynchronously dumps the dataset on disk. This mode is +# good enough in many applications, but an issue with the Redis process or +# a power outage may result into a few minutes of writes lost (depending on +# the configured save points). +# +# The Append Only File is an alternative persistence mode that provides +# much better durability. For instance using the default data fsync policy +# (see later in the config file) Redis can lose just one second of writes in a +# dramatic event like a server power outage, or a single write if something +# wrong with the Redis process itself happens, but the operating system is +# still running correctly. +# +# AOF and RDB persistence can be enabled at the same time without problems. +# If the AOF is enabled on startup Redis will load the AOF, that is the file +# with the better durability guarantees. +# +# Please check http://redis.io/topics/persistence for more information. + +appendonly no + +# The name of the append only file (default: "appendonly.aof") + +appendfilename "appendonly.aof" + +# The fsync() call tells the Operating System to actually write data on disk +# instead of waiting for more data in the output buffer. Some OS will really flush +# data on disk, some other OS will just try to do it ASAP. +# +# Redis supports three different modes: +# +# no: don't fsync, just let the OS flush the data when it wants. Faster. +# always: fsync after every write to the append only log. Slow, Safest. +# everysec: fsync only one time every second. Compromise. +# +# The default is "everysec", as that's usually the right compromise between +# speed and data safety. It's up to you to understand if you can relax this to +# "no" that will let the operating system flush the output buffer when +# it wants, for better performances (but if you can live with the idea of +# some data loss consider the default persistence mode that's snapshotting), +# or on the contrary, use "always" that's very slow but a bit safer than +# everysec. +# +# More details please check the following article: +# http://antirez.com/post/redis-persistence-demystified.html +# +# If unsure, use "everysec". + +# appendfsync always +appendfsync everysec +# appendfsync no + +# When the AOF fsync policy is set to always or everysec, and a background +# saving process (a background save or AOF log background rewriting) is +# performing a lot of I/O against the disk, in some Linux configurations +# Redis may block too long on the fsync() call. Note that there is no fix for +# this currently, as even performing fsync in a different thread will block +# our synchronous write(2) call. +# +# In order to mitigate this problem it's possible to use the following option +# that will prevent fsync() from being called in the main process while a +# BGSAVE or BGREWRITEAOF is in progress. +# +# This means that while another child is saving, the durability of Redis is +# the same as "appendfsync none". In practical terms, this means that it is +# possible to lose up to 30 seconds of log in the worst scenario (with the +# default Linux settings). +# +# If you have latency problems turn this to "yes". Otherwise leave it as +# "no" that is the safest pick from the point of view of durability. + +no-appendfsync-on-rewrite no + +# Automatic rewrite of the append only file. +# Redis is able to automatically rewrite the log file implicitly calling +# BGREWRITEAOF when the AOF log size grows by the specified percentage. +# +# This is how it works: Redis remembers the size of the AOF file after the +# latest rewrite (if no rewrite has happened since the restart, the size of +# the AOF at startup is used). +# +# This base size is compared to the current size. If the current size is +# bigger than the specified percentage, the rewrite is triggered. Also +# you need to specify a minimal size for the AOF file to be rewritten, this +# is useful to avoid rewriting the AOF file even if the percentage increase +# is reached but it is still pretty small. +# +# Specify a percentage of zero in order to disable the automatic AOF +# rewrite feature. + +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb + +# An AOF file may be found to be truncated at the end during the Redis +# startup process, when the AOF data gets loaded back into memory. +# This may happen when the system where Redis is running +# crashes, especially when an ext4 filesystem is mounted without the +# data=ordered option (however this can't happen when Redis itself +# crashes or aborts but the operating system still works correctly). +# +# Redis can either exit with an error when this happens, or load as much +# data as possible (the default now) and start if the AOF file is found +# to be truncated at the end. The following option controls this behavior. +# +# If aof-load-truncated is set to yes, a truncated AOF file is loaded and +# the Redis server starts emitting a log to inform the user of the event. +# Otherwise if the option is set to no, the server aborts with an error +# and refuses to start. When the option is set to no, the user requires +# to fix the AOF file using the "redis-check-aof" utility before to restart +# the server. +# +# Note that if the AOF file will be found to be corrupted in the middle +# the server will still exit with an error. This option only applies when +# Redis will try to read more data from the AOF file but not enough bytes +# will be found. +aof-load-truncated yes + +################################ LUA SCRIPTING ############################### + +# Max execution time of a Lua script in milliseconds. +# +# If the maximum execution time is reached Redis will log that a script is +# still in execution after the maximum allowed time and will start to +# reply to queries with an error. +# +# When a long running script exceeds the maximum execution time only the +# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be +# used to stop a script that did not yet called write commands. The second +# is the only way to shut down the server in the case a write command was +# already issued by the script but the user doesn't want to wait for the natural +# termination of the script. +# +# Set it to 0 or a negative value for unlimited execution without warnings. +lua-time-limit 5000 + +################################ REDIS CLUSTER ############################### +# +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however +# in order to mark it as "mature" we need to wait for a non trivial percentage +# of users to deploy it in production. +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# +# Normal Redis instances can't be part of a Redis Cluster; only nodes that are +# started as cluster nodes can. In order to start a Redis instance as a +# cluster node enable the cluster support uncommenting the following: +# +# cluster-enabled yes + +# Every cluster node has a cluster configuration file. This file is not +# intended to be edited by hand. It is created and updated by Redis nodes. +# Every Redis Cluster node requires a different cluster configuration file. +# Make sure that instances running in the same system do not have +# overlapping cluster configuration file names. +# +# cluster-config-file nodes-6379.conf + +# Cluster node timeout is the amount of milliseconds a node must be unreachable +# for it to be considered in failure state. +# Most other internal time limits are multiple of the node timeout. +# +# cluster-node-timeout 15000 + +# A slave of a failing master will avoid to start a failover if its data +# looks too old. +# +# There is no simple way for a slave to actually have a exact measure of +# its "data age", so the following two checks are performed: +# +# 1) If there are multiple slaves able to failover, they exchange messages +# in order to try to give an advantage to the slave with the best +# replication offset (more data from the master processed). +# Slaves will try to get their rank by offset, and apply to the start +# of the failover a delay proportional to their rank. +# +# 2) Every single slave computes the time of the last interaction with +# its master. This can be the last ping or command received (if the master +# is still in the "connected" state), or the time that elapsed since the +# disconnection with the master (if the replication link is currently down). +# If the last interaction is too old, the slave will not try to failover +# at all. +# +# The point "2" can be tuned by user. Specifically a slave will not perform +# the failover if, since the last interaction with the master, the time +# elapsed is greater than: +# +# (node-timeout * slave-validity-factor) + repl-ping-slave-period +# +# So for example if node-timeout is 30 seconds, and the slave-validity-factor +# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the +# slave will not try to failover if it was not able to talk with the master +# for longer than 310 seconds. +# +# A large slave-validity-factor may allow slaves with too old data to failover +# a master, while a too small value may prevent the cluster from being able to +# elect a slave at all. +# +# For maximum availability, it is possible to set the slave-validity-factor +# to a value of 0, which means, that slaves will always try to failover the +# master regardless of the last time they interacted with the master. +# (However they'll always try to apply a delay proportional to their +# offset rank). +# +# Zero is the only value able to guarantee that when all the partitions heal +# the cluster will always be able to continue. +# +# cluster-slave-validity-factor 10 + +# Cluster slaves are able to migrate to orphaned masters, that are masters +# that are left without working slaves. This improves the cluster ability +# to resist to failures as otherwise an orphaned master can't be failed over +# in case of failure if it has no working slaves. +# +# Slaves migrate to orphaned masters only if there are still at least a +# given number of other working slaves for their old master. This number +# is the "migration barrier". A migration barrier of 1 means that a slave +# will migrate only if there is at least 1 other working slave for its master +# and so forth. It usually reflects the number of slaves you want for every +# master in your cluster. +# +# Default is 1 (slaves migrate only if their masters remain with at least +# one slave). To disable migration just set it to a very large value. +# A value of 0 can be set but is useful only for debugging and dangerous +# in production. +# +# cluster-migration-barrier 1 + +# By default Redis Cluster nodes stop accepting queries if they detect there +# is at least an hash slot uncovered (no available node is serving it). +# This way if the cluster is partially down (for example a range of hash slots +# are no longer covered) all the cluster becomes, eventually, unavailable. +# It automatically returns available as soon as all the slots are covered again. +# +# However sometimes you want the subset of the cluster which is working, +# to continue to accept queries for the part of the key space that is still +# covered. In order to do so, just set the cluster-require-full-coverage +# option to no. +# +# cluster-require-full-coverage yes + +# In order to setup your cluster make sure to read the documentation +# available at http://redis.io web site. + +################################## SLOW LOG ################################### + +# The Redis Slow Log is a system to log queries that exceeded a specified +# execution time. The execution time does not include the I/O operations +# like talking with the client, sending the reply and so forth, +# but just the time needed to actually execute the command (this is the only +# stage of command execution where the thread is blocked and can not serve +# other requests in the meantime). +# +# You can configure the slow log with two parameters: one tells Redis +# what is the execution time, in microseconds, to exceed in order for the +# command to get logged, and the other parameter is the length of the +# slow log. When a new command is logged the oldest one is removed from the +# queue of logged commands. + +# The following time is expressed in microseconds, so 1000000 is equivalent +# to one second. Note that a negative number disables the slow log, while +# a value of zero forces the logging of every command. +slowlog-log-slower-than 10000 + +# There is no limit to this length. Just be aware that it will consume memory. +# You can reclaim memory used by the slow log with SLOWLOG RESET. +slowlog-max-len 128 + +################################ LATENCY MONITOR ############################## + +# The Redis latency monitoring subsystem samples different operations +# at runtime in order to collect data related to possible sources of +# latency of a Redis instance. +# +# Via the LATENCY command this information is available to the user that can +# print graphs and obtain reports. +# +# The system only logs operations that were performed in a time equal or +# greater than the amount of milliseconds specified via the +# latency-monitor-threshold configuration directive. When its value is set +# to zero, the latency monitor is turned off. +# +# By default latency monitoring is disabled since it is mostly not needed +# if you don't have latency issues, and collecting data has a performance +# impact, that while very small, can be measured under big load. Latency +# monitoring can easily be enabled at runtime using the command +# "CONFIG SET latency-monitor-threshold " if needed. +latency-monitor-threshold 0 + +############################# EVENT NOTIFICATION ############################## + +# Redis can notify Pub/Sub clients about events happening in the key space. +# This feature is documented at http://redis.io/topics/notifications +# +# For instance if keyspace events notification is enabled, and a client +# performs a DEL operation on key "foo" stored in the Database 0, two +# messages will be published via Pub/Sub: +# +# PUBLISH __keyspace@0__:foo del +# PUBLISH __keyevent@0__:del foo +# +# It is possible to select the events that Redis will notify among a set +# of classes. Every class is identified by a single character: +# +# K Keyspace events, published with __keyspace@__ prefix. +# E Keyevent events, published with __keyevent@__ prefix. +# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... +# $ String commands +# l List commands +# s Set commands +# h Hash commands +# z Sorted set commands +# x Expired events (events generated every time a key expires) +# e Evicted events (events generated when a key is evicted for maxmemory) +# A Alias for g$lshzxe, so that the "AKE" string means all the events. +# +# The "notify-keyspace-events" takes as argument a string that is composed +# of zero or multiple characters. The empty string means that notifications +# are disabled. +# +# Example: to enable list and generic events, from the point of view of the +# event name, use: +# +# notify-keyspace-events Elg +# +# Example 2: to get the stream of the expired keys subscribing to channel +# name __keyevent@0__:expired use: +# +# notify-keyspace-events Ex +# +# By default all notifications are disabled because most users don't need +# this feature and the feature has some overhead. Note that if you don't +# specify at least one of K or E, no events will be delivered. +notify-keyspace-events "" + +############################### ADVANCED CONFIG ############################### + +# Hashes are encoded using a memory efficient data structure when they have a +# small number of entries, and the biggest entry does not exceed a given +# threshold. These thresholds can be configured using the following directives. +hash-max-ziplist-entries 512 +hash-max-ziplist-value 64 + +# Lists are also encoded in a special way to save a lot of space. +# The number of entries allowed per internal list node can be specified +# as a fixed maximum size or a maximum number of elements. +# For a fixed maximum size, use -5 through -1, meaning: +# -5: max size: 64 Kb <-- not recommended for normal workloads +# -4: max size: 32 Kb <-- not recommended +# -3: max size: 16 Kb <-- probably not recommended +# -2: max size: 8 Kb <-- good +# -1: max size: 4 Kb <-- good +# Positive numbers mean store up to _exactly_ that number of elements +# per list node. +# The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size), +# but if your use case is unique, adjust the settings as necessary. +list-max-ziplist-size -2 + +# Lists may also be compressed. +# Compress depth is the number of quicklist ziplist nodes from *each* side of +# the list to *exclude* from compression. The head and tail of the list +# are always uncompressed for fast push/pop operations. Settings are: +# 0: disable all list compression +# 1: depth 1 means "don't start compressing until after 1 node into the list, +# going from either the head or tail" +# So: [head]->node->node->...->node->[tail] +# [head], [tail] will always be uncompressed; inner nodes will compress. +# 2: [head]->[next]->node->node->...->node->[prev]->[tail] +# 2 here means: don't compress head or head->next or tail->prev or tail, +# but compress all nodes between them. +# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] +# etc. +list-compress-depth 0 + +# Sets have a special encoding in just one case: when a set is composed +# of just strings that happen to be integers in radix 10 in the range +# of 64 bit signed integers. +# The following configuration setting sets the limit in the size of the +# set in order to use this special memory saving encoding. +set-max-intset-entries 512 + +# Similarly to hashes and lists, sorted sets are also specially encoded in +# order to save a lot of space. This encoding is only used when the length and +# elements of a sorted set are below the following limits: +zset-max-ziplist-entries 128 +zset-max-ziplist-value 64 + +# HyperLogLog sparse representation bytes limit. The limit includes the +# 16 bytes header. When an HyperLogLog using the sparse representation crosses +# this limit, it is converted into the dense representation. +# +# A value greater than 16000 is totally useless, since at that point the +# dense representation is more memory efficient. +# +# The suggested value is ~ 3000 in order to have the benefits of +# the space efficient encoding without slowing down too much PFADD, +# which is O(N) with the sparse encoding. The value can be raised to +# ~ 10000 when CPU is not a concern, but space is, and the data set is +# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. +hll-sparse-max-bytes 3000 + +# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in +# order to help rehashing the main Redis hash table (the one mapping top-level +# keys to values). The hash table implementation Redis uses (see dict.c) +# performs a lazy rehashing: the more operation you run into a hash table +# that is rehashing, the more rehashing "steps" are performed, so if the +# server is idle the rehashing is never complete and some more memory is used +# by the hash table. +# +# The default is to use this millisecond 10 times every second in order to +# actively rehash the main dictionaries, freeing memory when possible. +# +# If unsure: +# use "activerehashing no" if you have hard latency requirements and it is +# not a good thing in your environment that Redis can reply from time to time +# to queries with 2 milliseconds delay. +# +# use "activerehashing yes" if you don't have such hard requirements but +# want to free memory asap when possible. +activerehashing yes + +# The client output buffer limits can be used to force disconnection of clients +# that are not reading data from the server fast enough for some reason (a +# common reason is that a Pub/Sub client can't consume messages as fast as the +# publisher can produce them). +# +# The limit can be set differently for the three different classes of clients: +# +# normal -> normal clients including MONITOR clients +# slave -> slave clients +# pubsub -> clients subscribed to at least one pubsub channel or pattern +# +# The syntax of every client-output-buffer-limit directive is the following: +# +# client-output-buffer-limit +# +# A client is immediately disconnected once the hard limit is reached, or if +# the soft limit is reached and remains reached for the specified number of +# seconds (continuously). +# So for instance if the hard limit is 32 megabytes and the soft limit is +# 16 megabytes / 10 seconds, the client will get disconnected immediately +# if the size of the output buffers reach 32 megabytes, but will also get +# disconnected if the client reaches 16 megabytes and continuously overcomes +# the limit for 10 seconds. +# +# By default normal clients are not limited because they don't receive data +# without asking (in a push way), but just after a request, so only +# asynchronous clients may create a scenario where data is requested faster +# than it can read. +# +# Instead there is a default limit for pubsub and slave clients, since +# subscribers and slaves receive data in a push fashion. +# +# Both the hard or the soft limit can be disabled by setting them to zero. +client-output-buffer-limit normal 0 0 0 +client-output-buffer-limit slave 256mb 64mb 60 +client-output-buffer-limit pubsub 32mb 8mb 60 + +# Redis calls an internal function to perform many background tasks, like +# closing connections of clients in timeout, purging expired keys that are +# never requested, and so forth. +# +# Not all tasks are performed with the same frequency, but Redis checks for +# tasks to perform according to the specified "hz" value. +# +# By default "hz" is set to 10. Raising the value will use more CPU when +# Redis is idle, but at the same time will make Redis more responsive when +# there are many keys expiring at the same time, and timeouts may be +# handled with more precision. +# +# The range is between 1 and 500, however a value over 100 is usually not +# a good idea. Most users should use the default of 10 and raise this up to +# 100 only in environments where very low latency is required. +hz 10 + +# When a child rewrites the AOF file, if the following option is enabled +# the file will be fsync-ed every 32 MB of data generated. This is useful +# in order to commit the file to the disk more incrementally and avoid +# big latency spikes. +aof-rewrite-incremental-fsync yes diff --git a/roles/redis/templates/stop_script.j2 b/roles/redis/templates/stop_script.j2 new file mode 100644 index 0000000..5534018 --- /dev/null +++ b/roles/redis/templates/stop_script.j2 @@ -0,0 +1,11 @@ + +#!/bin/sh +#**************************************************** +#AUTHOR:MANOJ V V +#DESCRIPTION:Script for lp-stop-service. +#DATE:25-08-16 +#************************************************ +if [ `ps -ef | grep redis | grep -v grep | wc -l` -ge 1 ] +then + "{{learner_user_home}}/redis-stable/src/redis-cli" SHUTDOWN SAVE +fi diff --git a/roles/samza-job-monitor/files/samza_alerts.zip b/roles/samza-job-monitor/files/samza_alerts.zip new file mode 100644 index 0000000000000000000000000000000000000000..8a690455dfc16c9b65b3d195827dad30fd88e387 GIT binary patch literal 5034 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 XZU= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# +# Function that starts the daemon/service +# +do_start() +{ + + start-stop-daemon --start --pidfile $PID --quiet --exec $NAME --test > /dev/null \ + || return 1 + + start-stop-daemon −−chdir=/opt/samza_alerts --start --make-pidfile --pidfile $PID --quiet --background --exec /usr/bin/env JOBS_COUNT=$JOBS_COUNT YARN_URL=$YARN_URL SAMZA_ENV=$SAMZA_ENV MONITORINGING_ENV_NAME=$MONITORINGING_ENV_NAME SLACK_CHANNEL=$SLACK_CHANNEL SLACK_URL=$SLACK_URL CHECK_DELAY=$CHECK_DELAY $NAME -- $ARGS \ + || return 2 +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --pidfile $PID --quiet --oknodo + RETVAL="$?" + rm -f $PID + return "$RETVAL" +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC" + do_start + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + stop) + log_daemon_msg "Stopping $DESC" + do_stop + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + status) + status_of_proc -p $PID $NAME $DESC && exit 0 || exit $? + ;; + restart) + log_daemon_msg "Restarting $DESC" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 + exit 3 + ;; +esac + +exit 0 diff --git a/roles/samza-job-monitor/templates/samza-monitor-systemd b/roles/samza-job-monitor/templates/samza-monitor-systemd new file mode 100644 index 0000000..bd8dce7 --- /dev/null +++ b/roles/samza-job-monitor/templates/samza-monitor-systemd @@ -0,0 +1,14 @@ +[Unit] +Description=samza-monitor deamon + +[Service] +Type=forking +User=root +Group=root +LimitNOFILE=32768 +Restart=on-failure +ExecStart=/etc/init.d/samza-monitor start +ExecStop=/etc/init.d/samza-monitor stop + +[Install] +WantedBy=multi-user.target diff --git a/roles/samza-job-server/tasks/main.yml b/roles/samza-job-server/tasks/main.yml new file mode 100644 index 0000000..ce685a8 --- /dev/null +++ b/roles/samza-job-server/tasks/main.yml @@ -0,0 +1,14 @@ +- name: Create Directory for Jobs + file: path={{item}} owner=hduser group=hadoop recurse=yes state=directory + with_items: + - /home/hduser/samza-jobs + become: yes +- name: Install python + apt: name=python state=present + become: yes +- name: Copy init file + template: src=samza-job-server.sh dest=/etc/init.d/samza-job-server mode=755 + become: yes +- name: Start samza job server + service: name=samza-job-server state=restarted enabled=yes + become: yes \ No newline at end of file diff --git a/roles/samza-job-server/templates/samza-job-server.sh b/roles/samza-job-server/templates/samza-job-server.sh new file mode 100644 index 0000000..c0535ef --- /dev/null +++ b/roles/samza-job-server/templates/samza-job-server.sh @@ -0,0 +1,104 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: Ecosystem-Platform-API +# Default-Start: 2 3 4 5 +# Default-Stop: S 0 1 6 +# Short-Description: Ecosystem-Platform-API +# Description: Starts samza-job-server as a daemon. +### END INIT INFO + +DESC="Samza-Job-Server Daemon" +NAME=/usr/bin/python +LOGFILE="/var/log/samza-job-server/" +SCRIPTNAME=/etc/init.d/samza-job-server +PID="/var/run/samza-job-server.pid" + +ARGS="-m SimpleHTTPServer" + +SERVER_PATH="/home/hduser/samza-jobs" +# Exit if the package is not installed +if [ ! -x "$NAME" ]; then +{ + echo "Couldn't find $NAME" + exit 99 +} +fi + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# +# Function that starts the daemon/service +# +do_start() +{ + + start-stop-daemon --start --pidfile $PID --quiet --exec $NAME --test > /dev/null \ + || return 1 + + start-stop-daemon --start --make-pidfile --pidfile $PID --quiet --background -d $SERVER_PATH --exec $NAME -- $ARGS \ + || return 2 +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --pidfile $PID --quiet --oknodo + RETVAL="$?" + rm -f $PID + return "$RETVAL" +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC" + do_start + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + stop) + log_daemon_msg "Stopping $DESC" + do_stop + case "$?" in + 0|1) log_end_msg 0 ;; + 2) log_end_msg 1 ;; + esac + ;; + status) + status_of_proc -p $PID $NAME $DESC && exit 0 || exit $? + ;; + restart) + log_daemon_msg "Restarting $DESC" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 + exit 3 + ;; +esac + +exit 0 diff --git a/roles/samza-jobs-additional-config/defaults/main.yml b/roles/samza-jobs-additional-config/defaults/main.yml new file mode 100644 index 0000000..626b7f0 --- /dev/null +++ b/roles/samza-jobs-additional-config/defaults/main.yml @@ -0,0 +1,5 @@ +--- +object_denormalization_additional_config_dir: /etc/samza-jobs/{{env}} +object_denormalization_additional_config: "{{object_denormalization_additional_config_dir}}/object-denormalization-additional-config.json" +es_router_additional_config: "{{object_denormalization_additional_config_dir}}/es-router-additional-config.json" +es_router_additional_secondary_config: "{{object_denormalization_additional_config_dir}}/es-router-additional-secondary-config.json" diff --git a/roles/samza-jobs-additional-config/tasks/main.yml b/roles/samza-jobs-additional-config/tasks/main.yml new file mode 100644 index 0000000..11e1535 --- /dev/null +++ b/roles/samza-jobs-additional-config/tasks/main.yml @@ -0,0 +1,12 @@ +--- +- name: Create directory for additional config + file: path={{object_denormalization_additional_config_dir}} owner=hduser group=hadoop recurse=yes state=directory + +- name: Copy Object denormalization additional config + template: src=object-denormalization-additional-config.json dest={{object_denormalization_additional_config}} owner=hduser group=hadoop + +- name: Copy Primary es router additional config + template: src=es-router-additional-config.json dest={{es_router_additional_config}} owner=hduser group=hadoop + +- name: Copy Secondary es router additional config + template: src=es-router-additional-secondary-config.json dest={{es_router_additional_secondary_config}} owner=hduser group=hadoop diff --git a/roles/samza-jobs-additional-config/templates/es-router-additional-config.json b/roles/samza-jobs-additional-config/templates/es-router-additional-config.json new file mode 100644 index 0000000..2c47f45 --- /dev/null +++ b/roles/samza-jobs-additional-config/templates/es-router-additional-config.json @@ -0,0 +1,140 @@ +{ + "topicConfigs":[ + { + "names":["{{env}}.telemetry.objects.de_normalized"], + "eventConfigs":[ + { + "rules":[ + { + "idPath":"eid", + "idValue":"OE.*" + } + ], + "esIndexValue":"telemetry", + "esIndexType":"events_v1", + "weight":3, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": true + } + + }, + { + "rules":[ + { + "idPath":"eid", + "idValue":"GE.*" + } + ], + "esIndexValue":"telemetry", + "esIndexType":"events_v1", + "weight":3, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": true + } + }, + { + "rules":[ + { + "idPath":"eid", + "idValue":"BE_ACCESS|BE_JOB_START|BE_JOB_LOG|BE_JOB_END|BE_SERVICE_LOG|BE_SERVICE_LIFECYCLE|BE_SERVICE_METRIC" + } + ], + "esIndexValue":"infra", + "esIndexType":"infra", + "weight":4, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": true + } + }, + { + "rules":[ + { + "idPath":"eid", + "idValue":"CP_.*|CE_.*|BE_.*" + } + ], + "esIndexValue":"backend", + "esIndexType":"backend", + "weight":3, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": true + } + }, + { + "rules":[ + { + "idPath":"context.granularity", + "idValue":"CUMULATIVE" + }, + { + "idPath":"learning", + "idValue": "true" + } + ], + + "esIndexValue":"learning-cumulative", + "esIndexType":"events_v1", + "weight":3, + "cumulative":true + }, + { + "rules":[ + { + "idPath":"learning", + "idValue": "true" + } + ], + "esIndexValue":"learning", + "esIndexType":"events_v1", + "weight":2, + "cumulative":false, + "esIndexDate": { + "primary" : "context.date_range.to", + "primaryFormat": "epoch", + "updatePrimary": false + } + }, + { + "rules":[ + { + "idPath":"eid", + "idValue":".*" + } + ], + "esIndexValue":"telemetry", + "esIndexType":"events_v1", + "weight":1, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": true + } + } + ] + + } + ] +} diff --git a/roles/samza-jobs-additional-config/templates/es-router-additional-secondary-config.json b/roles/samza-jobs-additional-config/templates/es-router-additional-secondary-config.json new file mode 100644 index 0000000..f5c15c4 --- /dev/null +++ b/roles/samza-jobs-additional-config/templates/es-router-additional-secondary-config.json @@ -0,0 +1,29 @@ +{ + "topicConfigs":[ + { + "names":["{{env}}.telemetry.valid.fail","{{env}}.telemetry.duplicate","{{env}}.telemetry.with_location.fail","{{env}}.telemetry.objects.de_normalized.fail","{{env}}.telemetry.es_router_primary.fail","{{env}}.telemetry.es_indexer_primary.fail"], + "eventConfigs":[ + { + "rules":[ + { + "idPath":"eid", + "idValue":".*" + } + ], + "esIndexValue":"failed-telemetry", + "esIndexType":"events", + "weight":3, + "cumulative":false, + "esIndexDate": { + "primary" : "ts", + "primaryFormat": "string", + "secondary" : "ets", + "secondaryFormat": "epoch", + "updatePrimary": false + } + + } + ] + } + ] +} diff --git a/roles/samza-jobs-additional-config/templates/object-denormalization-additional-config.json b/roles/samza-jobs-additional-config/templates/object-denormalization-additional-config.json new file mode 100644 index 0000000..874a18a --- /dev/null +++ b/roles/samza-jobs-additional-config/templates/object-denormalization-additional-config.json @@ -0,0 +1,84 @@ +{ + "eventConfigs": [ + { + "name": "Portal User for all CP & CE events", + "eidPattern": "C[PE]\\_.*", + "denormalizationConfigs": [ + { + "idFieldPath": "uid", + "denormalizedFieldPath": "portaluserdata" + } + ] + }, + { + "name": "Partner data for ME_CONTENT_SNAPSHOT_SUMMARY", + "eidPattern": "ME_CONTENT_SNAPSHOT_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "dimensions.partner_id", + "denormalizedFieldPath": "partnerdata" + } + ] + }, + { + "name": "Partner data for ME_ASSET_SNAPSHOT_SUMMARY", + "eidPattern": "ME_ASSET_SNAPSHOT_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "dimensions.partner_id", + "denormalizedFieldPath": "partnerdata" + } + ] + }, + { + "name": "Portal user data for ME_APP_SESSION_SUMMARY", + "eidPattern": "ME_APP_SESSION_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "uid", + "denormalizedFieldPath": "portaluserdata" + } + ] + }, + { + "name": "Portal user data for ME_APP_USAGE_SUMMARY", + "eidPattern": "ME_APP_USAGE_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "dimensions.author_id", + "denormalizedFieldPath": "portaluserdata" + } + ] + }, + { + "name": "Portal user data for ME_CE_SESSION_SUMMARY", + "eidPattern": "ME_CE_SESSION_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "uid", + "denormalizedFieldPath": "portaluserdata" + } + ] + }, + { + "name": "Portal user data for ME_AUTHOR_USAGE_SUMMARY", + "eidPattern": "ME_AUTHOR_USAGE_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "uid", + "denormalizedFieldPath": "portaluserdata" + } + ] + }, + { + "name": "Portal user data for ME_TEXTBOOK_SESSION_SUMMARY", + "eidPattern": "ME_TEXTBOOK_SESSION_SUMMARY", + "denormalizationConfigs": [ + { + "idFieldPath": "uid", + "denormalizedFieldPath": "portaluserdata" + } + ] + } + ] +} diff --git a/roles/samza-jobs-telemetry-schemas/tasks/main.yml b/roles/samza-jobs-telemetry-schemas/tasks/main.yml new file mode 100644 index 0000000..e7cee03 --- /dev/null +++ b/roles/samza-jobs-telemetry-schemas/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: Create schema directory + file: path={{telemetry_schema_directory}} owner=hduser group=hadoop recurse=yes state=directory + become: yes + +- name: Copy schemas folder + copy: src=schemas dest={{telemetry_schema_directory}} owner=hduser group=hadoop + become: yes + +- name: get schema dir names + raw: find {{telemetry_schema_path}} -type f -name "*.*" + register: schemas + +- name: change internal schema file reference + replace: dest={{item}} regexp="http://localhost:7070/schemas/" replace="file://{{telemetry_schema_path}}/" owner=hduser group=hadoop + with_items: "{{ schemas.stdout_lines }}" + become: yes \ No newline at end of file diff --git a/roles/samza-jobs/defaults/main.yml b/roles/samza-jobs/defaults/main.yml new file mode 100644 index 0000000..1b4e3fa --- /dev/null +++ b/roles/samza-jobs/defaults/main.yml @@ -0,0 +1,11 @@ +--- +samza_jobs_dir: /home/hduser/samza-jobs/{{env}} +job_status_file: /home/hduser/samza-jobs/{{env}}/extract/job_status +yarn_path: /usr/local/hadoop/bin +object_denormalization_additional_config_dir: /etc/samza-jobs/{{env}} +object_denormalization_additional_config: "{{object_denormalization_additional_config_dir}}/object-denormalization-additional-config.json" +es_router_additional_config: "{{object_denormalization_additional_config_dir}}/es-router-additional-config.json" +es_router_additional_secondary_config: "{{object_denormalization_additional_config_dir}}/es-router-additional-secondary-config.json" +# lpdeploy: no +# dpdeploy: no +hierarchy_keyspace_name: "{{env}}_hierarchy_store" diff --git a/roles/samza-jobs/files/find_job_name.sh b/roles/samza-jobs/files/find_job_name.sh new file mode 100644 index 0000000..05f0605 --- /dev/null +++ b/roles/samza-jobs/files/find_job_name.sh @@ -0,0 +1 @@ +sed -n "/job\.name.*$/ p" $1 | sed -n "s/=/\\t/g p" | cut -f 2 \ No newline at end of file diff --git a/roles/samza-jobs/files/get_all_job_name.sh b/roles/samza-jobs/files/get_all_job_name.sh new file mode 100644 index 0000000..7975c8a --- /dev/null +++ b/roles/samza-jobs/files/get_all_job_name.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +find . -name "*.properties" | while read fname; do + job_name=`sed -n "/^job\.name.*$/ p" $fname | sed -n "s/=/\\t/g p" | cut -f 2` + folder_path=$(dirname `dirname "$fname"`) + folder_name=`basename $folder_path` + echo "$folder_name:$job_name:---:stopped" +done > $1 diff --git a/roles/samza-jobs/files/get_all_running_app_id.sh b/roles/samza-jobs/files/get_all_running_app_id.sh new file mode 100644 index 0000000..74aa7c0 --- /dev/null +++ b/roles/samza-jobs/files/get_all_running_app_id.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +./yarn application -list | cut -f 2 | sed 1,'/Application-Name/'d \ No newline at end of file diff --git a/roles/samza-jobs/files/get_all_running_app_name.sh b/roles/samza-jobs/files/get_all_running_app_name.sh new file mode 100644 index 0000000..b3b1b9d --- /dev/null +++ b/roles/samza-jobs/files/get_all_running_app_name.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +job_names=(`./yarn application -list | cut -f 2 | sed 1,'/Application-Name/'d | sed 's/_1$//'`) +job_ids=(`./yarn application -list | cut -f 1 | sed 1,'/Application-Id/'d`) +count=${#job_names[@]} +for (( i=0; i<${count}; i++ )); +do + job_name=${job_names[i]} + job_id=${job_ids[i]} + `sed -i /$job_name/s/stopped/started/g $1` + `sed -i /$job_name/s/---/$job_id/g $1` +done diff --git a/roles/samza-jobs/files/kill_all_app.sh b/roles/samza-jobs/files/kill_all_app.sh new file mode 100644 index 0000000..55f7341 --- /dev/null +++ b/roles/samza-jobs/files/kill_all_app.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +./yarn application -list > applist.txt +sed -n "/$1.*$/ p" applist.txt | cut -f 1 > temp.txt +while read in; +do +./yarn application -kill "$in"; +done < temp.txt +rm temp.txt +rm applist.txt \ No newline at end of file diff --git a/roles/samza-jobs/files/kill_jobs.sh b/roles/samza-jobs/files/kill_jobs.sh new file mode 100644 index 0000000..267515c --- /dev/null +++ b/roles/samza-jobs/files/kill_jobs.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +cat $1 | while read LINE +do + application_id=`echo $LINE | awk -F':' '{print $3}'`; + status=`echo $LINE | awk -F':' '{print $4}'`; + + if [ "$status" == "restart" ] + then + ./yarn application -kill $application_id + fi +done \ No newline at end of file diff --git a/roles/samza-jobs/files/remove_old_tar.sh b/roles/samza-jobs/files/remove_old_tar.sh new file mode 100644 index 0000000..13d0547 --- /dev/null +++ b/roles/samza-jobs/files/remove_old_tar.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +cat $1 | awk -F':' '{print $1}' > tmp.txt +DIRS=`ls -l $2/extract/ | egrep '^d'| awk '{print $9}'` +for dir in $DIRS +do + if ! grep -Fxq $dir tmp.txt + then + rm -rf $dir + rm $2/$dir + fi +done +rm tmp.txt \ No newline at end of file diff --git a/roles/samza-jobs/files/start_jobs.sh b/roles/samza-jobs/files/start_jobs.sh new file mode 100644 index 0000000..4d048a5 --- /dev/null +++ b/roles/samza-jobs/files/start_jobs.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +folder_path=$2 +cat $1 | while read LINE +do + dir_name=`echo $LINE | awk -F':' '{print $1}'`; + job_name=`echo $LINE | awk -F':' '{print $2}'`; + application_id=`echo $LINE | awk -F':' '{print $3}'`; + status=`echo $LINE | awk -F':' '{print $4}'`; + properties_path="$folder_path/$dir_name/config/*.properties" + config_file_path=`ls -d $properties_path` + if [ "$status" == "stopped" ] || [ "$status" == "restart" ] + then + ./$dir_name/bin/run-job.sh --config-factory=org.apache.samza.config.factories.PropertiesConfigFactory --config-path=file:///$config_file_path + fi +done \ No newline at end of file diff --git a/roles/samza-jobs/files/update_new_job_name.sh b/roles/samza-jobs/files/update_new_job_name.sh new file mode 100644 index 0000000..24e174c --- /dev/null +++ b/roles/samza-jobs/files/update_new_job_name.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +find $2 -name "*.properties" | while read fname; do + job_name=`sed -n "/^job\.name.*$/ p" $fname | sed -n "s/=/\\t/g p" | cut -f 2` + folder_path=$(dirname `dirname "$fname"`) + folder_name=`basename $folder_path` + if grep -Fwq $job_name $1 + then + `sed -i /$job_name/s/^.*\.gz/$folder_name/ $1`; + `sed -i /$job_name/s/started/restart/ $1`; + else + echo "adding" + echo "$folder_name:$job_name:---:stopped" >> $1 + fi +done \ No newline at end of file diff --git a/roles/samza-jobs/tasks/deploy.yml b/roles/samza-jobs/tasks/deploy.yml new file mode 100644 index 0000000..5af1983 --- /dev/null +++ b/roles/samza-jobs/tasks/deploy.yml @@ -0,0 +1,104 @@ +--- +- name: Create Directory for Jobs + file: path={{item}} owner=hduser group=hadoop recurse=yes state=directory + with_items: + - "{{samza_jobs_dir}}" + - "{{samza_jobs_dir}}/extract" + +- name: Copy script to get all running jobs + copy: src=get_all_running_app_name.sh dest=/usr/local/hadoop/bin owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Copy script to get all job names + copy: src=get_all_job_name.sh dest="{{samza_jobs_dir}}/extract" owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Copy script to get updated job names from extracted tar + copy: src=update_new_job_name.sh dest="{{samza_jobs_dir}}/extract" owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Copy script to start jobs based on the status + copy: src=start_jobs.sh dest="{{samza_jobs_dir}}/extract" owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Copy script to remove old job tar + copy: src=remove_old_tar.sh dest="{{samza_jobs_dir}}/extract" owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Copy script to kill jobs based on the status + copy: src=kill_jobs.sh dest=/usr/local/hadoop/bin owner=hduser group=hadoop mode="u=rwx,g=rx,o=r" + +- name: Remove file of job status + file: path="{{job_status_file}}" state=absent + +- name: Get job names from folder + command: bash -lc "./get_all_job_name.sh {{job_status_file}}" + args: + chdir: "{{samza_jobs_dir}}/extract" + +- name: Ensure yarn resource manager is running + command: bash -lc "(ps aux | grep yarn-hduser-resourcemanager | grep -v grep) || /usr/local/hadoop/sbin/yarn-daemon.sh --config /usr/local/hadoop-{{hadoop_version}}/conf/ start resourcemanager" + become: yes + become_user: hduser + +- name: Update status of running job in file + command: bash -lc "./get_all_running_app_name.sh {{job_status_file}}" + args: + chdir: /usr/local/hadoop/bin + +- name: copy new jobs tar ball + copy: src={{ item }} dest={{samza_jobs_dir}}/ force=no owner=hduser group=hadoop + with_fileglob: + - ./jobs/* + register: new_jobs + +- name: Create Directory to extract new jobs + file: path={{samza_jobs_dir}}/extract/{{item.item | basename }} owner=hduser group=hadoop recurse=yes state=directory + register: extract_dir + when: "{{item|changed}}" + with_items: "{{ (new_jobs|default({})).results|default([]) }}" + +- name: extract new jobs + command: tar -xvf "{{samza_jobs_dir}}/{{item.item | basename}}" -C "{{samza_jobs_dir}}/extract/{{item.item | basename }}" + when: "{{item|changed}}" + with_items: "{{ (new_jobs|default({})).results|default([]) }}" + +- name: Create Directory to extract new jobs + file: path={{samza_jobs_dir}}/extract/ owner=hduser group=hadoop recurse=yes + +- name: Get all new job configs + shell: "ls -d -1 {{item.path}}/config/*.properties" + register: config_files + when: "{{item|changed}}" + with_items: "{{ (extract_dir|default({})).results|default([]) }}" + +- name: update environment specific details in new job configs + replace: dest="{{item[1].stdout}}" regexp="{{item[0].key}}" replace="{{item[0].value}}" + when: "{{item[1]|changed}}" + with_nested: + - [{key: "__yarn_host__", value: "{{__yarn_host__}}"}, {key: "__yarn_port__", value: "{{__yarn_port__}}"}, {key: "__env__", value: "{{env}}" }, {key: "__env_name__", value: "{{env_name}}" }, {key: "__zookeepers__", value: "{{zookeepers}}"}, {key: "__kafka_brokers__", value: "{{kafka_brokers}}"}, {key: "__delayInMilliSeconds__", value: "{{delayInMilliSeconds}}" }, {key: "__retryTimeInMilliSeconds__", value: "{{retryTimeInMilliSeconds}}" }, {key: "__bypass_reverse_search__", value: "{{bypass_reverse_search}}" }, {key: "__retryBackoffBaseInSeconds__", value: "{{retry_backoff_base_in_seconds}}" }, {key: "__retryLimit__", value: "{{retry_limit}}" }, {key: "__retryLimitEnable__", value: "{{retry_limit_enable}}" }, {key: "__google_api_key__", value: "{{google_api_key}}" }, {key: "__searchServiceEndpoint__", value: "{{search_service_endpoint}}" }, {key: "__objectDenormalizationAdditionalConfig__", value: "{{object_denormalization_additional_config}}" },{key: "__audit_es_host__", value: "{{audit_es_host}}"}, {key: "__search_es_host__", value: "{{search_es_host}}"}, {key: "__redis_host__", value: "{{redis_host}}"}, {key: "__redis_port__", value: "{{redis_port}}"}, {key: "__environment_id__", value: "{{environment_id}}"}, {key: "__graph_passport_key__", value: "{{graph_passport_key}}"}, {key: "__lp_bolt_url__", value: "{{lp_bolt_url}}"}, {key: "__lp_bolt_read_url__", value: "{{lp_bolt_read_url}}"}, {key: "__lp_bolt_write_url__", value: "{{lp_bolt_write_url}}"}, {key: "__other_bolt_url__", value: "{{other_bolt_url}}"}, {key: "__other_bolt_read_url__", value: "{{other_bolt_read_url}}"}, {key: "__other_bolt_write_url__", value: "{{other_bolt_write_url}}"}, {key: "__mw_shard_id__", value: "{{mw_shard_id}}"}, {key: "__lp_url__", value: "{{lp_url}}"}, {key: "__cloud_storage_config_environment__", value: "{{cloud_storage_config_environment}}"}, {key: "__google_vision_tagging__", value: "{{google_vision_tagging}}"}, {key: "__lp_tmpfile_location__", value: "{{lp_tmpfile_location}}"}, {key: "__language_url__", value: "{{language_url}}"},{key: "__esRouterAdditionalConfig__", value: "{{es_router_additional_config}}"},{key: "__esRouterSecondaryAdditionalConfig__", value: "{{es_router_additional_secondary_config}}"},{key: "__es_port__", value: "{{es_port}}"},{key: "__cassandra_host__", value: "{{cassandra_host}}"},{key: "__cassandra_port__", value: "{{cassandra_port}}"}, {key: "__content_to_vec_url__", value: "{{content_to_vec_url}}"}, {key: "__keyspace_name__", value: "{{content_keyspace_name}}"}, {key: "__keyspace_table__", value: "{{content_keyspace_table}}"}, {key: "__s3_public_bucket__", value: "{{s3_public_bucket}}"},{key: "__collection_fullecar_disable__", value: "{{collection_fullecar_disable}}"},{key: "__max_iteration_count_for_samza_job__", value: "{{max_iteration_count_for_samza_job}}"},{key: "__cloud_storage_type__", value: "{{cloud_store}}"},{key: "__azure_storage_key__", value: "{{azure_account_name}}"},{key: "__azure_storage_secret__", value: "{{azure_account_key}}"},{key: "__azure_storage_container__", value: "{{azure_public_container}}"},{key: "__content_media_base_url__", value: "{{content_media_base_url}}"}, {key: "__plugin_media_base_url__", value: "{{plugin_media_base_url}}"}, {key: "__installation_id__", value: "{{instance_name}}"}, {key: "__content_media_base_url__", value: "{{content_media_base_url}}"},{key: "__default_channel__", value: "{{default_channel}}"}, {key: "__hierarchy_keyspace_name__", value: "{{hierarchy_keyspace_name}}"}, {key: "__invoke_web_hook__", value: "{{publish_invoke_web_hook}}"}, {key: "__composite_search_indexer_container_count__", value: "{{composite_search_indexer_container_count}}"}] + - "{{ (config_files|default({})).results|default([]) }}" + + +- name: Create directory for additional config + file: path={{object_denormalization_additional_config_dir}} owner=hduser group=hadoop recurse=yes state=directory + +- name: Update status of new jobs in file + command: bash -lc "./update_new_job_name.sh {{job_status_file}} {{samza_jobs_dir}}/extract/{{item.item | basename}}" + args: + chdir: "{{samza_jobs_dir}}/extract/" + when: "{{item|changed}}" + with_items: "{{ (new_jobs|default({})).results|default([]) }}" + +- name: Kill jobs + command: bash -lc "./kill_jobs.sh {{job_status_file}}" + args: + chdir: /usr/local/hadoop/bin + +- name: Start jobs + command: bash -lc "./start_jobs.sh {{job_status_file}} {{samza_jobs_dir}}/extract" + args: + chdir: "{{samza_jobs_dir}}/extract/" + become_user: hduser + +- name: Remove all old tar + command: bash -lc "./remove_old_tar.sh {{job_status_file}} {{samza_jobs_dir}}" + args: + chdir: "{{samza_jobs_dir}}/extract/" + +- file: path={{samza_jobs_dir}} owner=hduser group=hadoop state=directory recurse=yes diff --git a/roles/samza-jobs/tasks/main.yml b/roles/samza-jobs/tasks/main.yml new file mode 100644 index 0000000..0feb5dc --- /dev/null +++ b/roles/samza-jobs/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- include: deploy.yml + when: deploy_jobs | default(false) + +- include: stop_jobs.yml + when: stop_jobs | default(false) + +- include: start_jobs.yml + when: start_jobs | default(false) diff --git a/roles/samza-jobs/tasks/start_jobs.yml b/roles/samza-jobs/tasks/start_jobs.yml new file mode 100644 index 0000000..4bb0c65 --- /dev/null +++ b/roles/samza-jobs/tasks/start_jobs.yml @@ -0,0 +1,21 @@ +--- +- name: Remove file of job status + file: path="{{job_status_file}}" state=absent + become: yes + +- name: Get job names from folder + command: bash -lc "./get_all_job_name.sh {{job_status_file}}" + args: + chdir: "{{samza_jobs_dir}}/extract" + become: yes + +- name: Ensure yarn resource manager is running + command: bash -lc "(ps aux | grep yarn-hduser-resourcemanager | grep -v grep) || /usr/local/hadoop/sbin/yarn-daemon.sh --config /usr/local/hadoop-{{hadoop_version}}/conf/ start resourcemanager" + become: yes + become_user: hduser + +- name: Start jobs + command: bash -lc "./start_jobs.sh {{job_status_file}} {{samza_jobs_dir}}/extract" + args: + chdir: "{{samza_jobs_dir}}/extract/" + become: yes diff --git a/roles/samza-jobs/tasks/stop_jobs.yml b/roles/samza-jobs/tasks/stop_jobs.yml new file mode 100644 index 0000000..1ef2f7b --- /dev/null +++ b/roles/samza-jobs/tasks/stop_jobs.yml @@ -0,0 +1,16 @@ +--- +- name: Remove file of job status + file: path="{{job_status_file}}" state=absent + become: yes + +- name: Get job names from folder + command: bash -lc "./get_all_job_name.sh {{job_status_file}}" + args: + chdir: "{{samza_jobs_dir}}/extract" + become: yes + +- name: Kill jobs + command: bash -lc "./kill_jobs.sh {{job_status_file}}" + args: + chdir: /usr/local/hadoop/bin + become: yes diff --git a/roles/search-service-deploy/defaults/main.yml b/roles/search-service-deploy/defaults/main.yml new file mode 100644 index 0000000..3125e12 --- /dev/null +++ b/roles/search-service-deploy/defaults/main.yml @@ -0,0 +1,9 @@ +learner_user: learning +learner_user_home: /home/{{learner_user}} +search_service_path: "{{learner_user_home}}/platform/service" +search_index_host: "{{ groups['composite-search-cluster'][0] }}:9200" +search_home: "{{learner_user_home}}/platform/search/search-manager" +search_root: "{{learner_user_home}}/platform/search" +platform_api_url: "http://{{ groups['learning1'][0] }}:8080/learning-service" +instance: "{{env}}" +instance_name: sunbird \ No newline at end of file diff --git a/roles/search-service-deploy/tasks/main.yml b/roles/search-service-deploy/tasks/main.yml new file mode 100644 index 0000000..b682131 --- /dev/null +++ b/roles/search-service-deploy/tasks/main.yml @@ -0,0 +1,68 @@ +# Search Service Deployment Tasks. +- name: installing unzip + become: yes + apt: + name: unzip + state: present + +- name: Status of the search service + become: yes + become_user: "{{learner_user}}" + command: "{{ search_service_path }}/search-service status" + register: search_status + + +- name: Stop the search api service + become: yes + become_user: "{{learner_user}}" + command: "{{ search_service_path }}/search-service stop" + when: "search_status.stdout.find('RUNNING') != -1" + async: 10 + poll: 5 + +- name: Setup LP search as service + become: yes + become_user: "{{learner_user}}" + vars: + description: LP Search service + script_name: "search-service" + script_dir: "{{ search_service_path }}" + grep_key: play.core.server.ProdServerStart + process: "/usr/bin/java" + service_args: "-Dconfig.file={{ search_root }}/search-service.conf" + process_home: "" + app_home: "{{ search_home }}" + process_args: -- -cp '{{ app_home }}/lib/*' {{ service_args }} play.core.server.ProdServerStart {{ app_home }} + template: src=servicify-process.j2 dest={{ search_service_path }}/{{ script_name }} mode=755 owner={{ learner_user }} group={{ learner_user }} + +- name: Copy the configuration files + become: yes + become_user: "{{learner_user}}" + template: src=search-service.conf.j2 dest={{ search_root }}/search-service.conf mode=755 owner={{ learner_user }} group={{ learner_user }} + +- name: Copy search artifact + become: yes + become_user: "{{learner_user}}" + copy: src=search-manager-1.0-SNAPSHOT-dist.zip dest={{ search_root }} mode=755 owner={{ learner_user }} group={{ learner_user }} + +- name: Remove search-service + become: yes + become_user: "{{learner_user}}" + file: name={{search_root}}/search-manager state=absent + +- name: Unarchive search artifact + become: yes + become_user: "{{learner_user}}" + unarchive: src={{ search_root }}/search-manager-1.0-SNAPSHOT-dist.zip dest={{ search_root }} copy=no group={{ learner_user }} owner={{ learner_user }} mode=755 + +- name: Change search artifact + become: yes + become_user: "{{learner_user}}" + command: mv {{learner_user_home}}/platform/search/search-manager-1.0-SNAPSHOT {{learner_user_home}}/platform/search/search-manager + +- name: Start the search service + become: yes + become_user: "{{learner_user}}" + command: "{{ search_service_path }}/search-service start" + async: 20 + poll: 5 diff --git a/roles/search-service-deploy/templates/search-service.conf.j2 b/roles/search-service-deploy/templates/search-service.conf.j2 new file mode 100644 index 0000000..23a851a --- /dev/null +++ b/roles/search-service-deploy/templates/search-service.conf.j2 @@ -0,0 +1,105 @@ +# This is the main configuration file for the application. +# https://www.playframework.com/documentation/latest/ConfigFile +# ~~~~~ + +## Akka +# https://www.playframework.com/documentation/latest/JavaAkka#Configuration +# ~~~~~ +akka { +loggers =["akka.event.Logging$DefaultLogger"] +#log-config-on-start = true +} +include "akka.conf" +## Secret key +# http://www.playframework.com/documentation/latest/ApplicationSecret +# ~~~~~ +#play.crypto.secret = "changeme" + + +## Internationalisation +# https://www.playframework.com/documentation/latest/JavaI18N +# ~~~~~ +play.i18n { + # The application languages + langs = [ "en" ] +} + +## Play HTTP settings +# ~~~~~ +play.http { + ## Router + # https://www.playframework.com/documentation/latest/JavaRouting + # https://www.playframework.com/documentation/latest/ScalaRouting + # ~~~~~ + # Define the Router object to use for this application. + # This router will be looked up first when the application is starting up, + # so make sure this is the entry point. + # Furthermore, it's assumed your route file is named properly. + # So for an application router like `my.application.Router`, + # you may need to define a router file `conf/my.application.routes`. + # Default to Routes in the root package (aka "apps" folder) (and conf/routes) + #router = my.application.Router + +} + +## Netty Provider +# ~~~~~ +play.server.netty { + # If you run Play on Linux, you can use Netty's native socket transport + # for higher performance with less garbage. + #transport = "native" +} + +## WS (HTTP Client) +# ~~~~~ +libraryDependencies += javaWs + +## Cache +# https://www.playframework.com/documentation/latest/JavaCache +# https://www.playframework.com/documentation/latest/ScalaCache +# ~~~~~ +# Play comes with an integrated cache API that can reduce the operational +# overhead of repeated requests. You must enable this by adding to build.sbt: +# +libraryDependencies += cache +# +play.cache { + # If you want to bind several caches, you can bind the individually + #bindCaches = ["db-cache", "user-cache", "session-cache"] +} + +# Logger +# ~~~~~ +# You can also configure logback (http://logback.qos.ch/), +# by providing an application-logger.xml file in the conf directory. + +# Root logger: +logger.root=ERROR + +# Logger used by the framework: +logger.play=INFO + +# Logger provided to your application: +logger.application=DEBUG + +# APP Specific config +# ~~~~~ +# Application specific configurations can be provided here + +telemetry_env="{{ instance }}" +installation.id="{{instance_name}}" + +# ElasticSearch Configuration +ekstepPlatformApiUserId="search-service" +search.es_conn_info="{{ search_index_host }}" +search.fields.query=["name^100","title^100","lemma^100","code^100","domain","subject","description^10","keywords^100","ageGroup^10","filter^10","theme^10","genre^10","objects^25","contentType^100","language^200","teachingMode^25","skills^10","learningObjective^10","curriculum^100","gradeLevel^100","developer^100","attributions^10","owner^50","text","words","releaseNotes"] +search.fields.date=["lastUpdatedOn","createdOn","versionDate","lastSubmittedOn","lastPublishedOn"] +search.fields.mode_collection=["identifier","name","objectType","contentType","mimeType","size","childNodes"] +search.batch.size=500 +search.connection.timeout=30 +platform-api-url="{{ platform_api_url }}" + +language.map={"Hindi":"hi", "English":"en", "Telugu":"te", "Kannada":"ka", "Tamil":"ta", "Assamese":"as", "Bengali":"bn", "Bodo":"bo", "Gujarati":"gu", "Konkani":"ko", "Malayalam":"ml", "Marathi":"mr", "Nepali":"ne", "Odia":"or", "Punjabi":"pj", "Sanskrit":"san"} + +# Configuration for default channel ID +channel.default="in.ekstep" \ No newline at end of file diff --git a/roles/search-service-deploy/templates/servicify-process.j2 b/roles/search-service-deploy/templates/servicify-process.j2 new file mode 100644 index 0000000..ef010f6 --- /dev/null +++ b/roles/search-service-deploy/templates/servicify-process.j2 @@ -0,0 +1,102 @@ +#!/bin/bash + +# chkconfig: 2345 95 05 +# description: {{ description }} + +# Source function library. +. /lib/lsb/init-functions + +prog="{{ script_name }}" +SCRIPT_DIR="{{ script_dir }}" #/home/ubuntu/ +PIDFILE={{ script_dir }}/$prog.pid +PIDFILE2="{{learner_user_home}}/platform/search/search-manager/RUNNING_PID" +DESC="{{ description }}" +GREP_KEY="{{ grep_key }}" +DAEMON={{ process }} +DAEMON_HOME="{{ process_home }}" +LOGS_HOME="{{learner_user_home}}/platform/service/logs" +APP_HOME="{{ app_home }}" + +#echo "All value sets" +start() { + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'`" ]; then + printf "%s\n" "Process dead but pidfile exists" + else + printf "$prog is already running!\n" + fi + else + printf "%-50s" "Starting $prog ..." + cd $APP_HOME + if [ -z "$DAEMON_HOME" ]; then + start-stop-daemon --start --quiet --background --no-close --name $prog --exec $DAEMON {{ process_args }} >$LOGS_HOME/$prog.log 2>&1 + else + start-stop-daemon --start --quiet --background -d $DAEMON_HOME --exec $DAEMON {{ process_args }} >$LOGS_HOME/$prog.log 2>&1 + fi + sleep 10 + PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'` + if [ -z "$PID" ]; then + printf "[ \e[31mFAIL\033[0m ]\n" + exit 1 + else + echo $PID > $PIDFILE + printf "[ \e[32mOK\033[0m ]\n" + fi + fi +} + +stop() { + printf "%-50s" "Shutting down $prog:" + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE 2>/dev/null + sleep 5 + PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'` + if [ ! -z "$PID" ]; then + printf "[ \e[31mFAIL\033[0m ]\n" + exit 1 + else + rm -f $PIDFILE + rm -f $PIDFILE2 + printf "[ \e[32mOK\033[0m ]\n" + fi + else + printf "[ \e[32mNOT RUNNING\033[0m ]\n" + fi +} + +check_status() { + printf "%-50s" "Checking $prog ..." + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'`" ]; then + printf "%s\n" "Process dead but pidfile exists" + else + printf "[ \e[32mRUNNING\033[0m ]\n" + fi + else + printf "[ \e[31mSTOPPED\033[0m ]\n" + fi +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + check_status + ;; + restart) + stop + start + ;; + *) + echo "Usage: $prog {start|stop|status|restart}" + exit 1 + ;; +esac +exit 0 \ No newline at end of file diff --git a/roles/search-service/defaults/main.yml b/roles/search-service/defaults/main.yml new file mode 100644 index 0000000..3b47bb9 --- /dev/null +++ b/roles/search-service/defaults/main.yml @@ -0,0 +1,14 @@ +learner_user: learning +learner_group: learning +description: LP Search service +service_path: /home/{{learner_user}}/platform/service +script_name: "search-service" +script_dir: "{{ service_path }}" +grep_key: play.core.server.ProdServerStart +process: "/usr/bin/java" +search_root: /home/{{learner_user}}/platform/search +service_args: "-Dconfig.file={{ search_root }}/search-service.conf" +search_home: /home/{{learner_user}}/platform/search/search-manager +process_home: "" +app_home: "{{ search_home }}" +process_args: -- -cp '{{ app_home }}/lib/*' {{ service_args }} play.core.server.ProdServerStart {{ app_home }} \ No newline at end of file diff --git a/roles/search-service/tasks/main.yml b/roles/search-service/tasks/main.yml new file mode 100644 index 0000000..eb4526d --- /dev/null +++ b/roles/search-service/tasks/main.yml @@ -0,0 +1,5 @@ +- name: Setup LP search as service + become: yes + become_user: "{{learner_user}}" + template: src=servicify-process.j2 dest={{ service_path }}/{{ script_name }} mode=755 owner={{ learner_user }} group={{ learner_user }} + diff --git a/roles/search-service/templates/servicify-process.j2 b/roles/search-service/templates/servicify-process.j2 new file mode 100644 index 0000000..2d3c217 --- /dev/null +++ b/roles/search-service/templates/servicify-process.j2 @@ -0,0 +1,102 @@ +#!/bin/bash + +# chkconfig: 2345 95 05 +# description: {{ description }} + +# Source function library. +. /lib/lsb/init-functions + +prog="{{ script_name }}" +SCRIPT_DIR="{{ script_dir }}" #/home/ubuntu/ +PIDFILE={{ script_dir }}/$prog.pid +PIDFILE2="/home/learning/platform/search/search-manager/RUNNING_PID" +DESC="{{ description }}" +GREP_KEY="{{ grep_key }}" +DAEMON={{ process }} +DAEMON_HOME="{{ process_home }}" +LOGS_HOME="/home/learning/platform/service/logs" +APP_HOME="{{ app_home }}" + +#echo "All value sets" +start() { + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'`" ]; then + printf "%s\n" "Process dead but pidfile exists" + else + printf "$prog is already running!\n" + fi + else + printf "%-50s" "Starting $prog ..." + cd $APP_HOME + if [ -z "$DAEMON_HOME" ]; then + start-stop-daemon --start --quiet --background --no-close --name $prog --exec $DAEMON {{ process_args }} >$LOGS_HOME/$prog.log 2>&1 + else + start-stop-daemon --start --quiet --background -d $DAEMON_HOME --exec $DAEMON {{ process_args }} >$LOGS_HOME/$prog.log 2>&1 + fi + sleep 10 + PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'` + if [ -z "$PID" ]; then + printf "[ \e[31mFAIL\033[0m ]\n" + exit 1 + else + echo $PID > $PIDFILE + printf "[ \e[32mOK\033[0m ]\n" + fi + fi +} + +stop() { + printf "%-50s" "Shutting down $prog:" + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE 2>/dev/null + sleep 5 + PID=`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'` + if [ ! -z "$PID" ]; then + printf "[ \e[31mFAIL\033[0m ]\n" + exit 1 + else + rm -f $PIDFILE + rm -f $PIDFILE2 + printf "[ \e[32mOK\033[0m ]\n" + fi + else + printf "[ \e[32mNOT RUNNING\033[0m ]\n" + fi +} + +check_status() { + printf "%-50s" "Checking $prog ..." + if [ -f $PIDFILE ]; then + PID=`cat $PIDFILE` + if [ -z "`pgrep $PID`" ] && [ "$PID" != "`ps aux|grep -vE 'grep|runuser|bash'|grep -w "$GREP_KEY"|awk '{print $2}'`" ]; then + printf "%s\n" "Process dead but pidfile exists" + else + printf "[ \e[32mRUNNING\033[0m ]\n" + fi + else + printf "[ \e[31mSTOPPED\033[0m ]\n" + fi +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + check_status + ;; + restart) + stop + start + ;; + *) + echo "Usage: $prog {start|stop|status|restart}" + exit 1 + ;; +esac +exit 0 \ No newline at end of file diff --git a/roles/setup-kafka/defaults/main.yml b/roles/setup-kafka/defaults/main.yml new file mode 100644 index 0000000..9ab7184 --- /dev/null +++ b/roles/setup-kafka/defaults/main.yml @@ -0,0 +1,145 @@ +env: dev + +ingestion_kafka_topics: + - name: telemetry.ingest + num_of_partitions: 4 + replication_factor: 1 + +ingestion_kafka_overriden_topics: + - name: telemetry.ingest + retention_time: 604800000 + replication_factor: 1 + +processing_kafka_topics: + - name: telemetry.raw + num_of_partitions: 4 + replication_factor: 1 + - name: telemetry.valid + num_of_partitions: 4 + replication_factor: 1 + - name: telemetry.unique + num_of_partitions: 8 + replication_factor: 1 + - name: telemetry.duplicate + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.sink + num_of_partitions: 8 + replication_factor: 1 + - name: telemetry.with_location + num_of_partitions: 8 + replication_factor: 1 + - name: telemetry.de_normalized + num_of_partitions: 4 + replication_factor: 1 + - name: telemetry.log + num_of_partitions: 1 + replication_factor: 1 + - name: analytics.job_queue + num_of_partitions: 1 + replication_factor: 1 + - name: learning.graph.events + num_of_partitions: 1 + replication_factor: 1 + - name: pipeline_metrics + num_of_partitions: 1 + replication_factor: 1 + - name: metrics + num_of_partitions: 1 + replication_factor: 1 + - name: learning.graph.events.fail + num_of_partitions: 1 + replication_factor: 1 + - name: analytics_metrics + num_of_partitions: 1 + replication_factor: 1 + - name: learning.job.request + num_of_partitions: 1 + replication_factor: 1 + - name: learning.job.request.fail + num_of_partitions: 1 + replication_factor: 1 + - name: learning.republish.job.request + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.derived + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.failed + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.malformed + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.extractor.failed + num_of_partitions: 1 + replication_factor: 1 + - name: telemetry.indexer.failed + num_of_partitions: 1 + replication_factor: 1 + +processing_kafka_overriden_topics: + - name: telemetry.raw + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.valid + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.unique + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.duplicate + retention_time: 86400000 + replication_factor: 1 + - name: telemetry.sink + retention_time: 259200000 + replication_factor: 1 + - name: telemetry.with_location + retention_time: 86400000 + replication_factor: 1 + - name: telemetry.de_normalized + retention_time: 86400000 + replication_factor: 1 + - name: telemetry.log + retention_time: 86400000 + replication_factor: 1 + - name: analytics.job_queue + retention_time: 86400000 + replication_factor: 1 + - name: learning.graph.events + retention_time: 1209600000 + replication_factor: 1 + - name: pipeline_metrics + retention_time: 259200000 + replication_factor: 1 + - name: metrics + retention_time: 604800000 + replication_factor: 1 + - name: learning.graph.events.fail + retention_time: 1209600000 + replication_factor: 1 + - name: analytics_metrics + retention_time: 86400000 + replication_factor: 1 + - name: learning.job.request + retention_time: 1209600000 + replication_factor: 1 + - name: learning.job.request.fail + retention_time: 1296000000 + replication_factor: 1 + - name: telemetry.derived + retention_time: 259200000 + replication_factor: 1 + # Error/Failed Topics + - name: telemetry.failed + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.malformed + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.extractor.failed + retention_time: 604800000 + replication_factor: 1 + - name: telemetry.indexer.failed + retention_time: 604800000 + replication_factor: 1 diff --git a/roles/setup-kafka/tasks/main.yml b/roles/setup-kafka/tasks/main.yml new file mode 100644 index 0000000..5080f95 --- /dev/null +++ b/roles/setup-kafka/tasks/main.yml @@ -0,0 +1,29 @@ +- name: create topics + command: /opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic {{env}}.{{item.name}} --partitions {{ item.num_of_partitions }} --replication-factor {{ item.replication_factor }} + with_items: "{{ingestion_kafka_topics}}" + ignore_errors: true + when: kafka_id=="1" + tags: + - ingestion-kafka + +- name: override retention time + command: /opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic {{env}}.{{item.name}} --config retention.ms={{ item.retention_time }} + with_items: "{{ingestion_kafka_overriden_topics}}" + when: kafka_id=="1" and item.retention_time is defined + tags: + - ingestion-kafka + +- name: create topics + command: /opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic {{env}}.{{item.name}} --partitions {{ item.num_of_partitions }} --replication-factor {{ item.replication_factor }} + with_items: "{{processing_kafka_topics}}" + ignore_errors: true + when: kafka_id=="1" + tags: + - processing-kafka + +- name: override retention time + command: /opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic {{env}}.{{item.name}} --config retention.ms={{ item.retention_time }} + with_items: "{{processing_kafka_overriden_topics}}" + when: kafka_id=="1" and item.retention_time is defined + tags: + - processing-kafka diff --git a/roles/tomcat/defaults/main.yml b/roles/tomcat/defaults/main.yml new file mode 100644 index 0000000..4f6b8cb --- /dev/null +++ b/roles/tomcat/defaults/main.yml @@ -0,0 +1,10 @@ +learner_user: learning +learner_group: learning +learner_user_home: /home/{{learner_user}} +tomcat_major_version: 8 +tomcat_minor_version: 0.36 +tomcat_home: "{{learner_user_home}}/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}" +tomcat_tar_ball: "tomcat-{{tomcat_major_version}}/v{{tomcat_major_version}}.{{tomcat_minor_version}}/bin/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}.tar.gz" +tomcat_init_mem: -Xms1024m +tomcat_max_mem: -Xmx4096m + diff --git a/roles/tomcat/tasks/main.yml b/roles/tomcat/tasks/main.yml new file mode 100644 index 0000000..689f32c --- /dev/null +++ b/roles/tomcat/tasks/main.yml @@ -0,0 +1,40 @@ +--- +- name: Download Tomcat + become: yes + become_user: "{{learner_user}}" + get_url: url=http://archive.apache.org/dist/tomcat/{{tomcat_tar_ball}} dest={{learner_user_home}}/ timeout=1000 force=no owner={{learner_user}} group={{learner_user}} + +- name: Extract archive + become: yes + become_user: "{{learner_user}}" + unarchive: src={{learner_user_home}}/apache-tomcat-{{tomcat_major_version}}.{{tomcat_minor_version}}.tar.gz dest={{learner_user_home}} copy=no group={{learner_user}} owner={{learner_user}} creates={{ tomcat_home }} + +- name: set permission + become: yes + file: path={{ tomcat_home }} mode=0755 owner={{learner_user}} group={{learner_user}} recurse=yes + +- name: Symlink install directory + become: yes + file: src={{ tomcat_home }} path=/usr/share/tomcat state=link + ignore_errors: yes + +- name: Change ownership of Tomcat installation + become: yes + become_user: "{{learner_user}}" + file: path=/usr/share/tomcat/ owner={{learner_user}} group={{learner_user}} mode=0775 state=directory recurse=yes + +- name: add templates for learning + become: yes + become_user: "{{learner_user}}" + template: src={{ item.name }} dest={{ item.destination }} + with_items: + - { name: 'server.xml', destination: '/usr/share/tomcat/conf/' } + - { name: 'catalina.j2', destination: '{{ tomcat_home }}/bin/catalina.sh' } + +- name: Install Tomcat init script + become: yes + template: src=tomcat-initscript.j2 dest=/etc/init.d/tomcat mode=755 + +- name: set permission + become: yes + file: path={{ tomcat_home }} mode=0775 owner={{learner_user}} group={{learner_user}} recurse=yes diff --git a/roles/tomcat/templates/catalina.j2 b/roles/tomcat/templates/catalina.j2 new file mode 100644 index 0000000..f4d5da5 --- /dev/null +++ b/roles/tomcat/templates/catalina.j2 @@ -0,0 +1,591 @@ +#!/bin/sh +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Control Script for the CATALINA Server +# +# Environment Variable Prerequisites +# +# Do not set the variables in this script. Instead put them into a script +# setenv.sh in CATALINA_BASE/bin to keep your customizations separate. +# +# CATALINA_HOME May point at your Catalina "build" directory. +# +# CATALINA_BASE (Optional) Base directory for resolving dynamic portions +# of a Catalina installation. If not present, resolves to +# the same directory that CATALINA_HOME points to. +# +# CATALINA_OUT (Optional) Full path to a file where stdout and stderr +# will be redirected. +# Default is $CATALINA_BASE/logs/catalina.out +# +# CATALINA_OPTS (Optional) Java runtime options used when the "start", +# "run" or "debug" command is executed. +# Include here and not in JAVA_OPTS all options, that should +# only be used by Tomcat itself, not by the stop process, +# the version command etc. +# Examples are heap size, GC logging, JMX ports etc. +# +# CATALINA_TMPDIR (Optional) Directory path location of temporary directory +# the JVM should use (java.io.tmpdir). Defaults to +# $CATALINA_BASE/temp. +# +# JAVA_HOME Must point at your Java Development Kit installation. +# Required to run the with the "debug" argument. +# +# JRE_HOME Must point at your Java Runtime installation. +# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME +# are both set, JRE_HOME is used. +# +# JAVA_OPTS (Optional) Java runtime options used when any command +# is executed. +# Include here and not in CATALINA_OPTS all options, that +# should be used by Tomcat and also by the stop process, +# the version command etc. +# Most options should go into CATALINA_OPTS. +# +# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories +# containing some jars in order to allow replacement of APIs +# created outside of the JCP (i.e. DOM and SAX from W3C). +# It can also be used to update the XML parser implementation. +# Defaults to $CATALINA_HOME/endorsed. +# +# JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" +# command is executed. The default is "dt_socket". +# +# JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" +# command is executed. The default is localhost:8000. +# +# JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start" +# command is executed. Specifies whether JVM should suspend +# execution immediately after startup. Default is "n". +# +# JPDA_OPTS (Optional) Java runtime options used when the "jpda start" +# command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS, +# and JPDA_SUSPEND are ignored. Thus, all required jpda +# options MUST be specified. The default is: +# +# -agentlib:jdwp=transport=$JPDA_TRANSPORT, +# address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND +# +# JSSE_OPTS (Optional) Java runtime options used to control the TLS +# implementation when JSSE is used. Default is: +# "-Djdk.tls.ephemeralDHKeySize=2048" +# +# CATALINA_PID (Optional) Path of the file which should contains the pid +# of the catalina startup java process, when start (fork) is +# used +# +# LOGGING_CONFIG (Optional) Override Tomcat's logging config file +# Example (all one line) +# LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" +# +# LOGGING_MANAGER (Optional) Override Tomcat's logging manager +# Example (all one line) +# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +# ----------------------------------------------------------------------------- + +export JAVA_OPTS="{{ tomcat_init_mem }} {{ tomcat_max_mem }} -Dconfig.file=/data/properties/application.conf -XX:NewRatio=3 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Dfile.encoding=UTF8" +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +os400=false +case "`uname`" in +CYGWIN*) cygwin=true;; +Darwin*) darwin=true;; +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ]; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +# Get standard environment variables +PRGDIR=`dirname "$PRG"` + +# Only set CATALINA_HOME if not already set +[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` + +# Copy CATALINA_BASE from CATALINA_HOME if not already set +[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" + +# Ensure that any user defined CLASSPATH variables are not used on startup, +# but allow them to be specified in setenv.sh, in rare case when it is needed. +CLASSPATH= + +if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then + . "$CATALINA_BASE/bin/setenv.sh" +elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then + . "$CATALINA_HOME/bin/setenv.sh" +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"` + [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"` + [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"` + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon +# as this is used as the separator in the classpath and Java provides no +# mechanism for escaping if the same character appears in the path. +case $CATALINA_HOME in + *:*) echo "Using CATALINA_HOME: $CATALINA_HOME"; + echo "Unable to start as CATALINA_HOME contains a colon (:) character"; + exit 1; +esac +case $CATALINA_BASE in + *:*) echo "Using CATALINA_BASE: $CATALINA_BASE"; + echo "Unable to start as CATALINA_BASE contains a colon (:) character"; + exit 1; +esac + +# For OS400 +if $os400; then + # Set job priority to standard for interactive (interactive - 6) by using + # the interactive priority - 6, the helper threads that respond to requests + # will be running at the same priority as interactive jobs. + COMMAND='chgjob job('$JOBNAME') runpty(6)' + system $COMMAND + + # Enable multi threading + export QIBM_MULTI_THREADED=Y +fi + +# Get standard Java environment variables +if $os400; then + # -r will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + . "$CATALINA_HOME"/bin/setclasspath.sh +else + if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then + . "$CATALINA_HOME"/bin/setclasspath.sh + else + echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh" + echo "This file is needed to run this program" + exit 1 + fi +fi + +# Add on extra jar files to CLASSPATH +if [ ! -z "$CLASSPATH" ] ; then + CLASSPATH="$CLASSPATH": +fi +CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar + +if [ -z "$CATALINA_OUT" ] ; then + CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out +fi + +if [ -z "$CATALINA_TMPDIR" ] ; then + # Define the java.io.tmpdir to use for Catalina + CATALINA_TMPDIR="$CATALINA_BASE"/temp +fi + +# Add tomcat-juli.jar to classpath +# tomcat-juli.jar can be over-ridden per instance +if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then + CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar +else + CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar +fi + +# Bugzilla 37848: When no TTY is available, don't output to console +have_tty=0 +if [ "`tty`" != "not a tty" ]; then + have_tty=1 +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` + JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"` + CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"` + CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"` + CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` +fi + +if [ -z "$JSSE_OPTS" ] ; then + JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" +fi +JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS" + +# Set juli LogManager config file if it is present and an override has not been issued +if [ -z "$LOGGING_CONFIG" ]; then + if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then + LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" + else + # Bugzilla 45585 + LOGGING_CONFIG="-Dnop" + fi +fi + +if [ -z "$LOGGING_MANAGER" ]; then + LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +fi + +# Uncomment the following line to make the umask available when using the +# org.apache.catalina.security.SecurityListener +#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`" + +# ----- Execute The Requested Command ----------------------------------------- + +# Bugzilla 37848: only output this if we have a TTY +if [ $have_tty -eq 1 ]; then + echo "Using CATALINA_BASE: $CATALINA_BASE" + echo "Using CATALINA_HOME: $CATALINA_HOME" + echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR" + if [ "$1" = "debug" ] ; then + echo "Using JAVA_HOME: $JAVA_HOME" + else + echo "Using JRE_HOME: $JRE_HOME" + fi + echo "Using CLASSPATH: $CLASSPATH" + if [ ! -z "$CATALINA_PID" ]; then + echo "Using CATALINA_PID: $CATALINA_PID" + fi +fi + +if [ "$1" = "jpda" ] ; then + if [ -z "$JPDA_TRANSPORT" ]; then + JPDA_TRANSPORT="dt_socket" + fi + if [ -z "$JPDA_ADDRESS" ]; then + JPDA_ADDRESS="localhost:8000" + fi + if [ -z "$JPDA_SUSPEND" ]; then + JPDA_SUSPEND="n" + fi + if [ -z "$JPDA_OPTS" ]; then + JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND" + fi + CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS" + shift +fi + +if [ "$1" = "debug" ] ; then + if $os400; then + echo "Debug command not available on OS400" + exit 1 + else + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Djava.security.manager \ + -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + fi + +elif [ "$1" = "run" ]; then + + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + +elif [ "$1" = "start" ] ; then + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + echo "Existing PID file found during start." + if [ -r "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + ps -p $PID >/dev/null 2>&1 + if [ $? -eq 0 ] ; then + echo "Tomcat appears to still be running with PID $PID. Start aborted." + echo "If the following process is not a Tomcat process, remove the PID file and try again:" + ps -f -p $PID + exit 1 + else + echo "Removing/clearing stale PID file." + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "Unable to remove or clear stale PID file. Start aborted." + exit 1 + fi + fi + fi + else + echo "Unable to read PID file. Start aborted." + exit 1 + fi + else + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ ! -w "$CATALINA_PID" ]; then + echo "Unable to remove or write to empty PID file. Start aborted." + exit 1 + fi + fi + fi + fi + fi + + shift + touch "$CATALINA_OUT" + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + else + eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + fi + + if [ ! -z "$CATALINA_PID" ]; then + echo $! > "$CATALINA_PID" + fi + + echo "Tomcat started." + +elif [ "$1" = "stop" ] ; then + + shift + + SLEEP=5 + if [ ! -z "$1" ]; then + echo $1 | grep "[^0-9]" >/dev/null 2>&1 + if [ $? -gt 0 ]; then + SLEEP=$1 + shift + fi + fi + + FORCE=0 + if [ "$1" = "-force" ]; then + shift + FORCE=1 + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + echo "PID file found but no matching process was found. Stop aborted." + exit 1 + fi + else + echo "PID file is empty and has been ignored." + fi + else + echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted." + exit 1 + fi + fi + + eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" stop + + # stop failed. Shutdown port disabled? Try a normal kill. + if [ $? != 0 ]; then + if [ ! -z "$CATALINA_PID" ]; then + echo "The stop command failed. Attempting to signal the process to stop through OS signal." + kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1 + fi + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + while [ $SLEEP -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + # If Tomcat has stopped don't try and force a stop with an empty PID file + FORCE=0 + else + echo "The PID file could not be removed or cleared." + fi + fi + echo "Tomcat stopped." + break + fi + if [ $SLEEP -gt 0 ]; then + sleep 1 + fi + if [ $SLEEP -eq 0 ]; then + echo "Tomcat did not stop in time." + if [ $FORCE -eq 0 ]; then + echo "PID file was not removed." + fi + echo "To aid diagnostics a thread dump has been written to standard out." + kill -3 `cat "$CATALINA_PID"` + fi + SLEEP=`expr $SLEEP - 1 ` + done + fi + fi + + KILL_SLEEP_INTERVAL=5 + if [ $FORCE -eq 1 ]; then + if [ -z "$CATALINA_PID" ]; then + echo "Kill failed: \$CATALINA_PID not set" + else + if [ -f "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + echo "Killing Tomcat with the PID: $PID" + kill -9 $PID + while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "The PID file could not be removed." + fi + fi + echo "The Tomcat process has been killed." + break + fi + if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then + sleep 1 + fi + KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 ` + done + if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then + echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE." + fi + fi + fi + fi + +elif [ "$1" = "configtest" ] ; then + + eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \ + -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap configtest + result=$? + if [ $result -ne 0 ]; then + echo "Configuration error detected!" + fi + exit $result + +elif [ "$1" = "version" ] ; then + + "$_RUNJAVA" \ + -classpath "$CATALINA_HOME/lib/catalina.jar" \ + org.apache.catalina.util.ServerInfo + +else + + echo "Usage: catalina.sh ( commands ... )" + echo "commands:" + if $os400; then + echo " debug Start Catalina in a debugger (not available on OS400)" + echo " debug -security Debug Catalina with a security manager (not available on OS400)" + else + echo " debug Start Catalina in a debugger" + echo " debug -security Debug Catalina with a security manager" + fi + echo " jpda start Start Catalina under JPDA debugger" + echo " run Start Catalina in the current window" + echo " run -security Start in the current window with security manager" + echo " start Start Catalina in a separate window" + echo " start -security Start in a separate window with security manager" + echo " stop Stop Catalina, waiting up to 5 seconds for the process to end" + echo " stop n Stop Catalina, waiting up to n seconds for the process to end" + echo " stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running" + echo " stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running" + echo " configtest Run a basic syntax check on server.xml - check exit code for result" + echo " version What version of tomcat are you running?" + echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined" + exit 1 + +fi diff --git a/roles/tomcat/templates/server.xml b/roles/tomcat/templates/server.xml new file mode 100644 index 0000000..4f5f4b0 --- /dev/null +++ b/roles/tomcat/templates/server.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/roles/tomcat/templates/tomcat-initscript.j2 b/roles/tomcat/templates/tomcat-initscript.j2 new file mode 100755 index 0000000..94cd1df --- /dev/null +++ b/roles/tomcat/templates/tomcat-initscript.j2 @@ -0,0 +1,131 @@ +#!/bin/bash +# +# description: Starts/Stops Apache Tomcat +# +# Tomcat 7 start/stop/status script +# Forked from: https://gist.github.com/valotas/1000094 +# @author: Miglen Evlogiev +# +# Release updates: +# Updated method for gathering pid of the current proccess +# Added usage of CATALINA_BASE +# Added coloring and additional status +# Added check for existence of the tomcat user +# + +#Location of JAVA_HOME (bin files) +#export JAVA_HOME=$JAVA_HOME + +#Add Java binary files to PATH +export PATH=$JAVA_HOME/bin:$PATH + +#CATALINA_HOME is the location of the bin files of Tomcat +export CATALINA_HOME=/usr/share/tomcat + +#CATALINA_BASE is the location of the configuration files of this instance of Tomcat +export CATALINA_BASE=/usr/share/tomcat + +#TOMCAT_USER is the default user of tomcat +export TOMCAT_USER="{{learner_user}}" + +#TOMCAT_USAGE is the message if this script is called without any options +TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" + +#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop +SHUTDOWN_WAIT=20 + +tomcat_pid() { + echo `ps -fe | grep $CATALINA_BASE | grep -v grep | tr -s " "|cut -d" " -f2` +} + +start() { + pid=$(tomcat_pid) + if [ -n "$pid" ] + then + echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" + else + # Start tomcat + echo -e "\e[00;32mStarting tomcat\e[00m" + #ulimit -n 100000 + #umask 007 + #/bin/su -p -s /bin/sh tomcat + cd $CATALINA_HOME + if [ `user_exists $TOMCAT_USER` = "1" ] + then + su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh + else + sh $CATALINA_HOME/bin/startup.sh + fi + status + fi + return 0 +} + +status(){ + pid=$(tomcat_pid) + if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" + else echo -e "\e[00;31mTomcat is not running\e[00m" + fi +} + +stop() { + pid=$(tomcat_pid) + if [ -n "$pid" ] + then + echo -e "\e[00;31mStoping Tomcat\e[00m" + #/bin/su -p -s /bin/sh tomcat + sh $CATALINA_HOME/bin/shutdown.sh + + let kwait=$SHUTDOWN_WAIT + count=0; + until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] + do + echo -n -e "\n\e[00;31mwaiting for processes to exit\e[00m"; + sleep 1 + let count=$count+1; + done + + if [ $count -gt $kwait ]; then + echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" + kill -9 $pid + fi + else + echo -e "\e[00;31mTomcat is not running\e[00m" + fi + + return 0 +} + +user_exists(){ + if id -u $1 >/dev/null 2>&1; then + echo "1" + else + echo "0" + fi +} + +case $1 in + + start) + start + ;; + + stop) + stop + ;; + + restart) + stop + start + ;; + + status) + status + + ;; + + *) + echo -e $TOMCAT_USAGE + ;; +esac +exit 0 diff --git a/roles/yarn/defaults/main.yml b/roles/yarn/defaults/main.yml new file mode 100644 index 0000000..4060075 --- /dev/null +++ b/roles/yarn/defaults/main.yml @@ -0,0 +1,16 @@ +--- +yarn_deploy_dir: /home/ecosystem/.deploy +repo_folder: /home/hduser/Ecosystem-Platform +hadoop_tarball: hadoop-{{hadoop_version}}.tar.gz +hadoop_download_url: https://archive.apache.org/dist/hadoop/common/hadoop-{{hadoop_version}}/{{hadoop_tarball}} +scala_tarball: scala-{{scala_version}}.tgz +scala_download_url: http://www.scala-lang.org/files/archive/{{scala_tarball}} +hadoop_yarn_home: /usr/local/hadoop-{{hadoop_version}} +hadoop_version: 2.7.2 +scala_version: 2.10.4 + +yarn_config_override: true +yarn_vmem_check_enabled: false +yarn_vmem_pmem_ratio: 2.1 +yarn_vcores: 16 +yarn_resource_memory: 20000 diff --git a/roles/yarn/files/truncate_logs.sh b/roles/yarn/files/truncate_logs.sh new file mode 100644 index 0000000..7dddd9d --- /dev/null +++ b/roles/yarn/files/truncate_logs.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Truncate hadoop/yarn userlogs and keep the last 100 lines + +HADOOP_LOGS_HOME=/usr/local/hadoop/logs/userlogs + +for d in $HADOOP_LOGS_HOME/*/*/ ; do (cd $d && tail -n 100 stdout > stdout.tmp && cat stdout.tmp > stdout && rm stdout.tmp); done + +LOGSTASH_LOGS=/var/log/logstash +tail -n 100 $LOGSTASH_LOGS/logstash.stdout > $LOGSTASH_LOGS/logstash.stdout.tmp +cat $LOGSTASH_LOGS/logstash.stdout.tmp > $LOGSTASH_LOGS/logstash.stdout +rm $LOGSTASH_LOGS/logstash.stdout.tmp + +HADOOP_TMP_USERLOGS=/usr/local/hadoop/logs/userlogs + +for g in $HADOOP_TMP_USERLOGS/*/*/ do + cd $g + tail -n 100 stdout > stdout.tmp + cat stdout.tmp > stdout + rm stdout.tmp +done diff --git a/roles/yarn/tasks/common.yml b/roles/yarn/tasks/common.yml new file mode 100644 index 0000000..f2ed89f --- /dev/null +++ b/roles/yarn/tasks/common.yml @@ -0,0 +1,73 @@ +- name: Download and extract hadoop tarball + unarchive: + src: "{{hadoop_download_url}}" + dest: "/usr/local/" + owner: hduser + group: hadoop + creates: "{{hadoop_yarn_home}}" + remote_src: yes + +- name: Creates symlink + file: + src: /usr/local/hadoop-{{hadoop_version}} + dest: /usr/local/hadoop + owner: hduser + group: hadoop + state: link + +- name: creating conf dir + file: + path: "{{hadoop_yarn_home}}/conf" + owner: hduser + group: hadoop + recurse: yes + state: directory + +- name: Templating configs + template: + src: "{{item}}" + dest: "{{hadoop_yarn_home}}/conf/{{item}}" + owner: hduser + group: hadoop + with_items: + - yarn-site.xml + - capacity-scheduler.xml + - core-site.xml + - log4j.properties + - hadoop-env.sh + +- name: Downloading artifacts + get_url: + url: "http://search.maven.org/remotecontent?filepath=org/{{item}}" + dest: "{{hadoop_yarn_home}}/share/hadoop/hdfs/lib/" + owner: hduser + group: hadoop + with_items: + - clapper/grizzled-slf4j_2.10/1.0.1/grizzled-slf4j_2.10-1.0.1.jar + - apache/samza/samza-yarn_2.10/0.8.0/samza-yarn_2.10-0.8.0.jar + - apache/samza/samza-core_2.10/0.8.0/samza-core_2.10-0.8.0.jar + +- name: Download and extract scala + unarchive: + src: "{{scala_download_url}}" + dest: "/usr/local/" + owner: hduser + group: hadoop + remote_src: yes + +- name: Creates symlink + file: + src: "/usr/local/scala-{{scala_version}}" + dest: /usr/local/scala + owner: hduser + group: hadoop + state: link + +- name: copying scala files + copy: + src: "/usr/local/scala-{{scala_version}}/lib/{{item}}" + dest: "{{hadoop_yarn_home}}/share/hadoop/hdfs/lib/" + remote_src: true + with_items: + - scala-compiler.jar + - scala-library.jar diff --git a/roles/yarn/tasks/main.yml b/roles/yarn/tasks/main.yml new file mode 100644 index 0000000..ae96646 --- /dev/null +++ b/roles/yarn/tasks/main.yml @@ -0,0 +1,56 @@ +- name: Debian | Install Maven + apt: + pkg: "{{item}}" + update_cache: yes + state: latest + install_recommends: yes + with_items: + - maven + - git + +# Running common tasks in master +- include: common.yml + +- lineinfile: + dest: /home/hduser/.bashrc + state: present + regexp: '^HADOOP_YARN_HOME' + line: 'HADOOP_YARN_HOME={{hadoop_yarn_home}}' + +- lineinfile: + dest: /home/hduser/.bashrc + state: present + regexp: '^HADOOP_CONF_DIR' + line: 'HADOOP_CONF_DIR=$HADOOP_YARN_HOME/conf' + +- file: + path: "/{{hadoop_yarn_home}}/conf/slaves" + state: touch + +- lineinfile: + dest: "/{{hadoop_yarn_home}}/conf/slaves" + state: present + regexp: "^{{item}}" + line: "{{item}}" + with_items: "{{yarn_slaves}}" + +# Running common tasks in slaves +- name: Running common tasks in slaves + include: common.yml + delegate_to: "{{slave}}" + with_items: "{{yarn_slaves}}" + loop_control: + loop_var: slave + +- name: Copy truncate_files.sh + copy: + src: truncate_logs.sh + dest: /usr/local/bin + mode: 755 + +- name: Add truncate logs to cron + cron: + name: "Truncate yarn logs" + minute: "0" + job: "/usr/local/bin/truncate_logs.sh" + backup: yes diff --git a/roles/yarn/tasks/truncate-logs.yml b/roles/yarn/tasks/truncate-logs.yml new file mode 100644 index 0000000..e0d550a --- /dev/null +++ b/roles/yarn/tasks/truncate-logs.yml @@ -0,0 +1,8 @@ +--- +- name: Copy truncate_files.sh + copy: src=truncate_logs.sh dest=/ mode=755 + become: yes + +- name: Add truncate logs to cron + cron: name="Truncate yarn logs" minute="0" job="/truncate_logs.sh" backup=yes + become: yes \ No newline at end of file diff --git a/roles/yarn/templates/capacity-scheduler.xml b/roles/yarn/templates/capacity-scheduler.xml new file mode 100644 index 0000000..4161b7a --- /dev/null +++ b/roles/yarn/templates/capacity-scheduler.xml @@ -0,0 +1,111 @@ + + + + + yarn.scheduler.capacity.maximum-applications + 10000 + + Maximum number of applications that can be pending and running. + + + + + yarn.scheduler.capacity.maximum-am-resource-percent + 0.5 + + Maximum percent of resources in the cluster which can be used to run + application masters i.e. controls number of concurrent running + applications. + + + + + yarn.scheduler.capacity.resource-calculator + org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator + + The ResourceCalculator implementation to be used to compare + Resources in the scheduler. + The default i.e. DefaultResourceCalculator only uses Memory while + DominantResourceCalculator uses dominant-resource to compare + multi-dimensional resources such as Memory, CPU etc. + + + + + yarn.scheduler.capacity.root.queues + default + + The queues at the this level (root is the root queue). + + + + + yarn.scheduler.capacity.root.default.capacity + 100 + Default queue target capacity. + + + + yarn.scheduler.capacity.root.default.user-limit-factor + 1 + + Default queue user limit a percentage from 0.0 to 1.0. + + + + + yarn.scheduler.capacity.root.default.maximum-capacity + 100 + + The maximum capacity of the default queue. + + + + + yarn.scheduler.capacity.root.default.state + RUNNING + + The state of the default queue. State can be one of RUNNING or STOPPED. + + + + + yarn.scheduler.capacity.root.default.acl_submit_applications + * + + The ACL of who can submit jobs to the default queue. + + + + + yarn.scheduler.capacity.root.default.acl_administer_queue + * + + The ACL of who can administer jobs on the default queue. + + + + + yarn.scheduler.capacity.node-locality-delay + -1 + + Number of missed scheduling opportunities after which the CapacityScheduler + attempts to schedule rack-local containers. + Typically this should be set to number of racks in the cluster, this + feature is disabled by default, set to -1. + + + + diff --git a/roles/yarn/templates/core-site.xml b/roles/yarn/templates/core-site.xml new file mode 100644 index 0000000..d5a0752 --- /dev/null +++ b/roles/yarn/templates/core-site.xml @@ -0,0 +1,7 @@ + + + + fs.http.impl + org.apache.samza.util.hadoop.HttpFileSystem + + diff --git a/roles/yarn/templates/hadoop-env.sh b/roles/yarn/templates/hadoop-env.sh new file mode 100644 index 0000000..ed6afd6 --- /dev/null +++ b/roles/yarn/templates/hadoop-env.sh @@ -0,0 +1 @@ +export JAVA_HOME=/usr/lib/jvm/java-8-oracle diff --git a/roles/yarn/templates/log4j.properties b/roles/yarn/templates/log4j.properties new file mode 100644 index 0000000..4181560 --- /dev/null +++ b/roles/yarn/templates/log4j.properties @@ -0,0 +1,267 @@ +# Copyright 2011 The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Define some default values that can be overridden by system properties +hadoop.root.logger=INFO,console +hadoop.log.dir=. +hadoop.log.file=hadoop.log + +# Define the root logger to the system property "hadoop.root.logger". +log4j.rootLogger=${hadoop.root.logger}, EventCounter + +# Logging Threshold +log4j.threshold=ALL + +# Null Appender +log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender + +# +# Rolling File Appender - cap space usage at 5gb. +# +hadoop.log.maxfilesize=25MB +hadoop.log.maxbackupindex=1 +log4j.appender.RFA=org.apache.log4j.RollingFileAppender +log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file} + +log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize} +log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex} + +log4j.appender.RFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# Daily Rolling File Appender +# + +log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file} + +# Rollver at midnight +log4j.appender.DRFA.DatePattern=.yyyy-MM-dd + +# 30-day backup +log4j.appender.DRFA.MaxBackupIndex=1 +log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# console +# Add "console" to rootlogger above if you want to use this +# + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.target=System.err +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n + +# +# TaskLog Appender +# + +#Default values +hadoop.tasklog.taskid=null +hadoop.tasklog.iscleanup=false +hadoop.tasklog.noKeepSplits=4 +hadoop.tasklog.totalLogFileSize=100 +hadoop.tasklog.purgeLogSplits=true +hadoop.tasklog.logsRetainHours=1 + +log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender +log4j.appender.TLA.taskId=${hadoop.tasklog.taskid} +log4j.appender.TLA.isCleanup=${hadoop.tasklog.iscleanup} +log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize} + +log4j.appender.TLA.layout=org.apache.log4j.PatternLayout +log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n + +# +# HDFS block state change log from block manager +# +# Uncomment the following to suppress normal block state change +# messages from BlockManager in NameNode. +#log4j.logger.BlockStateChange=WARN + +# +#Security appender +# +hadoop.security.logger=INFO,NullAppender +hadoop.security.log.maxfilesize=256MB +hadoop.security.log.maxbackupindex=20 +log4j.category.SecurityLogger=${hadoop.security.logger} +hadoop.security.log.file=SecurityAuth-${user.name}.audit +log4j.appender.RFAS=org.apache.log4j.RollingFileAppender +log4j.appender.RFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.RFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.RFAS.MaxFileSize=${hadoop.security.log.maxfilesize} +log4j.appender.RFAS.MaxBackupIndex=${hadoop.security.log.maxbackupindex} + +# +# Daily Rolling Security appender +# +log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.DRFAS.DatePattern=.yyyy-MM-dd + +# +# hadoop configuration logging +# + +# Uncomment the following line to turn off configuration deprecation warnings. +# log4j.logger.org.apache.hadoop.conf.Configuration.deprecation=WARN + +# +# hdfs audit logging +# +hdfs.audit.logger=INFO,NullAppender +hdfs.audit.log.maxfilesize=25MB +hdfs.audit.log.maxbackupindex=1 +log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger} +log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false +log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.RFAAUDIT.File=${hadoop.log.dir}/hdfs-audit.log +log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.RFAAUDIT.MaxFileSize=${hdfs.audit.log.maxfilesize} +log4j.appender.RFAAUDIT.MaxBackupIndex=${hdfs.audit.log.maxbackupindex} + +# +# mapred audit logging +# +mapred.audit.logger=INFO,NullAppender +mapred.audit.log.maxfilesize=256MB +mapred.audit.log.maxbackupindex=20 +log4j.logger.org.apache.hadoop.mapred.AuditLogger=${mapred.audit.logger} +log4j.additivity.org.apache.hadoop.mapred.AuditLogger=false +log4j.appender.MRAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.MRAUDIT.File=${hadoop.log.dir}/mapred-audit.log +log4j.appender.MRAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.MRAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.MRAUDIT.MaxFileSize=${mapred.audit.log.maxfilesize} +log4j.appender.MRAUDIT.MaxBackupIndex=${mapred.audit.log.maxbackupindex} + +# Custom Logging levels + +#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG +#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG +#log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=DEBUG + +# Jets3t library +log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR + +# +# Event Counter Appender +# Sends counts of logging messages at different severity levels to Hadoop Metrics. +# +log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter + +# +# Job Summary Appender +# +# Use following logger to send summary to separate file defined by +# hadoop.mapreduce.jobsummary.log.file : +# hadoop.mapreduce.jobsummary.logger=INFO,JSA +# +hadoop.mapreduce.jobsummary.logger=${hadoop.root.logger} +hadoop.mapreduce.jobsummary.log.file=hadoop-mapreduce.jobsummary.log +hadoop.mapreduce.jobsummary.log.maxfilesize=256MB +hadoop.mapreduce.jobsummary.log.maxbackupindex=20 +log4j.appender.JSA=org.apache.log4j.RollingFileAppender +log4j.appender.JSA.File=${hadoop.log.dir}/${hadoop.mapreduce.jobsummary.log.file} +log4j.appender.JSA.MaxFileSize=${hadoop.mapreduce.jobsummary.log.maxfilesize} +log4j.appender.JSA.MaxBackupIndex=${hadoop.mapreduce.jobsummary.log.maxbackupindex} +log4j.appender.JSA.layout=org.apache.log4j.PatternLayout +log4j.appender.JSA.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n +log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${hadoop.mapreduce.jobsummary.logger} +log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false + +# +# Yarn ResourceManager Application Summary Log +# +# Set the ResourceManager summary log filename +yarn.server.resourcemanager.appsummary.log.file=rm-appsummary.log +# Set the ResourceManager summary log level and appender +yarn.server.resourcemanager.appsummary.logger=${hadoop.root.logger} +#yarn.server.resourcemanager.appsummary.logger=INFO,RMSUMMARY + +# To enable AppSummaryLogging for the RM, +# set yarn.server.resourcemanager.appsummary.logger to +# ,RMSUMMARY in hadoop-env.sh + +# Appender for ResourceManager Application Summary Log +# Requires the following properties to be set +# - hadoop.log.dir (Hadoop Log directory) +# - yarn.server.resourcemanager.appsummary.log.file (resource manager app summary log filename) +# - yarn.server.resourcemanager.appsummary.logger (resource manager app summary log level and appender) + +log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=${yarn.server.resourcemanager.appsummary.logger} +log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=false +log4j.appender.RMSUMMARY=org.apache.log4j.RollingFileAppender +log4j.appender.RMSUMMARY.File=${hadoop.log.dir}/${yarn.server.resourcemanager.appsummary.log.file} +log4j.appender.RMSUMMARY.MaxFileSize=25MB +log4j.appender.RMSUMMARY.MaxBackupIndex=1 +log4j.appender.RMSUMMARY.layout=org.apache.log4j.PatternLayout +log4j.appender.RMSUMMARY.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n + +# HS audit log configs +#mapreduce.hs.audit.logger=INFO,HSAUDIT +#log4j.logger.org.apache.hadoop.mapreduce.v2.hs.HSAuditLogger=${mapreduce.hs.audit.logger} +#log4j.additivity.org.apache.hadoop.mapreduce.v2.hs.HSAuditLogger=false +#log4j.appender.HSAUDIT=org.apache.log4j.DailyRollingFileAppender +#log4j.appender.HSAUDIT.File=${hadoop.log.dir}/hs-audit.log +#log4j.appender.HSAUDIT.layout=org.apache.log4j.PatternLayout +#log4j.appender.HSAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +#log4j.appender.HSAUDIT.DatePattern=.yyyy-MM-dd + +# Http Server Request Logs +#log4j.logger.http.requests.namenode=INFO,namenoderequestlog +#log4j.appender.namenoderequestlog=org.apache.hadoop.http.HttpRequestLogAppender +#log4j.appender.namenoderequestlog.Filename=${hadoop.log.dir}/jetty-namenode-yyyy_mm_dd.log +#log4j.appender.namenoderequestlog.RetainDays=1 + +#log4j.logger.http.requests.datanode=INFO,datanoderequestlog +#log4j.appender.datanoderequestlog=org.apache.hadoop.http.HttpRequestLogAppender +#log4j.appender.datanoderequestlog.Filename=${hadoop.log.dir}/jetty-datanode-yyyy_mm_dd.log +#log4j.appender.datanoderequestlog.RetainDays=3 + +#log4j.logger.http.requests.resourcemanager=INFO,resourcemanagerrequestlog +#log4j.appender.resourcemanagerrequestlog=org.apache.hadoop.http.HttpRequestLogAppender +#log4j.appender.resourcemanagerrequestlog.Filename=${hadoop.log.dir}/jetty-resourcemanager-yyyy_mm_dd.log +#log4j.appender.resourcemanagerrequestlog.RetainDays=3 + +#log4j.logger.http.requests.jobhistory=INFO,jobhistoryrequestlog +#log4j.appender.jobhistoryrequestlog=org.apache.hadoop.http.HttpRequestLogAppender +#log4j.appender.jobhistoryrequestlog.Filename=${hadoop.log.dir}/jetty-jobhistory-yyyy_mm_dd.log +#log4j.appender.jobhistoryrequestlog.RetainDays=3 + +#log4j.logger.http.requests.nodemanager=INFO,nodemanagerrequestlog +#log4j.appender.nodemanagerrequestlog=org.apache.hadoop.http.HttpRequestLogAppender +#log4j.appender.nodemanagerrequestlog.Filename=${hadoop.log.dir}/jetty-nodemanager-yyyy_mm_dd.log +#log4j.appender.nodemanagerrequestlog.RetainDays=3 diff --git a/roles/yarn/templates/yarn-site.xml b/roles/yarn/templates/yarn-site.xml new file mode 100644 index 0000000..bacb75f --- /dev/null +++ b/roles/yarn/templates/yarn-site.xml @@ -0,0 +1,56 @@ + + + + + yarn.resourcemanager.hostname + + {{resourcemanager}} + + + yarn.nodemanager.resource.memory-mb + {{yarn_resource_memory}} + + + yarn.scheduler.minimum-allocation-mb + 128 + + + mapreduce.job.userlog.retain.hours + 240 + + + yarn.log-aggregation-enable + false + + + yarn.nodemanager.log.retain-seconds + 3600 + + + yarn.nodemanager.resource.cpu-vcores + {{yarn_vcores}} + + {% if yarn_config_override is defined %} + + yarn.nodemanager.vmem-check-enabled + {{yarn_vmem_check_enabled}} + + + yarn.nodemanager.vmem-pmem-ratio + {{yarn_vmem_pmem_ratio}} + + {% endif %} + + diff --git a/roles/zookeeper-upgrade/defaults/main.yml b/roles/zookeeper-upgrade/defaults/main.yml new file mode 100644 index 0000000..6cc9080 --- /dev/null +++ b/roles/zookeeper-upgrade/defaults/main.yml @@ -0,0 +1,18 @@ +--- +zookeeper_version: 3.4.12 +zookeeper_url: http://www.us.apache.org/dist/zookeeper/zookeeper-{{zookeeper_version}}/zookeeper-{{zookeeper_version}}.tar.gz +zookeeper_port: 2181 +zk_jvm_opts: "-Xms128m -Xmx128m" +verify: True +apt_cache_timeout: 3600 +init_limit: 5 +sync_limit: 2 +tick_time: 2000 +zoo_id: 1 +data_dir: /var/lib/zookeeper +log_dir: /var/log/zookeeper +client_port: "{{ zookeeper_port }}" +# List of dict (i.e. {zookeeper_hosts:[{host:,id:},{host:,id:},...]}) +# zookeeper_hosts: +# - host: "{{inventory_hostname}}" # the machine running +# id: 1 diff --git a/roles/zookeeper-upgrade/handlers/main.yml b/roles/zookeeper-upgrade/handlers/main.yml new file mode 100644 index 0000000..3818cc1 --- /dev/null +++ b/roles/zookeeper-upgrade/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: Restart zookeeper + service: name=zookeeper state=restarted diff --git a/roles/zookeeper-upgrade/tasks/Debian.yml b/roles/zookeeper-upgrade/tasks/Debian.yml new file mode 100644 index 0000000..c0b7efc --- /dev/null +++ b/roles/zookeeper-upgrade/tasks/Debian.yml @@ -0,0 +1,41 @@ +--- +- name: Update apt cache + apt: update_cache=yes cache_valid_time={{apt_cache_timeout}} + +- name: Apt install required system packages. + apt: pkg={{item}} state=present + with_items: + - zookeeper + - zookeeperd + +- name: Registering server_id + set_fact: + server_id: "{% for servername in play_hosts %}{% if inventory_hostname==servername %}{{ loop.index }}{% endif %}{% endfor %}" + +- name: Overwrite myid file. + template: src=myid.j2 dest=/etc/zookeeper/conf/myid + notify: + - Restart zookeeper + +- name: Overwrite log4j file. + template: src=log4j.properties.j2 dest=/etc/zookeeper/conf/log4j.properties + notify: + - Restart zookeeper + +- name: Overwrite env file. + template: src=environment.j2 dest=/etc/zookeeper/conf/environment + notify: + - Restart zookeeper + +- name: Overwrite default config file + template: src=zoo.cfg.j2 dest=/etc/zookeeper/conf/zoo.cfg + notify: + - Restart zookeeper + +- name: Start zookeeper service + service: name=zookeeper state=started enabled=yes + +- name: wait for zookeeper port + wait_for: host={{zookeeper_listen_address| default('localhost')}} port={{zookeeper_port}} state=started timeout=30 + when: verify + diff --git a/roles/zookeeper-upgrade/tasks/RedHat.yml b/roles/zookeeper-upgrade/tasks/RedHat.yml new file mode 100644 index 0000000..379b03e --- /dev/null +++ b/roles/zookeeper-upgrade/tasks/RedHat.yml @@ -0,0 +1,53 @@ +--- +- file: path=/opt/src state=directory +- file: path={{zookeeper_dir}} state=directory + +- name: Download zookeeper version. + get_url: url={{zookeeper_url}} dest=/opt/src/zookeeper-{{zookeeper_version}}.tar.gz + tags: bootstrap + +- name: Install OS Packages + yum: name={{ item }} state=present + with_items: + - libselinux-python + +- name: Unpack tarball. + command: tar zxf /opt/src/zookeeper-{{zookeeper_version}}.tar.gz --strip-components=1 chdir={{zookeeper_dir}} creates={{zookeeper_dir}}/bin + tags: bootstrap + +- group: name=zookeeper system=yes +- user: name=zookeeper group=zookeeper system=yes + +- name: Change ownership on zookeeper directory. + file: path={{zookeeper_dir}} state=directory owner=zookeeper group=zookeeper recurse=yes + tags: bootstrap + +- name: Create zookeeper data folder. + file: path={{data_dir}} state=directory recurse=yes owner=zookeeper group=zookeeper + tags: bootstrap + +- name: Create zookeeper logs folder. + file: path={{log_dir}} state=directory recurse=yes owner=zookeeper group=zookeeper + tags: bootstrap + +- name: Upstart script. + template: src=zookeeper.conf.j2 dest=/etc/init/zookeeper.conf + tags: deploy + notify: + - Restart zookeeper + +- name: Write myid file. + template: src=myid.j2 dest={{data_dir}}/myid owner=zookeeper group=zookeeper + tags: deploy + notify: + - Restart zookeeper + +- name: Configure zookeeper + template: src=zoo.cfg.j2 dest={{ zookeeper_dir }}/conf/zoo.cfg owner=zookeeper group=zookeeper + tags: deploy + notify: + - Restart zookeeper + +- name: Start zookeeper + service: name=zookeeper state=started + tags: deploy diff --git a/roles/zookeeper-upgrade/tasks/main.yml b/roles/zookeeper-upgrade/tasks/main.yml new file mode 100644 index 0000000..3e8a8c0 --- /dev/null +++ b/roles/zookeeper-upgrade/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- include: Debian.yml + when: ansible_os_family == 'Debian' + +- include: RedHat.yml + when: ansible_os_family == 'RedHat' diff --git a/roles/zookeeper-upgrade/templates/environment.j2 b/roles/zookeeper-upgrade/templates/environment.j2 new file mode 100644 index 0000000..efa6405 --- /dev/null +++ b/roles/zookeeper-upgrade/templates/environment.j2 @@ -0,0 +1,20 @@ +NAME=zookeeper +ZOOCFGDIR=/etc/$NAME/conf + +# TODO this is really ugly +# How to find out, which jars are needed? +# seems, that log4j requires the log4j.properties file to be in the classpath +CLASSPATH="$ZOOCFGDIR:/usr/share/java/jline.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/netty.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-log4j12.jar:/usr/share/java/zookeeper.jar" + +ZOOCFG="$ZOOCFGDIR/zoo.cfg" +ZOO_LOG_DIR=/var/log/$NAME +USER=$NAME +GROUP=$NAME +PIDDIR=/var/run/$NAME +PIDFILE=$PIDDIR/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +JAVA=/usr/bin/java +ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" +ZOO_LOG4J_PROP="WARN,ROLLINGFILE" +JMXLOCALONLY=false +JAVA_OPTS="{{zk_jvm_opts}}" diff --git a/roles/zookeeper-upgrade/templates/log4j.properties.j2 b/roles/zookeeper-upgrade/templates/log4j.properties.j2 new file mode 100644 index 0000000..4b68d06 --- /dev/null +++ b/roles/zookeeper-upgrade/templates/log4j.properties.j2 @@ -0,0 +1,52 @@ +# +# ZooKeeper Logging Configuration +# + +# Format is " (, )+ + +log4j.rootLogger=${zookeeper.root.logger} +# log4j.rootLogger = WARN,ROLLINGFILE + +# Example: console appender only +# log4j.rootLogger=INFO, CONSOLE + +# Example with rolling log file +#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE + +# Example with rolling log file and tracing +#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE + +# +# Log INFO level and above messages to the console +# +# log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +# log4j.appender.CONSOLE.Threshold=WARN +# log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +# log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + +# +# Add ROLLINGFILE to rootLogger to get log file output +# Log DEBUG level and above messages to a log file +log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender +log4j.appender.ROLLINGFILE.Threshold=WARN +log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/zookeeper.log + +# Max log file size of 10MB +log4j.appender.ROLLINGFILE.MaxFileSize=10MB +# uncomment the next line to limit number of backup files +#log4j.appender.ROLLINGFILE.MaxBackupIndex=10 + +log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n + + +# +# Add TRACEFILE to rootLogger to get log file output +# Log DEBUG level and above messages to a log file +# log4j.appender.TRACEFILE=org.apache.log4j.FileAppender +# log4j.appender.TRACEFILE.Threshold=WARN +# log4j.appender.TRACEFILE.File=${zookeeper.log.dir}/zookeeper_trace.log + +# log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout +### Notice we are including log4j's NDC here (%x) +# log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n diff --git a/roles/zookeeper-upgrade/templates/myid.j2 b/roles/zookeeper-upgrade/templates/myid.j2 new file mode 100644 index 0000000..d0b47f0 --- /dev/null +++ b/roles/zookeeper-upgrade/templates/myid.j2 @@ -0,0 +1 @@ +{{ server_id }} diff --git a/roles/zookeeper-upgrade/templates/zoo.cfg.j2 b/roles/zookeeper-upgrade/templates/zoo.cfg.j2 new file mode 100644 index 0000000..70b1e85 --- /dev/null +++ b/roles/zookeeper-upgrade/templates/zoo.cfg.j2 @@ -0,0 +1,12 @@ +tickTime={{ tick_time }} +dataDir={{ data_dir }} +dataLogDir={{ log_dir }} +clientPort={{ client_port }} +initLimit={{ init_limit }} +syncLimit={{ sync_limit }} + + +{% for host in groups['zookeeper'] %} +server.{{hostvars[host]['server_id']}}={{hostvars[host]['ansible_eth0']['ipv4']['address']}}:2888:3888 +{% endfor %} + diff --git a/roles/zookeeper-upgrade/templates/zookeeper.conf.j2 b/roles/zookeeper-upgrade/templates/zookeeper.conf.j2 new file mode 100644 index 0000000..6dedd6d --- /dev/null +++ b/roles/zookeeper-upgrade/templates/zookeeper.conf.j2 @@ -0,0 +1,17 @@ +description "ZooKeeper" + +limit nofile 32768 32768 + +start on runlevel [2345] +stop on [!12345] + +respawn +respawn limit 2 5 + +umask 007 + +kill timeout 300 + +script + su -c "{{zookeeper_dir}}/bin/zkServer.sh start-foreground > /var/log/zookeeper/init-zookeeper.log" zookeeper +end script diff --git a/samza_jobs_alert.yml b/samza_jobs_alert.yml new file mode 100644 index 0000000..b3b7fa4 --- /dev/null +++ b/samza_jobs_alert.yml @@ -0,0 +1,7 @@ +--- +- hosts: lp-yarn-master + tasks: + - command: ./samza_alerts.sh + args: + chdir: /home/hduser + become: yes diff --git a/samza_logs_provision.yml b/samza_logs_provision.yml new file mode 100644 index 0000000..4c2833f --- /dev/null +++ b/samza_logs_provision.yml @@ -0,0 +1,6 @@ +--- +- hosts: dp-yarn-slave + become: yes + tasks: + - name: copy the backup script to yarn slaves + copy: src=resources/upload_samza_logs dest="{{script_path}}/upload_samza_logs.sh" mode=755 diff --git a/ssh.yml b/ssh.yml new file mode 100644 index 0000000..cdb67c9 --- /dev/null +++ b/ssh.yml @@ -0,0 +1,14 @@ +--- +- hosts: "{{ remote }}" + become: yes + roles: + - add_user + tags: + - add-user + +- hosts: "{{ remote }}" + become: yes + tasks: + - user: name="{{ ssh_user }}" state=absent remove=yes + tags: + - delete-user \ No newline at end of file

    dF(CcdAQ*QKIj@MW&PP|rS)*UFvFqd*z3g>l& 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 +[EveryThingShouldBeVirtual]: +[Ansible]: +[Cassandra]: diff --git a/roles/cassandra-backup/handlers/main.yml b/roles/cassandra-backup/handlers/main.yml new file mode 100755 index 0000000..c6f499a --- /dev/null +++ b/roles/cassandra-backup/handlers/main.yml @@ -0,0 +1,6 @@ +--- +# handlers file for ansible-cassandra +- name: "restart cassandra" + service: + name: "cassandra" + state: "restarted" diff --git a/roles/cassandra-backup/meta/main.yml b/roles/cassandra-backup/meta/main.yml new file mode 100644 index 0000000..23b18a8 --- /dev/null +++ b/roles/cassandra-backup/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - azure-cli \ No newline at end of file diff --git a/roles/cassandra-backup/tasks/main.yml b/roles/cassandra-backup/tasks/main.yml new file mode 100755 index 0000000..8c36a65 --- /dev/null +++ b/roles/cassandra-backup/tasks/main.yml @@ -0,0 +1,47 @@ +- name: Create the directory + become: yes + file: path=/data/cassandra/backup state=directory recurse=yes + +- name: copy the backup script + become: yes + template: src=cassandra_backup.j2 dest=/data/cassandra/backup/cassandra_backup.py mode=0755 + +- set_fact: + cassandra_backup_gzip_file_name: "cassandra-backup-{{ lookup('pipe', 'date +%Y%m%d') }}" + +- set_fact: + cassandra_backup_gzip_file_path: "{{ cassandra_backup_dir }}/{{ cassandra_backup_gzip_file_name }}.tar.gz" + +- name: run the backup script + become: yes + shell: ./cassandra_backup.py "{{ cassandra_backup_gzip_file_name }}" + args: + chdir: /data/cassandra/backup + async: 3600 + poll: 10 + +- name: Check doc_root path + shell: ls -all /data/cassandra/backup/ + register: doc_data + +- name: print doc_root to console + debug: + var: doc_data + +- name: Ensure azure blob storage container exists + command: az storage container create --name {{ cassandra_backup_azure_container_name }} + ignore_errors: true + environment: + AZURE_STORAGE_ACCOUNT: "{{ cassandra_backup_azure_storage_account_name }}" + AZURE_STORAGE_KEY: "{{ cassandra_backup_azure_storage_access_key }}" + +- name: Upload to azure blob storage + command: az storage blob upload --name "{{ cassandra_backup_gzip_file_name }}".tar.gz --file {{ cassandra_backup_gzip_file_path }} --container-name {{ cassandra_backup_azure_container_name }} + environment: + AZURE_STORAGE_ACCOUNT: "{{ cassandra_backup_azure_storage_account_name }}" + AZURE_STORAGE_KEY: "{{ cassandra_backup_azure_storage_access_key }}" + async: 3600 + poll: 10 + +- name: clean up backup dir after upload + file: path="{{ cassandra_backup_dir }}" state=absent \ No newline at end of file diff --git a/roles/cassandra-backup/templates/cassandra_backup.j2 b/roles/cassandra-backup/templates/cassandra_backup.j2 new file mode 100644 index 0000000..b077bc9 --- /dev/null +++ b/roles/cassandra-backup/templates/cassandra_backup.j2 @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +# Author: Rajesh Rajendran + +''' +Create a snapshot and create tar ball in targetdirectory name + +usage: script snapshot_name + +eg: ./cassandra_backup.py my_snapshot +''' + +from os import path, walk, sep, system, getcwd, makedirs +from argparse import ArgumentParser +from shutil import rmtree, ignore_patterns, copytree +from re import match, compile +from sys import exit +from tempfile import mkdtemp + +parser = ArgumentParser(description="Create a snapshot and create tar ball inside tardirectory") +parser.add_argument("-d","--datadirectory", metavar="datadir", default='/var/lib/cassandra/data', help="path to create the tarball. Default /var/lib/cassadra/data") +parser.add_argument("snapshotname", help="name in which you want to take the snapshot") +parser.add_argument("-t","--tardirectory", metavar="tardir", default=getcwd(), help="path to create the tarball. Default {}".format(getcwd())) +args = parser.parse_args() + +# Create temporary directory to copy data +tmpdir=mkdtemp() +makedirs(tmpdir+sep+"cassandra_backup") + +def copy(): + ''' + Copying the data sanpshots to the target directory + ''' + root_levels = args.datadirectory.count(sep) + ignore_list = compile(tmpdir+sep+"cassandra_backup"+sep+'(system|system|systemtauth|system_traces|system_schema|system_distributed)') + + try: + for root, dirs, files in walk(args.datadirectory): + root_target_dir=tmpdir+sep+"cassandra_backup"+sep+sep.join(root.split(sep)[root_levels+1:-2]) + if match(ignore_list, root_target_dir): + continue + if root.split(sep)[-1] == args.snapshotname: + copytree(src=root, dst=root_target_dir, ignore=ignore_patterns('.*')) + except Exception as e: + print(e) + +# Creating schema +command = "cqlsh -e 'DESC SCHEMA' > {}/cassandra_backup/db_schema.cql".format(tmpdir) +rc = system(command) +if rc != 0: + print("Couldn't backup schema, exiting...") + exit(1) +print("Schema backup completed. saved in {}/cassandra_backup/db_schema.sql".format(tmpdir)) +# Cleaning all old snapshots +command = "nodetool clearsnapshot" +system(command) +# Creating snapshots +command = "nodetool snapshot -t {}".format(args.snapshotname) +rc = system(command) +if rc == 0: + print("Snapshot taken.") + copy() + print("Making a tarball: {}.tar.gz".format(args.snapshotname)) + command = "cd {} && tar -czvf {}/{}.tar.gz *".format(tmpdir, args.tardirectory, args.snapshotname) + system(command) + # Cleaning up backup directory + rmtree(tmpdir) + print("Cassandra backup completed and stored in {}/{}.tar.gz".format(args.tardirectory,args.snapshotname)) \ No newline at end of file diff --git a/roles/cassandra-backup/vars/main.yml b/roles/cassandra-backup/vars/main.yml new file mode 100644 index 0000000..569e432 --- /dev/null +++ b/roles/cassandra-backup/vars/main.yml @@ -0,0 +1 @@ +cassandra_root_dir: '/etc/cassandra' \ No newline at end of file diff --git a/roles/cassandra-db-update/defaults/main.yml b/roles/cassandra-db-update/defaults/main.yml new file mode 100644 index 0000000..734a8d9 --- /dev/null +++ b/roles/cassandra-db-update/defaults/main.yml @@ -0,0 +1,5 @@ +cql_path: cqlsh + +content_keyspace_name: "{{ env }}_content_store" +orchestrator_keyspace_name: "{{ env }}_script_store" +hierarchy_keyspace_name: "{{ env }}_hierarchy_store" \ No newline at end of file diff --git a/roles/cassandra-db-update/tasks/main.yml b/roles/cassandra-db-update/tasks/main.yml new file mode 100644 index 0000000..a2c98d4 --- /dev/null +++ b/roles/cassandra-db-update/tasks/main.yml @@ -0,0 +1,10 @@ +- name: Copy DB script + become: yes + template: + src: "data.cql.j2" + dest: "/tmp/lp-data.cql" + mode: 0755 + +- name: run cql + become: yes + raw: /bin/bash -c 'cqlsh -f /tmp/lp-data.cql' \ No newline at end of file diff --git a/roles/cassandra-db-update/templates/data.cql.j2 b/roles/cassandra-db-update/templates/data.cql.j2 new file mode 100644 index 0000000..b2ca410 --- /dev/null +++ b/roles/cassandra-db-update/templates/data.cql.j2 @@ -0,0 +1,35 @@ +CREATE KEYSPACE IF NOT EXISTS {{ content_keyspace_name }} WITH replication = { + 'class': 'SimpleStrategy', + 'replication_factor': '1' +}; + +CREATE TABLE IF NOT EXISTS {{ content_keyspace_name }}.content_data ( + content_id text, + last_updated_on timestamp, + body blob, + oldBody blob, + stageIcons blob, + PRIMARY KEY (content_id) +); + +ALTER TABLE {{ content_keyspace_name }}.content_data +ADD screenshots blob; + +CREATE KEYSPACE IF NOT EXISTS {{ orchestrator_keyspace_name }} WITH replication = { + 'class': 'SimpleStrategy', + 'replication_factor': '1' +}; + +CREATE TABLE IF NOT EXISTS {{ orchestrator_keyspace_name }}.script_data ( + name text, + type text, + reqmap text, + PRIMARY KEY (name) +); + +CREATE TABLE IF NOT EXISTS {{ content_keyspace_name }}.question_data ( + question_id text, + last_updated_on timestamp, + body blob, + PRIMARY KEY (question_id) +); \ No newline at end of file diff --git a/roles/cassandra-db-update/templates/dialcode.cql.j2 b/roles/cassandra-db-update/templates/dialcode.cql.j2 new file mode 100644 index 0000000..d555087 --- /dev/null +++ b/roles/cassandra-db-update/templates/dialcode.cql.j2 @@ -0,0 +1,34 @@ +CREATE KEYSPACE IF NOT EXISTS {{ dialcode_keyspace_name }} WITH replication = { + 'class': 'SimpleStrategy', + 'replication_factor': '1' +}; + +CREATE TABLE IF NOT EXISTS {{ dialcode_keyspace_name }}.dial_code ( + identifier text, + dialcode_index double, + publisher text, + channel text, + batchCode text, + metadata text, + status text, + generated_on text, + published_on text, + PRIMARY KEY (identifier) +); + +CREATE TABLE IF NOT EXISTS {{ dialcode_keyspace_name }}.system_config ( + prop_key text, + prop_value text, + PRIMARY KEY (prop_key) +); + +INSERT INTO {{ dialcode_keyspace_name }}.system_config(prop_key,prop_value) values('dialcode_max_index','1') IF NOT EXISTS; + +CREATE TABLE IF NOT EXISTS {{ dialcode_keyspace_name }}.publisher ( + identifier text, + name text, + channel text, + created_on text, + updated_on text, + PRIMARY KEY (identifier) +); diff --git a/roles/es6/LICENSE b/roles/es6/LICENSE new file mode 100644 index 0000000..0455cac --- /dev/null +++ b/roles/es6/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2012-2016 Elasticsearch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/roles/es6/README.md b/roles/es6/README.md new file mode 100644 index 0000000..85f97ac --- /dev/null +++ b/roles/es6/README.md @@ -0,0 +1,415 @@ +# ansible-elasticsearch +[![Ansible Galaxy](https://img.shields.io/badge/ansible--galaxy-elastic.elasticsearch-blue.svg)](https://galaxy.ansible.com/elastic/elasticsearch/) + +**THIS ROLE IS FOR 6.x, 5.x. FOR 2.x SUPPORT PLEASE USE THE 2.x BRANCH.** + +Ansible role for 6.x/5.x Elasticsearch. Currently this works on Debian and RedHat based linux systems. Tested platforms are: + +* Ubuntu 14.04/16.04 +* Debian 8 +* Centos 7 + +The latest Elasticsearch versions of 6.x are actively tested. **Only Ansible versions > 2.3.2 are supported, as this is currently the only version tested.** + +##### Dependency +This role uses the json_query filter which [requires jmespath](https://github.com/ansible/ansible/issues/24319) on the local machine. + +## Usage + +Create your Ansible playbook with your own tasks, and include the role elasticsearch. You will have to have this repository accessible within the context of playbook, e.g. + +e.g. + +``` +cd /my/repos/ +git clone https://github.com/elastic/ansible-elasticsearch.git +cd /my/ansible/playbook +mkdir -p roles +ln -s /my/repos/ansible-elasticsearch ./roles/elasticsearch +``` + +Then create your playbook yaml adding the role elasticsearch. By default, the user is only required to specify a unique es_instance_name per role application. This should be unique per node. +The application of the elasticsearch role results in the installation of a node on a host. + +The simplest configuration therefore consists of: + +``` +- name: Simple Example + hosts: localhost + roles: + - { role: elasticsearch, es_instance_name: "node1" } + vars: +``` + +The above installs a single node 'node1' on the hosts 'localhost'. + +This role also uses [Ansible tags](http://docs.ansible.com/ansible/playbooks_tags.html). Run your playbook with the `--list-tasks` flag for more information. + +### Basic Elasticsearch Configuration + +All Elasticsearch configuration parameters are supported. This is achieved using a configuration map parameter 'es_config' which is serialized into the elasticsearch.yml file. +The use of a map ensures the Ansible playbook does not need to be updated to reflect new/deprecated/plugin configuration parameters. + +In addition to the es_config map, several other parameters are supported for additional functions e.g. script installation. These can be found in the role's defaults/main.yml file. + +The following illustrates applying configuration parameters to an Elasticsearch instance. By default, Elasticsearch 5.1.2is installed. + +``` +- name: Elasticsearch with custom configuration + hosts: localhost + roles: + #expand to all available parameters + - { role: elasticsearch, es_instance_name: "node1", es_data_dirs: "/opt/elasticsearch/data", es_log_dir: "/opt/elasticsearch/logs", + es_config: { + node.name: "node1", + cluster.name: "custom-cluster", + discovery.zen.ping.unicast.hosts: "localhost:9301", + http.port: 9201, + transport.tcp.port: 9301, + node.data: false, + node.master: true, + bootstrap.memory_lock: true, + } + } + vars: + es_scripts: false + es_templates: false + es_version_lock: false + es_heap_size: 1g + es_api_port: 9201 +``` + +Whilst the role installs Elasticsearch with the default configuration parameters, the following should be configured to ensure a cluster successfully forms: + +* ```es_config['http.port']``` - the http port for the node +* ```es_config['transport.tcp.port']``` - the transport port for the node +* ```es_config['discovery.zen.ping.unicast.hosts']``` - the unicast discovery list, in the comma separated format ```":,:"``` (typically the clusters dedicated masters) +* ```es_config['network.host']``` - sets both network.bind_host and network.publish_host to the same host value. The network.bind_host setting allows to control the host different network components will bind on. + +The network.publish_host setting allows to control the host the node will publish itself within the cluster so other nodes will be able to connect to it. + +See https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html for further details on default binding behaviour and available options. +The role makes no attempt to enforce the setting of these are requires users to specify them appropriately. IT is recommended master nodes are listed and thus deployed first where possible. + +A more complex example: + +``` +- name: Elasticsearch with custom configuration + hosts: localhost + roles: + #expand to all available parameters + - { role: elasticsearch, es_instance_name: "node1", es_data_dirs: "/opt/elasticsearch/data", es_log_dir: "/opt/elasticsearch/logs", + es_config: { + node.name: "node1", + cluster.name: "custom-cluster", + discovery.zen.ping.unicast.hosts: "localhost:9301", + http.port: 9201, + transport.tcp.port: 9301, + node.data: false, + node.master: true, + bootstrap.memory_lock: true, + } + } + vars: + es_scripts: false + es_templates: false + es_version_lock: false + es_heap_size: 1g + es_start_service: false + es_plugins_reinstall: false + es_api_port: 9201 + es_plugins: + - plugin: ingest-geoip + proxy_host: proxy.example.com + proxy_port: 8080 +``` + +#### Important Note + +**The role uses es_api_host and es_api_port to communicate with the node for actions only achievable via http e.g. to install templates and to check the NODE IS ACTIVE. These default to "localhost" and 9200 respectively. +If the node is deployed to bind on either a different host or port, these must be changed.** + +### Multi Node Server Installations + +The application of the elasticsearch role results in the installation of a node on a host. Specifying the role multiple times for a host therefore results in the installation of multiple nodes for the host. + +An example of a two server deployment is shown below. The first server holds the master and is thus declared first. Whilst not mandatory, this is recommended in any multi node cluster configuration. The second server hosts two data nodes. + +**Note the structure of the below playbook for the data nodes. Whilst a more succinct structures are possible which allow the same role to be applied to a host multiple times, we have found the below structure to be the most reliable with respect to var behaviour. This is the tested approach.** + +``` +- hosts: master_nodes + roles: + - { role: elasticsearch, es_instance_name: "node1", es_heap_size: "1g", + es_config: { + cluster.name: "test-cluster", + discovery.zen.ping.unicast.hosts: "elastic02:9300", + http.port: 9200, + transport.tcp.port: 9300, + node.data: false, + node.master: true, + bootstrap.memory_lock: false, + } + } + vars: + es_scripts: false + es_templates: false + es_version_lock: false + ansible_user: ansible + es_plugins: + - plugin: ingest-geoip + + + +- hosts: data_nodes + roles: + - { role: elasticsearch, es_instance_name: "node1", es_data_dirs: "/opt/elasticsearch", + es_config: { + discovery.zen.ping.unicast.hosts: "elastic02:9300", + http.port: 9200, + transport.tcp.port: 9300, + node.data: true, + node.master: false, + bootstrap.memory_lock: false, + cluster.name: "test-cluster" + } + } + vars: + es_scripts: false + es_templates: false + es_version_lock: false + ansible_user: ansible + es_api_port: 9200 + es_plugins: + - plugin: ingest-geoip + + +- hosts: data_nodes + roles: + - { role: elasticsearch, es_instance_name: "node2", es_api_port:9201, + es_config: { + discovery.zen.ping.unicast.hosts: "elastic02:9300", + http.port: 9201, + transport.tcp.port: 9301, + node.data: true, + node.master: false, + bootstrap.memory_lock: false, + cluster.name: "test-cluster", + } + } + vars: + es_scripts: false + es_templates: false + es_version_lock: false + es_api_port: 9201 + ansible_user: ansible + es_plugins: + - plugin: ingest-geoip + +``` + +Parameters can additionally be assigned to hosts using the inventory file if desired. + +Make sure your hosts are defined in your ```inventory``` file with the appropriate ```ansible_ssh_host```, ```ansible_ssh_user``` and ```ansible_ssh_private_key_file``` values. + +Then run it: + +``` +ansible-playbook -i hosts ./your-playbook.yml +``` + +### Installing X-Pack Features + +X-Pack features, such as Security, are supported. This feature is currently experimental. To enable X-Pack set the parameter `es_enable_xpack` to true and list the required features in the parameter `es_xpack_features`. + +The parameter `es_xpack_features` by default enables all features i.e. it defaults to ["alerting","monitoring","graph","security","ml"] + +The following additional parameters allow X-Pack to be configured: + +* ```es_message_auth_file``` System Key field to allow message authentication. This file should be placed in the 'files' directory. +* ```es_xpack_custom_url``` Url from which X-Pack can be downloaded. This can be used for installations in isolated environments where the elastic.co repo is not accessible. e.g. ```es_xpack_custom_url: "https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.5.1.zip"``` +* ```es_role_mapping``` Role mappings file declared as yml as described [here](https://www.elastic.co/guide/en/x-pack/current/mapping-roles.html) + + +``` +es_role_mapping: + power_user: + - "cn=admins,dc=example,dc=com" + user: + - "cn=users,dc=example,dc=com" + - "cn=admins,dc=example,dc=com" +``` + +* ```es_users``` - Users can be declared here as yml. Two sub keys 'native' and 'file' determine the realm under which realm the user is created. Beneath each of these keys users should be declared as yml entries. e.g. + +``` +es_users: + native: + kibana4_server: + password: changeMe + roles: + - kibana4_server + file: + es_admin: + password: changeMe + roles: + - admin + testUser: + password: changeMeAlso! + roles: + - power_user + - user +``` + + +* ```es_roles``` - Elasticsearch roles can be declared here as yml. Two sub keys 'native' and 'file' determine how the role is created i.e. either through a file or http(native) call. Beneath each key list the roles with appropriate permissions, using the file based format described [here] (https://www.elastic.co/guide/en/x-pack/current/file-realm.html) e.g. + +``` +es_roles: + file: + admin: + cluster: + - all + indices: + - names: '*' + privileges: + - all + power_user: + cluster: + - monitor + indices: + - names: '*' + privileges: + - all + user: + indices: + - names: '*' + privileges: + - read + kibana4_server: + cluster: + - monitor + indices: + - names: '.kibana' + privileges: + - all + native: + logstash: + cluster: + - manage_index_templates + indices: + - names: 'logstash-*' + privileges: + - write + - delete + - create_index +``` + +* ```es_xpack_license``` - X-Pack license. The license is a json blob. Set the variable directly (possibly protected by Ansible vault) or from a file in the Ansible project on the control machine via a lookup: + +``` +es_xpack_license: "{{ lookup('file', playbook_dir + '/files/' + es_cluster_name + '/license.json') }}" +``` + +X-Pack configuration parameters can be added to the elasticsearch.yml file using the normal `es_config` parameter. + +For a full example see [here](https://github.com/elastic/ansible-elasticsearch/blob/master/test/integration/xpack.yml) + +#### Important Note for Native Realm Configuration + +In order for native users and roles to be configured, the role calls the Elasticsearch API. Given security is installed this requires definition of two parameters: + +* ```es_api_basic_auth_username``` - admin username +* ```es_api_basic_auth_password``` - admin password + +These can either be set to a user declared in the file based realm, with admin permissions, or the default "elastic" superuser (default password is changeme). + + +### Additional Configuration + +In addition to es_config, the following parameters allow the customization of the Java and Elasticsearch versions as well as the role behaviour. Options include: + +* ```es_major_version``` Should be consistent with es_version. For versions >= 5.0 and < 6.0 this must be "5.x". For versions >= 6.0 this must be "6.x". +* ```es_version``` (e.g. "6.1.2"). +* ```es_api_host``` The host name used for actions requiring HTTP e.g. installing templates. Defaults to "localhost". +* ```es_api_port``` The port used for actions requiring HTTP e.g. installing templates. Defaults to 9200. **CHANGE IF THE HTTP PORT IS NOT 9200** +* ```es_api_basic_auth_username``` The Elasticsearch username for making admin changing actions. Used if Security is enabled. Ensure this user is admin. +* ```es_api_basic_auth_password``` The password associated with the user declared in `es_api_basic_auth_username` +* ```es_start_service``` (true (default) or false) +* ```es_plugins_reinstall``` (true or false (default) ) +* ```es_plugins``` an array of plugin definitions e.g.: +```yml + es_plugins: + - plugin: ingest-geoip +``` +* ```es_allow_downgrades``` For development purposes only. (true or false (default) ) +* ```es_java_install``` If set to false, Java will not be installed. (true (default) or false) +* ```update_java``` Updates Java to the latest version. (true or false (default)) +* ```es_max_map_count``` maximum number of VMA (Virtual Memory Areas) a process can own. Defaults to 262144. +* ```es_max_open_files``` the maximum file descriptor number that can be opened by this process. Defaults to 65536. +* ```es_max_threads``` the maximum number of threads the process can start. Defaults to 2048 (the minimum required by elasticsearch). +* ```es_debian_startup_timeout``` how long Debian-family SysV init scripts wait for the service to start, in seconds. Defaults to 10 seconds. + +Earlier examples illustrate the installation of plugins using `es_plugins`. For officially supported plugins no version or source delimiter is required. The plugin script will determine the appropriate plugin version based on the target Elasticsearch version. For community based plugins include the full url. This approach should NOT be used for the X-Pack plugin. See X-Pack below for details here. + +If installing Monitoring or Alerting, ensure the license plugin is also specified. Security configuration is currently not supported but planned for later versions. + +* ```es_user``` - defaults to elasticsearch. +* ```es_group``` - defaults to elasticsearch. +* ```es_user_id``` - default is undefined. +* ```es_group_id``` - default is undefined. + +Both ```es_user_id``` and ```es_group_id``` must be set for the user and group ids to be set. + +By default, each node on a host will be installed to use unique pid, plugin, work, data and log directories. These directories are created, using the instance and host name, beneath default locations ] +controlled by the following parameters: + +* ```es_pid_dir``` - defaults to "/var/run/elasticsearch". +* ```es_data_dirs``` - defaults to "/var/lib/elasticsearch". This can be a list or comma separated string e.g. ["/opt/elasticsearch/data-1","/opt/elasticsearch/data-2"] or "/opt/elasticsearch/data-1,/opt/elasticsearch/data-2" +* ```es_log_dir``` - defaults to "/var/log/elasticsearch". +* ```es_restart_on_change``` - defaults to true. If false, changes will not result in Elasticsearch being restarted. +* ```es_plugins_reinstall``` - defaults to false. If true, all currently installed plugins will be removed from a node. Listed plugins will then be re-installed. + +This role ships with sample scripts and templates located in the [files/scripts/](files/scripts) and [files/templates/](files/templates) directories, respectively. These variables are used with the Ansible [with_fileglob](http://docs.ansible.com/ansible/playbooks_loops.html#id4) loop. When setting the globs, be sure to use an absolute path. +* ```es_scripts_fileglob``` - defaults to `/files/scripts/`. +* ```es_templates_fileglob``` - defaults to `/files/templates/`. + +### Proxy + +To define proxy globaly, set the following variables: + +* ```es_proxy_host``` - global proxy host +* ```es_proxy_port``` - global proxy port + +To define proxy only for a particular plugin during its installation: + +``` + es_plugins: + - plugin: ingest-geoip + proxy_host: proxy.example.com + proxy_port: 8080 +``` + +> For plugins installation, proxy_host and proxy_port are used first if they are defined and fallback to the global proxy settings if not. The same values are currently used for both the http and https proxy settings. + +## Notes + +* The role assumes the user/group exists on the server. The elasticsearch packages create the default elasticsearch user. If this needs to be changed, ensure the user exists. +* The playbook relies on the inventory_name of each host to ensure its directories are unique +* Changing an instance_name for a role application will result in the installation of a new component. The previous component will remain. +* KitchenCI has been used for testing. This is used to confirm images reach the correct state after a play is first applied. We currently test only the latest version of 6.x on +all supported platforms. +* The role aims to be idempotent. Running the role multiple times, with no changes, should result in no state change on the server. If the configuration is changed, these will be applied and +Elasticsearch restarted where required. +* Systemd is used for Ubuntu versions >= 15, Debian >=8, Centos >=7. All other versions use init for service scripts. +* In order to run x-pack tests a license file with security enabled is required. A trial license is appropriate. Set the environment variable `ES_XPACK_LICENSE_FILE` to the full path of the license file prior to running tests. + +## IMPORTANT NOTES RE PLUGIN MANAGEMENT + +* If the ES version is changed, all plugins will be removed. Those listed in the playbook will be re-installed. This is behaviour is required in ES 6.x. +* If no plugins are listed in the playbook for a node, all currently installed plugins will be removed. +* The role supports automatic detection of differences between installed and listed plugins - installing those listed but not installed, and removing those installed but not listed. Should users wish to re-install plugins they should set es_plugins_reinstall to true. This will cause all currently installed plugins to be removed and those listed to be installed. + +## Questions on Usage + +We welcome questions on how to use the role. However, in order to keep the github issues list focused on "issues" we ask the community to raise questions at https://discuss.elastic.co/c/elasticsearch. This is monitored by the maintainers. diff --git a/roles/es6/ansible.cfg b/roles/es6/ansible.cfg new file mode 100644 index 0000000..d9a8c50 --- /dev/null +++ b/roles/es6/ansible.cfg @@ -0,0 +1 @@ +[defaults] \ No newline at end of file diff --git a/roles/es6/defaults/main.yml b/roles/es6/defaults/main.yml new file mode 100644 index 0000000..f0ce74a --- /dev/null +++ b/roles/es6/defaults/main.yml @@ -0,0 +1,43 @@ +--- +es_major_version: "6.x" +es_version: "6.2.3" +es_version_lock: false +es_use_repository: true +es_templates_fileglob: "files/templates/*.json" +es_apt_key: "https://artifacts.elastic.co/GPG-KEY-elasticsearch" +es_apt_url: "deb https://artifacts.elastic.co/packages/{{ es_major_version }}/apt stable main" +es_apt_url_old: "deb http://packages.elastic.co/elasticsearch/{{ es_major_version }}/debian stable main" +es_start_service: true +es_java_install: true +update_java: false +es_restart_on_change: true +es_plugins_reinstall: false +es_scripts: false +es_templates: true +es_user: elasticsearch +es_group: elasticsearch +es_config_log4j2: log4j2.properties.j2 +#Need to provide default directories +es_pid_dir: "/var/run/elasticsearch" +es_data_dirs: "/var/lib/elasticsearch" +es_log_dir: "/var/log/elasticsearch" +es_max_open_files: 65536 +es_max_threads: "{{ 2048 if ( es_version | version_compare('6.0.0', '<')) else 8192 }}" +es_max_map_count: 262144 +es_allow_downgrades: false +es_enable_xpack: false +es_xpack_features: ["alerting","monitoring","graph","ml"] +#These are used for internal operations performed by ansible. +#They do not affect the current configuration +es_api_host: "localhost" +es_api_port: 9200 +es_debian_startup_timeout: 10 + +# Since ansible 2.2 the following variables need to be defined +# to allow the role to be conditionally played with a when condition. +pid_dir: '' +log_dir: '' +conf_dir: '' +data_dirs: '' +# JVM custom parameters +es_jvm_custom_parameters: '' diff --git a/roles/es6/files/logging/log4j2.properties.custom.j2 b/roles/es6/files/logging/log4j2.properties.custom.j2 new file mode 100644 index 0000000..9a2a60f --- /dev/null +++ b/roles/es6/files/logging/log4j2.properties.custom.j2 @@ -0,0 +1,76 @@ +#CUSTOM LOG4J FILE + +status = error + +# log action execution errors for easier debugging +logger.action.name = org.elasticsearch.action +logger.action.level = info + +appender.console.type = Console +appender.console.name = console +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n + +appender.rolling.type = RollingFile +appender.rolling.name = rolling +appender.rolling.fileName = ${sys:es.logs}.log +appender.rolling.layout.type = PatternLayout +appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n +appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log +appender.rolling.policies.type = Policies +appender.rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.rolling.policies.time.interval = 1 +appender.rolling.policies.time.modulate = true + +rootLogger.level = debug +rootLogger.appenderRef.console.ref = console +rootLogger.appenderRef.rolling.ref = rolling + +appender.deprecation_rolling.type = RollingFile +appender.deprecation_rolling.name = deprecation_rolling +appender.deprecation_rolling.fileName = ${sys:es.logs}_deprecation.log +appender.deprecation_rolling.layout.type = PatternLayout +appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n +appender.deprecation_rolling.filePattern = ${sys:es.logs}_deprecation-%i.log.gz +appender.deprecation_rolling.policies.type = Policies +appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy +appender.deprecation_rolling.policies.size.size = 10mb +appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy +appender.deprecation_rolling.strategy.max = 4 + +logger.deprecation.name = org.elasticsearch.deprecation +logger.deprecation.level = debug +logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_rolling +logger.deprecation.additivity = false + +appender.index_search_slowlog_rolling.type = RollingFile +appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling +appender.index_search_slowlog_rolling.fileName = ${sys:es.logs}_index_search_slowlog.log +appender.index_search_slowlog_rolling.layout.type = PatternLayout +appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n +appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs}_index_search_slowlog-%d{yyyy-MM-dd}.log +appender.index_search_slowlog_rolling.policies.type = Policies +appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.index_search_slowlog_rolling.policies.time.interval = 1 +appender.index_search_slowlog_rolling.policies.time.modulate = true + +logger.index_search_slowlog_rolling.name = index.search.slowlog +logger.index_search_slowlog_rolling.level = debug +logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling +logger.index_search_slowlog_rolling.additivity = false + +appender.index_indexing_slowlog_rolling.type = RollingFile +appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling +appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs}_index_indexing_slowlog.log +appender.index_indexing_slowlog_rolling.layout.type = PatternLayout +appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n +appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs}_index_indexing_slowlog-%d{yyyy-MM-dd}.log +appender.index_indexing_slowlog_rolling.policies.type = Policies +appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.index_indexing_slowlog_rolling.policies.time.interval = 1 +appender.index_indexing_slowlog_rolling.policies.time.modulate = true + +logger.index_indexing_slowlog.name = index.indexing.slowlog.index +logger.index_indexing_slowlog.level = debug +logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling +logger.index_indexing_slowlog.additivity = false diff --git a/roles/es6/files/mappings/learning.json b/roles/es6/files/mappings/learning.json new file mode 100644 index 0000000..c5991a3 --- /dev/null +++ b/roles/es6/files/mappings/learning.json @@ -0,0 +1,783 @@ +{ + "index_patterns": "learning-*", + "settings": { + "number_of_shards": 5 + }, + "mappings": { + "events_v1": { + "dynamic": false, + "properties": { + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "uid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "ver": { + "type": "keyword" + }, + "context":{ + "properties": { + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "model": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "granularity": { + "type": "keyword" + }, + "date_range": { + "properties": { + "from": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "to": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + } + } + }, + "dimensions": { + "properties": { + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "gdata": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "sid": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "group_user": { + "type": "boolean" + }, + "anonymous_user": { + "type": "boolean" + }, + "uid": { + "type": "keyword" + }, + "ss_mid": { + "type": "keyword" + }, + "tag": { + "type": "keyword" + }, + "period": { + "type": "integer" + }, + "content_id": { + "type": "keyword" + }, + "item_id": { + "type": "keyword" + }, + "author_id": { + "type": "keyword" + }, + "loc": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "mode": { + "type": "keyword" + }, + "context_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "object_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + } + } + }, + "edata": { + "properties": { + "eks": { + "properties": { + "total_users_count": { + "type": "long" + }, + "total_devices_count": { + "type": "long" + }, + "total_content_count": { + "type": "long" + }, + "content_ids": { + "type": "keyword" + }, + "device_ids": { + "type": "keyword" + }, + "user_ids": { + "type": "keyword" + }, + "contents": { + "type": "keyword" + }, + "unique_users": { + "type": "keyword" + }, + "avg_ts_session": { + "type": "double" + }, + "total_sessions": { + "type": "long" + }, + "avg_interactions_min": { + "type": "double" + }, + "total_interactions": { + "type": "long" + }, + "avg_pageviews": { + "type": "double" + }, + "total_ts": { + "type": "double" + }, + "time_diff": { + "type": "double" + }, + "time_spent": { + "type": "double" + }, + "interact_events_per_min": { + "type": "double" + }, + "interact_events_count": { + "type": "long" + }, + "total_pageviews_count": { + "type": "long" + }, + "page_views_count": { + "type": "long" + }, + "ce_visits": { + "type": "long" + }, + "start_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "end_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncDate": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "timeSpent": { + "type": "double" + }, + "interactEventsPerMin": { + "type": "double" + }, + "mimeType": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "timeDiff": { + "type": "double" + }, + "mode": { + "type": "keyword" + }, + "telemetryVersion": { + "type": "keyword" + }, + "noOfInteractEvents": { + "type": "long" + }, + "interruptTime": { + "type": "double" + }, + "contentCount": { + "type": "long" + }, + "content": { + "type": "keyword" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "first_visit": { + "type": "boolean" + }, + "noOfAttempts": { + "type": "integer" + }, + "m_side_loads": { + "type": "integer" + }, + "m_downloads": { + "type": "integer" + }, + "m_avg_rating": { + "type": "double" + }, + "m_ratings": { + "type": "nested", + "properties": { + "rating": { + "type": "integer" + }, + "time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + }, + "m_comments": { + "type": "object" + }, + "ce_total_ts": { + "type": "double" + }, + "ce_percent_sessions": { + "type": "double" + }, + "ce_visits_count": { + "type": "long" + }, + "ce_total_visits": { + "type": "long" + }, + "ce_percent_ts": { + "type": "double" + }, + "avg_ts": { + "type": "double" + }, + "inc_res_count": { + "type": "long" + }, + "incorrect_res": { + "type": "nested", + "properties": { + "resp": { + "type": "keyword" + }, + "mmc": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "total_count": { + "type": "long" + }, + "correct_res_count": { + "type": "long" + }, + "correct_res": { + "type": "keyword" + }, + "itemId": { + "type": "keyword" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + }, + "new_user_count": { + "type": "long" + }, + "anon_total_sessions": { + "type": "long" + }, + "anon_total_ts": { + "type": "double" + }, + "anon_avg_ts_session": { + "type": "double" + }, + "percent_new_users_count": { + "type": "double" + }, + "ce_total_sessions": { + "type": "long" + }, + "unique_users_count": { + "type": "long" + }, + "stageVisitCount": { + "type": "long" + }, + "interactEventsCount": { + "type": "long" + }, + "interactEvents": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + } + } + }, + "stageId": { + "type": "keyword" + }, + "visitCount": { + "type": "long" + }, + "num_downloads": { + "type": "long" + }, + "num_sideloads": { + "type": "long" + }, + "avg_depth": { + "type": "double" + }, + "publish_pipeline_summary": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "state": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "events_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "eventsSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "screenSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "visitCount": { + "type": "long" + } + } + }, + "activitySummary": { + "type": "nested", + "properties": { + "actType": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "page_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "visit_count": { + "type": "long" + } + } + }, + "env_summary": { + "type": "nested", + "properties": { + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "itemResponses": { + "type": "nested", + "properties": { + "itemId": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + } + } + } + } + } + } + }, + "etags": { + "properties": { + "app": { + "type": "keyword" + }, + "partner": { + "type": "keyword" + }, + "dims": { + "type": "keyword" + } + } + }, + "geoip": { + "properties": { + "location": { + "type": "geo_point" + } + }, + "type": "object" + }, + "contentdata": { + "properties": { + "ageGroup": { + "type": "keyword" + }, + "author": { + "type": "keyword" + }, + "audience": { + "type": "keyword" + }, + "code": { + "type": "keyword" + }, + "collaborators": { + "type": "keyword" + }, + "collections": { + "type": "keyword" + }, + "concepts": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "curriculum": { + "type": "keyword" + }, + "developer": { + "type": "keyword" + }, + "domain": { + "type": "keyword" + }, + "downloadUrl": { + "type": "keyword" + }, + "downloads": { + "type": "long" + }, + "edition": { + "type": "keyword" + }, + "genre": { + "type": "keyword" + }, + "gradeLevel": { + "type": "keyword" + }, + "keywords": { + "type": "keyword" + }, + "me_totalDevices": { + "type": "long" + }, + "me_totalDownloads": { + "type": "long" + }, + "me_totalInteractions": { + "type": "long" + }, + "me_totalRatings": { + "type": "long" + }, + "me_totalSessionsCount": { + "type": "long" + }, + "me_totalSideloads": { + "type": "long" + }, + "me_totalTimespent": { + "type": "long" + }, + "me_totalUsage": { + "type": "long" + }, + "medium": { + "type": "keyword" + }, + "methods": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "owner": { + "type": "keyword" + }, + "popularity": { + "type": "long" + }, + "portalOwner": { + "type": "keyword" + }, + "publication": { + "type": "keyword" + }, + "publisher": { + "type": "keyword" + }, + "rating": { + "type": "long" + }, + "size": { + "type": "long" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "subject": { + "type": "keyword" + }, + "templateType": { + "type": "keyword" + }, + "theme": { + "type": "keyword" + }, + "words": { + "type": "keyword" + } + } + }, + "itemdata": { + "properties": { + "concepts": { + "type": "keyword" + }, + "createdBy": { + "type": "keyword" + }, + "createdOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "keywords": { + "type": "keyword" + }, + "language": { + "type": "keyword" + }, + "lastUpdatedBy": { + "type": "keyword" + }, + "lastUpdatedOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "media": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "num_answers": { + "type": "long" + }, + "owner": { + "type": "keyword" + }, + "qlevel": { + "type": "keyword" + }, + "question": { + "type": "keyword" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "template": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "version": { + "type": "long" + } + } + }, + "@version": { + "type": "keyword" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/scripts/calculate-score.groovy b/roles/es6/files/scripts/calculate-score.groovy new file mode 100644 index 0000000..442c25c --- /dev/null +++ b/roles/es6/files/scripts/calculate-score.groovy @@ -0,0 +1 @@ +log(_score * 2) + my_modifier \ No newline at end of file diff --git a/roles/es6/files/system_key b/roles/es6/files/system_key new file mode 100644 index 0000000000000000000000000000000000000000..91962910d2ac82a5dd768c0d6077bddf45a03aad GIT binary patch literal 128 zcmV-`0Du2|Yyd3#hjw*u2-sNq2k+!W|LHL$o!$SJ=TOS9HAo93=wva67++&x1ZX22 iC9y`8Cr1#H`9wh$Jp}(^gZ=AWGL)^kJFe;$+g!f+r9nyn literal 0 HcmV?d00001 diff --git a/roles/es6/files/templates/backend.json b/roles/es6/files/templates/backend.json new file mode 100644 index 0000000..07161ca --- /dev/null +++ b/roles/es6/files/templates/backend.json @@ -0,0 +1,411 @@ +{ + "index_patterns" : "backend-*", + "settings" : { + "number_of_shards" : 5 + }, + "mappings" : { + "events" : { + "dynamic": false, + "properties": { + "@timestamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "@version": { + "type": "keyword" + }, + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "ver": { + "type": "keyword" + }, + "actor": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "edata": { + "properties": { + "comments": { + "type": "keyword" + }, + "correlationid": { + "type": "keyword" + }, + "duration": { + "type": "double" + }, + "data": { + "type": "keyword" + }, + "dir": { + "type": "keyword" + }, + "errtype": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "level": { + "type": "keyword" + }, + "loc": { + "type": "keyword" + }, + "message": { + "type": "keyword" + }, + "mode": { + "type": "keyword" + }, + "pass": { + "type": "keyword" + }, + "prevstate": { + "type": "keyword" + }, + "pageid": { + "type": "keyword" + }, + "query": { + "type": "keyword" + }, + "rating": { + "type": "double" + }, + "score": { + "type": "double" + }, + "size": { + "type": "double" + }, + "state": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "uri": { + "type": "keyword" + }, + "items": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "origin": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + } + } + }, + "item": { + "properties": { + "id": { + "type": "keyword" + }, + "maxscore": { + "type": "long" + }, + "exlength": { + "type": "long" + }, + "uri": { + "type": "keyword" + }, + "desc": { + "type": "keyword" + }, + "title": { + "type": "keyword" + } + } + }, + "target": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "parent": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + } + } + }, + "visits": { + "type": "nested", + "properties": { + "objid": { + "type": "keyword" + }, + "objtype": { + "type": "keyword" + } + } + }, + "plugin": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "category": { + "type": "keyword" + } + } + }, + "object": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "uaspec": { + "properties": { + "agent": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "system": { + "type": "keyword" + }, + "platform": { + "type": "keyword" + }, + "raw": { + "type": "keyword" + } + } + }, + "dspec": { + "properties": { + "camera": { + "type": "keyword" + }, + "cpu": { + "type": "keyword" + }, + "edisk": { + "type": "double" + }, + "id": { + "type": "keyword" + }, + "idisk": { + "type": "double" + }, + "make": { + "type": "keyword" + }, + "mem": { + "type": "double" + }, + "os": { + "type": "keyword" + }, + "scrn": { + "type": "double" + }, + "sims": { + "type": "double" + } + } + } + } + }, + "context": { + "properties": { + "channel": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "sid": { + "type": "keyword" + }, + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "cdata": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } + } + } + }, + "object": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "parentid": { + "type": "keyword" + }, + "parenttype": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + } + } + }, + "metadata": { + "properties": { + "source": { + "type": "keyword" + }, + "index_name": { + "type": "keyword" + }, + "index_type": { + "type": "keyword" + }, + "source_eid": { + "type": "keyword" + }, + "source_mid": { + "type": "keyword" + }, + "pump": { + "type": "keyword" + } + } + }, + "flags": { + "properties": { + "v2_converted": { + "type": "boolean" + }, + "dd_processed": { + "type": "boolean" + }, + "tv_processed": { + "type": "boolean" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/compositeindex.json b/roles/es6/files/templates/compositeindex.json new file mode 100644 index 0000000..d19a189 --- /dev/null +++ b/roles/es6/files/templates/compositeindex.json @@ -0,0 +1,5122 @@ +{ + "index_patterns": "compositesearch", + "settings": { + "index": { + "max_ngram_diff" : "29", + "analysis": { + "filter": { + "mynGram": { + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ], + "min_gram": "1", + "type": "nGram", + "max_gram": "30" + } + }, + "analyzer": { + "cs_index_analyzer": { + "filter": [ + "lowercase", + "mynGram" + ], + "type": "custom", + "tokenizer": "standard" + }, + "keylower": { + "filter": "lowercase", + "tokenizer": "keyword" + }, + "cs_search_analyzer": { + "filter": [ + "standard", + "lowercase" + ], + "type": "custom", + "tokenizer": "standard" + } + } + } + }, + "number_of_shards": 5 + }, + "mappings": { + "cs": { + "dynamic_templates": [ + { + "longs": { + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "match_mapping_type": "long" + } + }, + { + "booleans": { + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "match_mapping_type": "boolean" + } + }, + { + "doubles": { + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "match_mapping_type": "double" + } + }, + { + "dates": { + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + }, + "match_mapping_type": "date" + } + }, + { + "strings": { + "mapping": { + "type": "text", + "copy_to": "all_fields", + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + } + }, + "match_mapping_type": "string" + } + }, + { + "nested": { + "mapping": { + "type": "nested", + "fields": { + "type": "nested" + } + }, + "match_mapping_type": "object" + } + } + ], + "properties": { + "Audio": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_FUNC_OBJECT_TYPE": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_INDEXABLE_METADATA_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_IN_RELATIONS_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_NON_INDEXABLE_METADATA_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_OUT_RELATIONS_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_REQUIRED_PROPERTIES": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_SYSTEM_TAGS_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_SYS_NODE_TYPE": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "IL_UNIQUE_ID": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "Link": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "RhymingSound": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "SET_OBJECT_TYPE_KEY": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "SET_TYPE": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "SYS_INTERNAL_LAST_UPDATED_ON": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "TemplateType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "actions": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "activityType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "activity_class": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ageGroup": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "all_fields": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "allowupdate_status": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "altIsoSymbol": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "answer": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "antonyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "apiId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "appIcon": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "appIconLabel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "appId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "applicability": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "artifactUrl": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "attribution": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "attributions": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "audience": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "author": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "authoringScore": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "averageComplexity": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "avgGamingTime": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "badgeAssertions": { + "properties": { + "assertionId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "badgeClassId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "badgeClassName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "createdTS": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "issuerId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + } + } + }, + "baseUrl": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "bloomsTaxonomyLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "board": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "body": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "c_null_open_batch_count": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "c_null_private_batch_count": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "c_test_name_open_batch_count": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "cases": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "categories": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "category": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "categoryinstances": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "channel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "channels": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "chapterName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "chapterNumber": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "childNodes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "children": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "class": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "code": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "collaborators": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "collections": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "communication_scheme": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "compatibilityLevel": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "conceptData": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "conceptIds": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "concepts": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "consumerGroups": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "consumerId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentDisposition": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentEncoding": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentFilter": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentMeta": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contentTypesCount": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "contents": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "converse": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "copyType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "copyright": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "cost": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "count_grade_1": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_grade_2": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_grade_3": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_CC": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_DEM": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_ECH": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_INJ": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_INTF": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_JJ": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_NEG": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_NN": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_NST": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_PRP": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_PSP": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_QC": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_QF": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_QO": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_RB": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_RDP": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_RP": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_VAUX": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_VM": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_pos_WQ": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_source_Karnataka_Govt_Textbooks": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_source_Rajasthan_Textbooks": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "count_textbooks": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "createdBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "createdFor": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "createdOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "creator": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "curriculum": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "defaultFramework": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "defaultRes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "description": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "developer": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "dialcodes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "dimensions": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "domain": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "downloadUrl": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "duration": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "edition": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "editorState": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ekstepWordnet": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "endPoint": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "endsWithAkshara": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "example": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "exampleSentences": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "externalValidation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "faculty": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "failPopup": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "feedback": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "fields": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "filter": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "flagReasons": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "flaggedBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "flags": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "follows": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "format": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "foundation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "framework": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "frameworkId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "frameworks": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "fw_hierarchy": { + "type": "text", + "index": false + }, + "gender": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "genders": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "genieScore": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "genre": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "gloss": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "grade": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "gradeLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "graph_id": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "grayScaleAppIcon": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "hasAntonyms": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "hasConnotative": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "hasSynonyms": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "hints": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "holonyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "hypernyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "hyponyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "i18n": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "idealScreenDensity": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "idealScreenSize": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "identifier": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "illustrator": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "illustrators": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "image": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "imageCredits": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "index": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "indowordnetId": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "inflections": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "instruction": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "instructions": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "interactivityLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "internalValidation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ipaSymbol": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "isConnotative": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "isLoanWord": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "isPhrase": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "isoCode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "isoSymbol": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "itemType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "item_sets": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "items": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "keywords": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "keywords_bkp": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "label": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "langid": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "language": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "languageCode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "languageId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "languageLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "lastFlaggedOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "lastPublishDate": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "lastPublishedBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "lastPublishedOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "lastSubmittedOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "lastUpdatedBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "lastUpdatedOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "launchUrl": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "leafNodesCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "learnerLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "learningObjective": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "lemma": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "level": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "lhs_options": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "license": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "limit": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "liveWords": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "material": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "maxChainLength": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "maxWords": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "max_score": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_audiosCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_averageInteractionsPerMin": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_averageRating": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_averageSessionsPerDevice": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_averageTimespentPerSession": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_avgCreationTsPerSession": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_creationSessions": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_creationTimespent": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_imagesCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_timespentDraft": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_timespentReview": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_totalComments": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalDevices": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalDownloads": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalInteractions": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalRatings": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalSessionsCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalSideloads": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "me_totalTimespent": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "me_videosCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "meaning": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "media": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "mediaType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "mediatype": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "medium": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "meronyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "method": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "methods": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "mimeType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "mimeTypesCount": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "minChainLength": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "model": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "model_sample": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "morphology": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "name": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "nodeType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "node_id": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "notes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "num_answers": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "objects": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "objectsUsed": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "occurrenceCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "oldContentBody": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "optStatus": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "options": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "organization": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "origin": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "orthographic_complexity": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "os": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "osId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "owner": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pageNumber": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "parent": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "partial_scoring": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "person": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "phonologic_complexity": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "pictures": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pkgVersion": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "plurality": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "popularity": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "portalOwner": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pos": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "posTags": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pos_categories": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "posterImage": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pragma": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "prevState": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "previewUrl": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "primaryMeaning": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "primaryMeaningId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "product": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "pronunciations": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "publication": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "publishError": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "publish_type": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "publisher": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "purpose": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "qid": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "qlevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "qtype": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "question": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "questionImage": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "question_audio": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "question_count": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "question_image": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "references": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "renderingHints": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "resourceType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "resources": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "responses": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "rhs_options": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "rownum": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "ruleId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ruleObjectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ruleScript": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "s3Key": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "sYS_INTERNAL_LAST_UPDATED_ON": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "sampleUsages": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "savingPopup": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "screenshots": { + "type": "text", + "index": false + }, + "semanticVersion": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "showNotification": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "shuffle": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "size": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "skills": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "softConstraints": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "soundCredits": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "source": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "sourceTypes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "sources": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "startWordsSize": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "startsWithAkshara": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "state": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "status": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "strict_sequencing": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "subject": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "sublevel": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "successPopup": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "syllableCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "syllableNotation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "syllables": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "synonyms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "synsetCount": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "synsets": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "tags": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "tempData": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "template": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "templateName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "templateType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "template_id": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "terms": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "text": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "textbookName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "theme": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "themes": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "thumbnail": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "title": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "toc_url": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "tools": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "totalGamingTime": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "total_items": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "translations": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "ttl": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "tutor": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "type": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "unicode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "unicodeNotation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "usedByContent": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "used_for": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "usesContent": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "variants": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "varna": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "version": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "versionCheckMode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "versionKey": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "visibility": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "voiceCredits": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "vowel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "weightages": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "wordImages": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "wordListIds": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "wordLists": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "word_complexity": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "words": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "wordsets": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "workers": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + }, + "year": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "cs_index_analyzer", + "search_analyzer": "cs_search_analyzer" + } + } + } + } +} diff --git a/roles/es6/files/templates/dialcode.json b/roles/es6/files/templates/dialcode.json new file mode 100644 index 0000000..12e600a --- /dev/null +++ b/roles/es6/files/templates/dialcode.json @@ -0,0 +1,269 @@ +{ + "index_patterns": "dialcode", + "settings": { + "index": { + "analysis": { + "filter": { + "mynGram": { + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ], + "min_gram": "1", + "type": "nGram", + "max_gram": "20" + } + }, + "analyzer": { + "dc_search_analyzer": { + "filter": [ + "standard", + "lowercase" + ], + "type": "custom", + "tokenizer": "standard" + }, + "dc_index_analyzer": { + "filter": [ + "lowercase", + "mynGram" + ], + "type": "custom", + "tokenizer": "standard" + }, + "keylower": { + "filter": "lowercase", + "tokenizer": "keyword" + } + } + } + }, + "number_of_shards": 5 + }, + "mappings": { + "dc": { + "dynamic_templates": [ + { + "longs": { + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "match_mapping_type": "long" + } + }, + { + "booleans": { + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "match_mapping_type": "boolean" + } + }, + { + "doubles": { + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "match_mapping_type": "double" + } + }, + { + "dates": { + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + }, + "match_mapping_type": "date" + } + }, + { + "strings": { + "mapping": { + "type": "text", + "copy_to": "all_fields", + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + } + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "all_fields": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "batchCode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "batchcode": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "channel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "dialcode_index": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "generated_on": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "identifier": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "published_on": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "publisher": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + }, + "status": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "dc_index_analyzer", + "search_analyzer": "dc_search_analyzer" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/failed-telemetry.json b/roles/es6/files/templates/failed-telemetry.json new file mode 100644 index 0000000..5d474e7 --- /dev/null +++ b/roles/es6/files/templates/failed-telemetry.json @@ -0,0 +1,106 @@ +{ + "index_patterns" : "failed-telemetry-*", + "settings" : { + "number_of_shards" : 5 + }, + "mappings" : { + "events" : { + "dynamic": false, + "properties": { + "@timestamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "@version": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "metadata": { + "properties": { + "source": { + "type": "keyword" + }, + "index_name": { + "type": "keyword" + }, + "index_type": { + "type": "keyword" + } + } + }, + "context": { + "properties": { + "channel": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "sid": { + "type": "keyword" + }, + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "cdata": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/lp_audit_log.json b/roles/es6/files/templates/lp_audit_log.json new file mode 100644 index 0000000..b33cf78 --- /dev/null +++ b/roles/es6/files/templates/lp_audit_log.json @@ -0,0 +1,314 @@ +{ + "index_patterns": "lp_audit_log", + "settings": { + "index": { + "analysis": { + "filter": { + "mynGram": { + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ], + "min_gram": "1", + "type": "nGram", + "max_gram": "20" + } + }, + "analyzer": { + "ah_search_analyzer": { + "filter": [ + "standard", + "lowercase" + ], + "type": "custom", + "tokenizer": "standard" + }, + "keylower": { + "filter": "lowercase", + "tokenizer": "keyword" + }, + "ah_index_analyzer": { + "filter": [ + "lowercase", + "mynGram" + ], + "type": "custom", + "tokenizer": "standard" + } + } + } + }, + "number_of_shards": 5 + }, + "mappings": { + "ah": { + "dynamic_templates": [ + { + "longs": { + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "match_mapping_type": "long" + } + }, + { + "booleans": { + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "match_mapping_type": "boolean" + } + }, + { + "doubles": { + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "match_mapping_type": "double" + } + }, + { + "dates": { + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + }, + "match_mapping_type": "date" + } + }, + { + "strings": { + "mapping": { + "type": "text", + "copy_to": "all_fields", + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + } + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "@timestamp": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "@version": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "all_fields": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "audit_id": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "createdOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "graphId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "label": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "logRecord": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "objectId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "operation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "requestId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "summary": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + }, + "userId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "ah_index_analyzer", + "search_analyzer": "ah_search_analyzer" + } + } + } + } +} diff --git a/roles/es6/files/templates/suggestionindex.json b/roles/es6/files/templates/suggestionindex.json new file mode 100644 index 0000000..cb32559 --- /dev/null +++ b/roles/es6/files/templates/suggestionindex.json @@ -0,0 +1,784 @@ +{ + "index_patterns": "lp_suggestion_index_v1", + "settings": { + "index": { + "analysis": { + "filter": { + "mynGram": { + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ], + "min_gram": "1", + "type": "nGram", + "max_gram": "20" + } + }, + "analyzer": { + "keylower": { + "filter": "lowercase", + "tokenizer": "keyword" + }, + "sg_index_analyzer": { + "filter": [ + "lowercase", + "mynGram" + ], + "type": "custom", + "tokenizer": "standard" + }, + "sg_search_analyzer": { + "filter": [ + "standard", + "lowercase" + ], + "type": "custom", + "tokenizer": "standard" + } + } + } + }, + "number_of_shards": 5 + }, + "aliases": { + "lp_suggestion_index_alias": {} + }, + "mappings": { + "sg": { + "dynamic_templates": [ + { + "longs": { + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "match_mapping_type": "long" + } + }, + { + "booleans": { + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "match_mapping_type": "boolean" + } + }, + { + "doubles": { + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "match_mapping_type": "double" + } + }, + { + "dates": { + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + }, + "match_mapping_type": "date" + } + }, + { + "strings": { + "mapping": { + "copy_to": "all_fields", + "search_analyzer": "sg_search_analyzer", + "analyzer": "sg_index_analyzer", + "type": "text", + "fields": { + "raw": { + "analyzer": "keylower", + "type": "text", + "fielddata": true + } + } + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "all_fields": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "command": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "comment": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "comments": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "createdOn": { + "type": "date", + "fields": { + "raw": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + } + }, + "format": "strict_date_optional_time||epoch_millis" + }, + "es_metadata_id": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "lastUpdatedBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectId": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "params": { + "properties": { + "Language": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "ageGroup": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "ageGrups": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "attributions": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "audience": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "code": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "concepts": { + "properties": { + "description": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "identifier": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "name": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relationName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "description": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "domain": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "domains": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "genre": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "gradeLevel": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "language": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "medium": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "methods": { + "properties": { + "description": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "identifier": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "name": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "objectType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relation": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "relationName": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "name": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "subject": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "tags": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "templateType": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + }, + "request": { + "properties": { + "content": { + "properties": { + "comments": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "status": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + } + } + }, + "status": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "suggestedBy": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + }, + "suggestion_id": { + "type": "text", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + }, + "copy_to": [ + "all_fields" + ], + "analyzer": "sg_index_analyzer", + "search_analyzer": "sg_search_analyzer" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/summary.json b/roles/es6/files/templates/summary.json new file mode 100644 index 0000000..21db2c1 --- /dev/null +++ b/roles/es6/files/templates/summary.json @@ -0,0 +1,786 @@ +{ + "index_patterns": "summary-*", + "settings": { + "number_of_shards": 5 + }, + "mappings": { + "events": { + "dynamic": false, + "properties": { + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "uid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "ver": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "context":{ + "properties": { + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "model": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "granularity": { + "type": "keyword" + }, + "date_range": { + "properties": { + "from": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "to": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + } + } + }, + "dimensions": { + "properties": { + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "gdata": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "sid": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "group_user": { + "type": "boolean" + }, + "anonymous_user": { + "type": "boolean" + }, + "uid": { + "type": "keyword" + }, + "ss_mid": { + "type": "keyword" + }, + "tag": { + "type": "keyword" + }, + "period": { + "type": "integer" + }, + "content_id": { + "type": "keyword" + }, + "item_id": { + "type": "keyword" + }, + "author_id": { + "type": "keyword" + }, + "loc": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "mode": { + "type": "keyword" + }, + "context_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "object_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + } + } + }, + "edata": { + "properties": { + "eks": { + "properties": { + "total_users_count": { + "type": "long" + }, + "total_devices_count": { + "type": "long" + }, + "total_content_count": { + "type": "long" + }, + "content_ids": { + "type": "keyword" + }, + "device_ids": { + "type": "keyword" + }, + "user_ids": { + "type": "keyword" + }, + "contents": { + "type": "keyword" + }, + "unique_users": { + "type": "keyword" + }, + "avg_ts_session": { + "type": "double" + }, + "total_sessions": { + "type": "long" + }, + "avg_interactions_min": { + "type": "double" + }, + "total_interactions": { + "type": "long" + }, + "avg_pageviews": { + "type": "double" + }, + "total_ts": { + "type": "double" + }, + "time_diff": { + "type": "double" + }, + "time_spent": { + "type": "double" + }, + "interact_events_per_min": { + "type": "double" + }, + "interact_events_count": { + "type": "long" + }, + "total_pageviews_count": { + "type": "long" + }, + "page_views_count": { + "type": "long" + }, + "ce_visits": { + "type": "long" + }, + "start_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "end_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncDate": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "timeSpent": { + "type": "double" + }, + "interactEventsPerMin": { + "type": "double" + }, + "mimeType": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "timeDiff": { + "type": "double" + }, + "mode": { + "type": "keyword" + }, + "telemetryVersion": { + "type": "keyword" + }, + "noOfInteractEvents": { + "type": "long" + }, + "interruptTime": { + "type": "double" + }, + "contentCount": { + "type": "long" + }, + "content": { + "type": "keyword" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "first_visit": { + "type": "boolean" + }, + "noOfAttempts": { + "type": "integer" + }, + "m_side_loads": { + "type": "integer" + }, + "m_downloads": { + "type": "integer" + }, + "m_avg_rating": { + "type": "double" + }, + "m_ratings": { + "type": "nested", + "properties": { + "rating": { + "type": "integer" + }, + "time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + }, + "m_comments": { + "type": "object" + }, + "ce_total_ts": { + "type": "double" + }, + "ce_percent_sessions": { + "type": "double" + }, + "ce_visits_count": { + "type": "long" + }, + "ce_total_visits": { + "type": "long" + }, + "ce_percent_ts": { + "type": "double" + }, + "avg_ts": { + "type": "double" + }, + "inc_res_count": { + "type": "long" + }, + "incorrect_res": { + "type": "nested", + "properties": { + "resp": { + "type": "keyword" + }, + "mmc": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "total_count": { + "type": "long" + }, + "correct_res_count": { + "type": "long" + }, + "correct_res": { + "type": "keyword" + }, + "itemId": { + "type": "keyword" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + }, + "new_user_count": { + "type": "long" + }, + "anon_total_sessions": { + "type": "long" + }, + "anon_total_ts": { + "type": "double" + }, + "anon_avg_ts_session": { + "type": "double" + }, + "percent_new_users_count": { + "type": "double" + }, + "ce_total_sessions": { + "type": "long" + }, + "unique_users_count": { + "type": "long" + }, + "stageVisitCount": { + "type": "long" + }, + "interactEventsCount": { + "type": "long" + }, + "interactEvents": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + } + } + }, + "stageId": { + "type": "keyword" + }, + "visitCount": { + "type": "long" + }, + "num_downloads": { + "type": "long" + }, + "num_sideloads": { + "type": "long" + }, + "avg_depth": { + "type": "double" + }, + "publish_pipeline_summary": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "state": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "events_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "eventsSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "screenSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "visitCount": { + "type": "long" + } + } + }, + "activitySummary": { + "type": "nested", + "properties": { + "actType": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "page_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "visit_count": { + "type": "long" + } + } + }, + "env_summary": { + "type": "nested", + "properties": { + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "itemResponses": { + "type": "nested", + "properties": { + "itemId": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + } + } + } + } + } + } + }, + "etags": { + "properties": { + "app": { + "type": "keyword" + }, + "partner": { + "type": "keyword" + }, + "dims": { + "type": "keyword" + } + } + }, + "geoip": { + "properties": { + "location": { + "type": "geo_point" + } + }, + "type": "object" + }, + "contentdata": { + "properties": { + "ageGroup": { + "type": "keyword" + }, + "author": { + "type": "keyword" + }, + "audience": { + "type": "keyword" + }, + "code": { + "type": "keyword" + }, + "collaborators": { + "type": "keyword" + }, + "collections": { + "type": "keyword" + }, + "concepts": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "curriculum": { + "type": "keyword" + }, + "developer": { + "type": "keyword" + }, + "domain": { + "type": "keyword" + }, + "downloadUrl": { + "type": "keyword" + }, + "downloads": { + "type": "long" + }, + "edition": { + "type": "keyword" + }, + "genre": { + "type": "keyword" + }, + "gradeLevel": { + "type": "keyword" + }, + "keywords": { + "type": "keyword" + }, + "me_totalDevices": { + "type": "long" + }, + "me_totalDownloads": { + "type": "long" + }, + "me_totalInteractions": { + "type": "long" + }, + "me_totalRatings": { + "type": "long" + }, + "me_totalSessionsCount": { + "type": "long" + }, + "me_totalSideloads": { + "type": "long" + }, + "me_totalTimespent": { + "type": "long" + }, + "me_totalUsage": { + "type": "long" + }, + "medium": { + "type": "keyword" + }, + "methods": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "owner": { + "type": "keyword" + }, + "popularity": { + "type": "long" + }, + "portalOwner": { + "type": "keyword" + }, + "publication": { + "type": "keyword" + }, + "publisher": { + "type": "keyword" + }, + "rating": { + "type": "long" + }, + "size": { + "type": "long" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "subject": { + "type": "keyword" + }, + "templateType": { + "type": "keyword" + }, + "theme": { + "type": "keyword" + }, + "words": { + "type": "keyword" + } + } + }, + "itemdata": { + "properties": { + "concepts": { + "type": "keyword" + }, + "createdBy": { + "type": "keyword" + }, + "createdOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "keywords": { + "type": "keyword" + }, + "language": { + "type": "keyword" + }, + "lastUpdatedBy": { + "type": "keyword" + }, + "lastUpdatedOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "media": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "num_answers": { + "type": "long" + }, + "owner": { + "type": "keyword" + }, + "qlevel": { + "type": "keyword" + }, + "question": { + "type": "keyword" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "template": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "version": { + "type": "long" + } + } + }, + "@version": { + "type": "keyword" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/summary_cumulative.json b/roles/es6/files/templates/summary_cumulative.json new file mode 100644 index 0000000..48dd775 --- /dev/null +++ b/roles/es6/files/templates/summary_cumulative.json @@ -0,0 +1,786 @@ +{ + "index_patterns": "summary-cumulative-*", + "settings": { + "number_of_shards": 5 + }, + "mappings": { + "events": { + "dynamic": false, + "properties": { + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "uid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "ver": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "context":{ + "properties": { + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "model": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "granularity": { + "type": "keyword" + }, + "date_range": { + "properties": { + "from": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "to": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + } + } + }, + "dimensions": { + "properties": { + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "gdata": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "sid": { + "type": "keyword" + }, + "channel": { + "type": "keyword" + }, + "group_user": { + "type": "boolean" + }, + "anonymous_user": { + "type": "boolean" + }, + "uid": { + "type": "keyword" + }, + "ss_mid": { + "type": "keyword" + }, + "tag": { + "type": "keyword" + }, + "period": { + "type": "integer" + }, + "content_id": { + "type": "keyword" + }, + "item_id": { + "type": "keyword" + }, + "author_id": { + "type": "keyword" + }, + "loc": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "mode": { + "type": "keyword" + }, + "context_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "object_rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + } + } + }, + "edata": { + "properties": { + "eks": { + "properties": { + "total_users_count": { + "type": "long" + }, + "total_devices_count": { + "type": "long" + }, + "total_content_count": { + "type": "long" + }, + "content_ids": { + "type": "keyword" + }, + "device_ids": { + "type": "keyword" + }, + "user_ids": { + "type": "keyword" + }, + "contents": { + "type": "keyword" + }, + "unique_users": { + "type": "keyword" + }, + "avg_ts_session": { + "type": "double" + }, + "total_sessions": { + "type": "long" + }, + "avg_interactions_min": { + "type": "double" + }, + "total_interactions": { + "type": "long" + }, + "avg_pageviews": { + "type": "double" + }, + "total_ts": { + "type": "double" + }, + "time_diff": { + "type": "double" + }, + "time_spent": { + "type": "double" + }, + "interact_events_per_min": { + "type": "double" + }, + "interact_events_count": { + "type": "long" + }, + "total_pageviews_count": { + "type": "long" + }, + "page_views_count": { + "type": "long" + }, + "ce_visits": { + "type": "long" + }, + "start_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "end_time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "syncDate": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "timeSpent": { + "type": "double" + }, + "interactEventsPerMin": { + "type": "double" + }, + "mimeType": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "timeDiff": { + "type": "double" + }, + "mode": { + "type": "keyword" + }, + "telemetryVersion": { + "type": "keyword" + }, + "noOfInteractEvents": { + "type": "long" + }, + "interruptTime": { + "type": "double" + }, + "contentCount": { + "type": "long" + }, + "content": { + "type": "keyword" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "first_visit": { + "type": "boolean" + }, + "noOfAttempts": { + "type": "integer" + }, + "m_side_loads": { + "type": "integer" + }, + "m_downloads": { + "type": "integer" + }, + "m_avg_rating": { + "type": "double" + }, + "m_ratings": { + "type": "nested", + "properties": { + "rating": { + "type": "integer" + }, + "time": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + } + } + }, + "m_comments": { + "type": "object" + }, + "ce_total_ts": { + "type": "double" + }, + "ce_percent_sessions": { + "type": "double" + }, + "ce_visits_count": { + "type": "long" + }, + "ce_total_visits": { + "type": "long" + }, + "ce_percent_ts": { + "type": "double" + }, + "avg_ts": { + "type": "double" + }, + "inc_res_count": { + "type": "long" + }, + "incorrect_res": { + "type": "nested", + "properties": { + "resp": { + "type": "keyword" + }, + "mmc": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "total_count": { + "type": "long" + }, + "correct_res_count": { + "type": "long" + }, + "correct_res": { + "type": "keyword" + }, + "itemId": { + "type": "keyword" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + }, + "new_user_count": { + "type": "long" + }, + "anon_total_sessions": { + "type": "long" + }, + "anon_total_ts": { + "type": "double" + }, + "anon_avg_ts_session": { + "type": "double" + }, + "percent_new_users_count": { + "type": "double" + }, + "ce_total_sessions": { + "type": "long" + }, + "unique_users_count": { + "type": "long" + }, + "stageVisitCount": { + "type": "long" + }, + "interactEventsCount": { + "type": "long" + }, + "interactEvents": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + } + } + }, + "stageId": { + "type": "keyword" + }, + "visitCount": { + "type": "long" + }, + "num_downloads": { + "type": "long" + }, + "num_sideloads": { + "type": "long" + }, + "avg_depth": { + "type": "double" + }, + "publish_pipeline_summary": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "state": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "events_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "eventsSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "count": { + "type": "long" + } + } + }, + "screenSummary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "visitCount": { + "type": "long" + } + } + }, + "activitySummary": { + "type": "nested", + "properties": { + "actType": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "page_summary": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "visit_count": { + "type": "long" + } + } + }, + "env_summary": { + "type": "nested", + "properties": { + "env": { + "type": "keyword" + }, + "time_spent": { + "type": "double" + }, + "count": { + "type": "long" + } + } + }, + "itemResponses": { + "type": "nested", + "properties": { + "itemId": { + "type": "keyword" + }, + "timeSpent": { + "type": "double" + }, + "exTimeSpent": { + "type": "double" + }, + "score": { + "type": "integer" + }, + "time_stamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "pass": { + "type": "keyword" + }, + "qtitle": { + "type": "keyword" + }, + "qdesc": { + "type": "keyword" + } + } + } + } + } + } + }, + "etags": { + "properties": { + "app": { + "type": "keyword" + }, + "partner": { + "type": "keyword" + }, + "dims": { + "type": "keyword" + } + } + }, + "geoip": { + "properties": { + "location": { + "type": "geo_point" + } + }, + "type": "object" + }, + "contentdata": { + "properties": { + "ageGroup": { + "type": "keyword" + }, + "author": { + "type": "keyword" + }, + "audience": { + "type": "keyword" + }, + "code": { + "type": "keyword" + }, + "collaborators": { + "type": "keyword" + }, + "collections": { + "type": "keyword" + }, + "concepts": { + "type": "keyword" + }, + "contentType": { + "type": "keyword" + }, + "curriculum": { + "type": "keyword" + }, + "developer": { + "type": "keyword" + }, + "domain": { + "type": "keyword" + }, + "downloadUrl": { + "type": "keyword" + }, + "downloads": { + "type": "long" + }, + "edition": { + "type": "keyword" + }, + "genre": { + "type": "keyword" + }, + "gradeLevel": { + "type": "keyword" + }, + "keywords": { + "type": "keyword" + }, + "me_totalDevices": { + "type": "long" + }, + "me_totalDownloads": { + "type": "long" + }, + "me_totalInteractions": { + "type": "long" + }, + "me_totalRatings": { + "type": "long" + }, + "me_totalSessionsCount": { + "type": "long" + }, + "me_totalSideloads": { + "type": "long" + }, + "me_totalTimespent": { + "type": "long" + }, + "me_totalUsage": { + "type": "long" + }, + "medium": { + "type": "keyword" + }, + "methods": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "owner": { + "type": "keyword" + }, + "popularity": { + "type": "long" + }, + "portalOwner": { + "type": "keyword" + }, + "publication": { + "type": "keyword" + }, + "publisher": { + "type": "keyword" + }, + "rating": { + "type": "long" + }, + "size": { + "type": "long" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "subject": { + "type": "keyword" + }, + "templateType": { + "type": "keyword" + }, + "theme": { + "type": "keyword" + }, + "words": { + "type": "keyword" + } + } + }, + "itemdata": { + "properties": { + "concepts": { + "type": "keyword" + }, + "createdBy": { + "type": "keyword" + }, + "createdOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "keywords": { + "type": "keyword" + }, + "language": { + "type": "keyword" + }, + "lastUpdatedBy": { + "type": "keyword" + }, + "lastUpdatedOn": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "media": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "num_answers": { + "type": "long" + }, + "owner": { + "type": "keyword" + }, + "qlevel": { + "type": "keyword" + }, + "question": { + "type": "keyword" + }, + "source": { + "type": "keyword" + }, + "status": { + "type": "keyword" + }, + "template": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "version": { + "type": "long" + } + } + }, + "@version": { + "type": "keyword" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/telemetry.json b/roles/es6/files/templates/telemetry.json new file mode 100644 index 0000000..2fb775b --- /dev/null +++ b/roles/es6/files/templates/telemetry.json @@ -0,0 +1,411 @@ +{ + "index_patterns" : "telemetry-*", + "settings" : { + "number_of_shards" : 5 + }, + "mappings" : { + "events" : { + "dynamic": false, + "properties": { + "@timestamp": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "@version": { + "type": "keyword" + }, + "eid": { + "type": "keyword" + }, + "ets": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "mid": { + "type": "keyword" + }, + "ts": { + "format": "strict_date_optional_time||epoch_millis", + "type": "date" + }, + "ver": { + "type": "keyword" + }, + "actor": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "edata": { + "properties": { + "comments": { + "type": "keyword" + }, + "correlationid": { + "type": "keyword" + }, + "duration": { + "type": "double" + }, + "data": { + "type": "keyword" + }, + "dir": { + "type": "keyword" + }, + "errtype": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "level": { + "type": "keyword" + }, + "loc": { + "type": "keyword" + }, + "message": { + "type": "keyword" + }, + "mode": { + "type": "keyword" + }, + "pass": { + "type": "keyword" + }, + "prevstate": { + "type": "keyword" + }, + "pageid": { + "type": "keyword" + }, + "query": { + "type": "keyword" + }, + "rating": { + "type": "double" + }, + "score": { + "type": "double" + }, + "size": { + "type": "double" + }, + "state": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "uri": { + "type": "keyword" + }, + "items": { + "type": "nested", + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "origin": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + } + } + }, + "item": { + "properties": { + "id": { + "type": "keyword" + }, + "maxscore": { + "type": "long" + }, + "exlength": { + "type": "long" + }, + "uri": { + "type": "keyword" + }, + "desc": { + "type": "keyword" + }, + "title": { + "type": "keyword" + } + } + }, + "target": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "parent": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + } + } + }, + "visits": { + "type": "nested", + "properties": { + "objid": { + "type": "keyword" + }, + "objtype": { + "type": "keyword" + } + } + }, + "plugin": { + "properties": { + "id": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "category": { + "type": "keyword" + } + } + }, + "object": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "uaspec": { + "properties": { + "agent": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "system": { + "type": "keyword" + }, + "platform": { + "type": "keyword" + }, + "raw": { + "type": "keyword" + } + } + }, + "dspec": { + "properties": { + "camera": { + "type": "keyword" + }, + "cpu": { + "type": "keyword" + }, + "edisk": { + "type": "double" + }, + "id": { + "type": "keyword" + }, + "idisk": { + "type": "double" + }, + "make": { + "type": "keyword" + }, + "mem": { + "type": "double" + }, + "os": { + "type": "keyword" + }, + "scrn": { + "type": "double" + }, + "sims": { + "type": "double" + } + } + } + } + }, + "context": { + "properties": { + "channel": { + "type": "keyword" + }, + "env": { + "type": "keyword" + }, + "sid": { + "type": "keyword" + }, + "did": { + "type": "keyword" + }, + "pdata": { + "properties": { + "id": { + "type": "keyword" + }, + "pid": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + } + } + }, + "rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + }, + "cdata": { + "type": "nested", + "properties": { + "type": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } + } + } + }, + "object": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "parentid": { + "type": "keyword" + }, + "parenttype": { + "type": "keyword" + }, + "ver": { + "type": "keyword" + }, + "rollup": { + "properties": { + "l1": { + "type": "keyword" + }, + "l2": { + "type": "keyword" + }, + "l3": { + "type": "keyword" + }, + "l4": { + "type": "keyword" + } + } + } + } + }, + "metadata": { + "properties": { + "source": { + "type": "keyword" + }, + "index_name": { + "type": "keyword" + }, + "index_type": { + "type": "keyword" + }, + "source_eid": { + "type": "keyword" + }, + "source_mid": { + "type": "keyword" + }, + "pump": { + "type": "keyword" + } + } + }, + "flags": { + "properties": { + "v2_converted": { + "type": "boolean" + }, + "dd_processed": { + "type": "boolean" + }, + "tv_processed": { + "type": "boolean" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/files/templates/vocabulary.json b/roles/es6/files/templates/vocabulary.json new file mode 100644 index 0000000..d50cc7e --- /dev/null +++ b/roles/es6/files/templates/vocabulary.json @@ -0,0 +1,130 @@ +{ + "index_patterns": "vocabularyterm", + "settings": { + "index": { + "analysis": { + "filter": { + "mynGram": { + "token_chars": [ + "letter", + "digit", + "whitespace", + "punctuation", + "symbol" + ], + "min_gram": "1", + "type": "edge_ngram", + "max_gram": "20" + } + }, + "analyzer": { + "keylower": { + "filter": "lowercase", + "tokenizer": "keyword" + }, + "vt_index_analyzer": { + "filter": [ + "lowercase", + "mynGram" + ], + "type": "custom", + "tokenizer": "standard" + }, + "vt_search_analyzer": { + "filter": [ + "standard", + "lowercase" + ], + "type": "custom", + "tokenizer": "standard" + } + } + } + }, + "number_of_shards": 5 + }, + "mappings": { + "vt": { + "dynamic_templates": [ + { + "longs": { + "mapping": { + "type": "long", + "fields": { + "raw": { + "type": "long" + } + } + }, + "match_mapping_type": "long" + } + }, + { + "booleans": { + "mapping": { + "type": "boolean", + "fields": { + "raw": { + "type": "boolean" + } + } + }, + "match_mapping_type": "boolean" + } + }, + { + "doubles": { + "mapping": { + "type": "double", + "fields": { + "raw": { + "type": "double" + } + } + }, + "match_mapping_type": "double" + } + }, + { + "dates": { + "mapping": { + "type": "date", + "fields": { + "raw": { + "type": "date" + } + } + }, + "match_mapping_type": "date" + } + }, + { + "strings": { + "mapping": { + "type": "text", + "copy_to": "all_fields", + "analyzer": "vt_index_analyzer", + "search_analyzer": "vt_search_analyzer", + "fields": { + "raw": { + "type": "text", + "fielddata": true, + "analyzer": "keylower" + } + } + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "all_fields": { + "type": "text", + "fielddata": true, + "analyzer": "vt_index_analyzer", + "search_analyzer": "vt_search_analyzer" + } + } + } + } +} \ No newline at end of file diff --git a/roles/es6/filter_plugins/custom.py b/roles/es6/filter_plugins/custom.py new file mode 100644 index 0000000..22177cd --- /dev/null +++ b/roles/es6/filter_plugins/custom.py @@ -0,0 +1,57 @@ +__author__ = 'dale mcdiarmid' + +import re +import os.path +from six import string_types + +def modify_list(values=[], pattern='', replacement='', ignorecase=False): + ''' Perform a `re.sub` on every item in the list''' + if ignorecase: + flags = re.I + else: + flags = 0 + _re = re.compile(pattern, flags=flags) + return [_re.sub(replacement, value) for value in values] + +def append_to_list(values=[], suffix=''): + if isinstance(values, string_types): + values = values.split(',') + return [str(value+suffix) for value in values] + +def array_to_str(values=[],separator=','): + return separator.join(values) + +def extract_role_users(users={},exclude_users=[]): + role_users=[] + for user,details in users.iteritems(): + if user not in exclude_users and "roles" in details: + for role in details["roles"]: + role_users.append(role+":"+user) + return role_users + +def filename(filename=''): + return os.path.splitext(os.path.basename(filename))[0] + +def remove_reserved(user_roles={}): + not_reserved = [] + for user_role,details in user_roles.items(): + if not "metadata" in details or not "_reserved" in details["metadata"] or not details["metadata"]["_reserved"]: + not_reserved.append(user_role) + return not_reserved + +def filter_reserved(users_role={}): + reserved = [] + for user_role,details in users_role.items(): + if "metadata" in details and "_reserved" in details["metadata"] and details["metadata"]["_reserved"]: + reserved.append(user_role) + return reserved + +class FilterModule(object): + def filters(self): + return {'modify_list': modify_list, + 'append_to_list':append_to_list, + 'filter_reserved':filter_reserved, + 'array_to_str':array_to_str, + 'extract_role_users':extract_role_users, + 'remove_reserved':remove_reserved, + 'filename':filename} \ No newline at end of file diff --git a/roles/es6/filter_plugins/custom.pyc b/roles/es6/filter_plugins/custom.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecf5ea34c7701e9328b63b1ee9ccaf4a7c5516d0 GIT binary patch literal 2893 zcmbtW+io015UrlQ+0Hsn9CCvPCLqCLLd?|<2qBb2K_Fp;F(_goOvW?4&N#C(o9SL- zOSX8hzlZI2Z5j4t*4dRKteMkhPqH~}&Py)Z zGq24BUA`bkIOzh1vI{ErRqm_2DA}Uei!y>97v)IgP~?Z<5*6GSEK%=^)H^9`I8L)X zsmFPi|ApWBz+k}lImOp`xfT1piFF=rN!zG;C^Y^aihGD^za{muV8XVMgSM0~N(J@= zvadkwx8=~7gAT3O7rFoVh8%Qdza!f%*~g@=90u}pAkROBdM)n!9;)!6tw&Wo4wLXn zZST10=9920L%U<^y)gH79Oh-{pW3j|det*wso0(-}kV!D-=ZZ(}cUybif_VloEmF1(onAT7a#{(tk znm)=^lk!07eS-d7G=MSyg@pjHzC{_J!vTlzfk>&mQN*vwK|p;8w~^}@C*A|#&3)Gu zquUK?YN&&LJ}FZhVYmU-O^Vz%(D_>36rJGbrlV258<98Xg@BAqCKFp`v9A<`OXzX* zj+iC0Y$DE37^pJKJruWy3MOqU60mDSDLf-GX|P@8rCQmjJI_USlGKT>>hmf~LzB8r z_NXf&q<(co;vqag}~E##7@ol zaZ3FL^8q#1B~xc>=ZUJ_O^az}!ALHM2g+3+LI%Ip>9SSx@zKlKS}c ztQ+WcL|jbQ+%z}LWfPi|QO&}bP$Gm7nmmLUmYvkwX}HZVIN4Ca_63=;ykt~QS0zAW*HvIF@HZr!n2Lm0AH z$r8N^=`=&o_v$03w?$dOW3z?2&B=K5I@h6`11rzFsf27`B6n7bw#WM!iweY<#3?yn2>5Fmp3FhWK zMi@A^hU5bD)^OKmEqp-4Ha^H%9ej|cy7=Ht(37=|0i$OHCDG+@zU4m z(0lp6%%lFAbet_l=jB)rn=~N04G>-CuLnT%0XAUKq|h}3-hHz}lBs`M)i{I!tLe6KcbKfAH`u{mhr1V_CV@Xl3cOEF zQ9cEjnWsUS$ZPhmHn(l+_4t?3U%~mTf#Y*}#qrc`&^LW^DY!bn)LCjR&GlRTUcdJ@ DLH9i3 literal 0 HcmV?d00001 diff --git a/roles/es6/handlers/main.yml b/roles/es6/handlers/main.yml new file mode 100644 index 0000000..d71397a --- /dev/null +++ b/roles/es6/handlers/main.yml @@ -0,0 +1,14 @@ + +- name: reload systemd configuration + become: yes + command: systemctl daemon-reload + +# Restart service and ensure it is enabled + +- name: restart elasticsearch + become: yes + service: name={{instance_init_script | basename}} state=restarted enabled=yes + when: + - es_restart_on_change + - es_start_service + register: es_restarted diff --git a/roles/es6/meta/main.yml b/roles/es6/meta/main.yml new file mode 100644 index 0000000..aeecec7 --- /dev/null +++ b/roles/es6/meta/main.yml @@ -0,0 +1,25 @@ +--- + +allow_duplicates: yes + +galaxy_info: + author: Robin Clarke, Jakob Reiter, Dale McDiarmid + description: Elasticsearch for Linux + company: "Elastic.co" + license: "license (Apache)" + min_ansible_version: 2.3.2 + platforms: + - name: EL + versions: + - 6 + - 7 + - name: Debian + versions: + - all + - name: Ubuntu + versions: + - all + categories: + - system + +dependencies: [] diff --git a/roles/es6/tasks/elasticsearch-Debian-version-lock.yml b/roles/es6/tasks/elasticsearch-Debian-version-lock.yml new file mode 100644 index 0000000..d9fdd69 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-Debian-version-lock.yml @@ -0,0 +1,6 @@ +--- +- name: Debian - hold elasticsearch version + become: yes + command: apt-mark hold elasticsearch + register: hold_elasticsearch_result + changed_when: "hold_elasticsearch_result.stdout != 'elasticsearch was already set on hold.'" diff --git a/roles/es6/tasks/elasticsearch-Debian.yml b/roles/es6/tasks/elasticsearch-Debian.yml new file mode 100644 index 0000000..ebaaa61 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-Debian.yml @@ -0,0 +1,48 @@ +--- + +- name: set fact force_install to no + set_fact: force_install=no + +- name: set fact force_install to yes + set_fact: force_install=yes + when: es_allow_downgrades + +- name: Debian - Install apt-transport-https to support https APT downloads + become: yes + apt: name=apt-transport-https state=present + when: es_use_repository + +- name: Debian - Add Elasticsearch repository key + become: yes + apt_key: url="{{ es_apt_key }}" state=present + when: es_use_repository and es_apt_key + +- name: Debian - Add elasticsearch repository + become: yes + apt_repository: repo={{ item.repo }} state={{ item.state}} + with_items: + - { repo: "{{ es_apt_url_old }}", state: "absent" } + - { repo: "{{ es_apt_url }}", state: "present" } + when: es_use_repository + +- name: Debian - Include versionlock + include: elasticsearch-Debian-version-lock.yml + when: es_version_lock + +- name: Debian - Ensure elasticsearch is installed + become: yes + apt: name=elasticsearch{% if es_version is defined and es_version != "" %}={{ es_version }}{% endif %} state=present force={{force_install}} allow_unauthenticated={{ 'no' if es_apt_key else 'yes' }} cache_valid_time=86400 + when: es_use_repository + register: debian_elasticsearch_install_from_repo + notify: restart elasticsearch + +- name: Debian - Download elasticsearch from url + get_url: url={% if es_custom_package_url is defined %}{{ es_custom_package_url }}{% else %}{{ es_package_url }}-{{ es_version }}.deb{% endif %} dest=/tmp/elasticsearch-{{ es_version }}.deb validate_certs=no + when: not es_use_repository + +- name: Debian - Ensure elasticsearch is installed from downloaded package + become: yes + apt: deb=/tmp/elasticsearch-{{ es_version }}.deb + when: not es_use_repository + register: elasticsearch_install_from_package + notify: restart elasticsearch diff --git a/roles/es6/tasks/elasticsearch-RedHat-version-lock.yml b/roles/es6/tasks/elasticsearch-RedHat-version-lock.yml new file mode 100644 index 0000000..b5711a2 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-RedHat-version-lock.yml @@ -0,0 +1,7 @@ +--- +- name: RedHat - install yum-version-lock + become: yes + yum: name=yum-plugin-versionlock state=present update_cache=yes +- name: RedHat - lock elasticsearch version + become: yes + shell: yum versionlock delete 0:elasticsearch* ; yum versionlock add elasticsearch{% if es_version is defined and es_version != "" %}-{{ es_version }}{% endif %} diff --git a/roles/es6/tasks/elasticsearch-RedHat.yml b/roles/es6/tasks/elasticsearch-RedHat.yml new file mode 100644 index 0000000..588f0ce --- /dev/null +++ b/roles/es6/tasks/elasticsearch-RedHat.yml @@ -0,0 +1,31 @@ +--- +- name: Ensure libselinux-python on CentOS 6.x + become: yes + yum: name=libselinux-python state=present update_cache=yes + when: ( ansible_distribution == "CentOS" ) and ( ansible_distribution_major_version == "6" ) + +- name: RedHat - add Elasticsearch repo + become: yes + template: src=elasticsearch.repo dest=/etc/yum.repos.d/elasticsearch-{{ es_major_version }}.repo + when: es_use_repository + +- name: RedHat - include versionlock + include: elasticsearch-RedHat-version-lock.yml + when: es_version_lock + +- name: RedHat - Install Elasticsearch + become: yes + yum: name=elasticsearch{% if es_version is defined and es_version != "" %}-{{ es_version }}{% endif %} state=present update_cache=yes + when: es_use_repository + register: redhat_elasticsearch_install_from_repo + notify: restart elasticsearch + until: '"failed" not in redhat_elasticsearch_install_from_repo' + retries: 5 + delay: 10 + +- name: RedHat - Install Elasticsearch from url + become: yes + yum: name={% if es_custom_package_url is defined %}{{ es_custom_package_url }}{% else %}{{ es_package_url }}-{{ es_version }}.noarch.rpm{% endif %} state=present + when: not es_use_repository + register: elasticsearch_install_from_package + notify: restart elasticsearch diff --git a/roles/es6/tasks/elasticsearch-config.yml b/roles/es6/tasks/elasticsearch-config.yml new file mode 100644 index 0000000..987de71 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-config.yml @@ -0,0 +1,107 @@ +--- +# Configure Elasticsearch Node + +#Create required directories +- name: Create Directories + become: yes + file: path={{ item }} state=directory owner={{ es_user }} group={{ es_group }} + with_items: + - "{{pid_dir}}" + - "{{log_dir}}" + - "{{conf_dir}}" + +- name: Create Data Directories + become: yes + file: path={{ item }} state=directory owner={{ es_user }} group={{ es_group }} + with_items: + - "{{data_dirs}}" + + +#Copy the config template +- name: Copy Configuration File + become: yes + template: src=elasticsearch.yml.j2 dest={{conf_dir}}/elasticsearch.yml owner={{ es_user }} group={{ es_group }} mode=0644 force=yes + register: system_change + notify: restart elasticsearch + +#Copy the instance specific default file +- name: Copy Default File for Instance + become: yes + template: src=elasticsearch.j2 dest={{instance_default_file}} mode=0644 force=yes + notify: restart elasticsearch + +#Copy the instance specific init file +- name: Copy Debian Init File for Instance + become: yes + template: src=init/debian/elasticsearch.j2 dest={{instance_init_script}} mode=0755 force=yes + when: ansible_os_family == 'Debian' and not use_system_d + notify: restart elasticsearch + +#Copy the instance specific init file +- name: Copy Redhat Init File for Instance + become: yes + template: src=init/redhat/elasticsearch.j2 dest={{instance_init_script}} mode=0755 force=yes + when: ansible_os_family == 'RedHat' and not use_system_d + notify: restart elasticsearch + +#Copy the systemd specific file if systemd is installed +- name: Copy Systemd File for Instance + become: yes + template: src=systemd/elasticsearch.j2 dest={{instance_sysd_script}} mode=0644 force=yes + when: use_system_d + notify: + - reload systemd configuration + - restart elasticsearch + +#Copy the logging.yml +- name: Copy log4j2.properties File for Instance + become: yes + template: src={{es_config_log4j2}} dest={{conf_dir}}/log4j2.properties owner={{ es_user }} group={{ es_group }} mode=0644 force=yes + notify: restart elasticsearch + +- name: Copy jvm.options File for Instance + become: yes + template: src=jvm.options.j2 dest={{conf_dir}}/jvm.options owner={{ es_user }} group={{ es_group }} mode=0644 force=yes + notify: restart elasticsearch + +#Clean up un-wanted package scripts to avoid confusion + +- name: Delete Default Init + become: yes + file: dest=/etc/init.d/elasticsearch state=absent + +- name: Create empty default environment file + become: yes + changed_when: False + copy: + dest: /etc/default/elasticsearch + content: '' + when: ansible_os_family == 'Debian' + +- name: Create empty default environment file + become: yes + changed_when: False + copy: + dest: /etc/sysconfig/elasticsearch + content: '' + when: ansible_os_family == 'RedHat' + +- name: Delete Default Sysconfig File + become: yes + file: dest="{{ sysd_script }}" state=absent + +- name: Delete Default Configuration File + become: yes + file: dest=/etc/elasticsearch/elasticsearch.yml state=absent + +- name: Delete Default Logging File + become: yes + file: dest=/etc/elasticsearch/logging.yml state=absent + +- name: Delete Default Logging File + become: yes + file: dest=/etc/elasticsearch/log4j2.properties state=absent + +- name: Delete Default JVM Options File + become: yes + file: dest=/etc/elasticsearch/jvm.options state=absent diff --git a/roles/es6/tasks/elasticsearch-optional-user.yml b/roles/es6/tasks/elasticsearch-optional-user.yml new file mode 100644 index 0000000..d8f787e --- /dev/null +++ b/roles/es6/tasks/elasticsearch-optional-user.yml @@ -0,0 +1,24 @@ +--- +#Add the elasticsearch user before installing from packages. +- name: Ensure optional elasticsearch group is created with the correct id. + become: yes + #Restart if these change + notify: restart elasticsearch + group: + state: present + name: "{{ es_group }}" + system: yes + gid: "{{ es_group_id }}" + +- name: Ensure optional elasticsearch user is created with the correct id. + become: yes + #Restart if these change + notify: restart elasticsearch + user: + state: present + name: "{{ es_user }}" + comment: elasticsearch system user + system: yes + createhome: no + uid: "{{ es_user_id }}" + group: "{{ es_group }}" diff --git a/roles/es6/tasks/elasticsearch-parameters.yml b/roles/es6/tasks/elasticsearch-parameters.yml new file mode 100644 index 0000000..13c6472 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-parameters.yml @@ -0,0 +1,75 @@ +# Check for mandatory parameters + +- name: fail when es_instance is not defined + fail: msg="es_instance_name must be specified and cannot be blank" + when: es_instance_name is not defined or es_instance_name == '' + +- name: fail when es_proxy_port is not defined or is blank + fail: msg="es_proxy_port must be specified and cannot be blank when es_proxy_host is defined" + when: (es_proxy_port is not defined or es_proxy_port == '') and (es_proxy_host is defined and es_proxy_host != '') + +- name: debug message + debug: msg="WARNING - It is recommended you specify the parameter 'http.port'" + when: es_config['http.port'] is not defined + +- name: debug message + debug: msg="WARNING - It is recommended you specify the parameter 'transport.tcp.port'" + when: es_config['transport.tcp.port'] is not defined + +- name: debug message + debug: msg="WARNING - It is recommended you specify the parameter 'discovery.zen.ping.unicast.hosts'" + when: es_config['discovery.zen.ping.unicast.hosts'] is not defined + +#If the user attempts to lock memory they must specify a heap size +- name: fail when heap size is not specified when using memory lock + fail: msg="If locking memory with bootstrap.memory_lock a heap size must be specified" + when: es_config['bootstrap.memory_lock'] is defined and es_config['bootstrap.memory_lock'] == True and es_heap_size is not defined + +#Check if working with security we have an es_api_basic_auth_username and es_api_basic_auth_username - otherwise any http calls wont work +- name: fail when api credentials are not declared when using security + fail: msg="Enabling security requires an es_api_basic_auth_username and es_api_basic_auth_password to be provided to allow cluster operations" + when: es_enable_xpack and ("security" in es_xpack_features) and es_api_basic_auth_username is not defined and es_api_basic_auth_password is not defined + +- name: set fact file_reserved_users + set_fact: file_reserved_users={{ es_users.file.keys() | intersect (reserved_xpack_users) }} + when: es_users is defined and es_users.file is defined and (es_users.file.keys() | length > 0) and (es_users.file.keys() | intersect (reserved_xpack_users) | length > 0) + +- name: fail when changing users through file realm + fail: + msg: "ERROR: INVALID CONFIG - YOU CANNOT CHANGE RESERVED USERS THROUGH THE FILE REALM. THE FOLLOWING CANNOT BE CHANGED: {{file_reserved_users}}. USE THE NATIVE REALM." + when: file_reserved_users | default([]) | length > 0 + +- name: set fact instance_default_file + set_fact: instance_default_file={{default_file | dirname}}/{{es_instance_name}}_{{default_file | basename}} +- name: set fact instance_init_script + set_fact: instance_init_script={{init_script | dirname }}/{{es_instance_name}}_{{init_script | basename}} +- name: set fact conf_dir + set_fact: conf_dir={{ es_conf_dir }}/{{es_instance_name}} +- name: set fact m_lock_enabled + set_fact: m_lock_enabled={{ es_config['bootstrap.memory_lock'] is defined and es_config['bootstrap.memory_lock'] == True }} + +#TODO - if transport.host is not local maybe error on boostrap checks + + +#Use systemd for the following distributions: +#Ubuntu 15 and up +#Debian 8 and up +#Centos 7 and up +#Relies on elasticsearch distribution installing a serviced script to determine whether one should be copied. + +- name: set fact use_system_d + set_fact: use_system_d={{(ansible_distribution == 'Debian' and ansible_distribution_version | version_compare('8', '>=')) or (ansible_distribution in ['RedHat','CentOS'] and ansible_distribution_version | version_compare('7', '>=')) or (ansible_distribution == 'Ubuntu' and ansible_distribution_version | version_compare('15', '>=')) }} + +- name: set fact instance_sysd_script + set_fact: instance_sysd_script={{sysd_script | dirname }}/{{es_instance_name}}_{{sysd_script | basename}} + when: use_system_d +#For directories we also use the {{inventory_hostname}}-{{ es_instance_name }} - this helps if we have a shared SAN. + +- name: set fact instance_suffix + set_fact: instance_suffix={{inventory_hostname}}-{{ es_instance_name }} +- name: set fact pid_dir + set_fact: pid_dir={{ es_pid_dir }}/{{instance_suffix}} +- name: set fact log_dir + set_fact: log_dir={{ es_log_dir }}/{{instance_suffix}} +- name: set fact log_dir + set_fact: data_dirs={{ es_data_dirs | append_to_list('/'+instance_suffix) }} diff --git a/roles/es6/tasks/elasticsearch-plugins.yml b/roles/es6/tasks/elasticsearch-plugins.yml new file mode 100644 index 0000000..5d4e2d8 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-plugins.yml @@ -0,0 +1,82 @@ +--- + +# es_plugins_reinstall will be set to true if elasticsearch_install_from_repo.changed or elasticsearch_install_from_package.changed +# i.e. we have changed ES version(or we have clean installation of ES), or if no plugins listed. Otherwise it is false and requires explicitly setting. +- name: set fact es_plugins_reinstall to true + set_fact: es_plugins_reinstall=true + when: (((debian_elasticsearch_install_from_repo is defined and debian_elasticsearch_install_from_repo.changed) or (redhat_elasticsearch_install_from_repo is defined and redhat_elasticsearch_install_from_repo.changed)) or (elasticsearch_install_from_package is defined and elasticsearch_install_from_package.changed)) or es_plugins is not defined or es_plugins is none + +- name: set fact list_command + set_fact: list_command="" +#If we are reinstalling all plugins, e.g. to a version change, we need to remove all plugins (inc. x-pack) to install any plugins. Otherwise we don't consider x-pack so the role stays idempotent. +- name: set fact list_command check for x-pack + set_fact: list_command="| grep -vE 'x-pack'" + when: not es_plugins_reinstall + +#List currently installed plugins. We have to list the directories as the list commmand fails if the ES version is different than the plugin version. +- name: Check installed elasticsearch plugins + become: yes + shell: "ls {{es_home}}/plugins {{list_command}}" + register: installed_plugins + changed_when: False + ignore_errors: yes + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + +#if es_plugins_reinstall is set to true we remove ALL plugins +- name: set fact plugins_to_remove to install_plugins.stdout_lines + set_fact: plugins_to_remove="{{ installed_plugins.stdout_lines | default([]) }}" + when: es_plugins_reinstall + +#if the plugins listed are different than those requested, we remove those installed but not listed in the config +- name: set fact plugins_to_remove to delete plugins installed but not listed in es_plugins + set_fact: plugins_to_remove="{{ installed_plugins.stdout_lines | difference(es_plugins | json_query('[*].plugin')) | default([]) }}" + when: not es_plugins_reinstall + +#if es_plugins_reinstall is set to true we (re)install ALL plugins +- name: set fact plugins_to_install to es_plugins + set_fact: plugins_to_install="{{ es_plugins | json_query('[*].plugin') | default([]) }}" + when: es_plugins_reinstall + +#if the plugins listed are different than those requested, we install those not installed but listed in the config +- name: set fact to plugins_to_install to those in es_config but not installed + set_fact: plugins_to_install="{{ es_plugins | json_query('[*].plugin') | difference(installed_plugins.stdout_lines) | default([]) }}" + when: not es_plugins_reinstall + +# This removes any currently installed plugins (to prevent errors when reinstalling) +- name: Remove elasticsearch plugins + become: yes + command: "{{es_home}}/bin/elasticsearch-plugin remove {{item}} --silent" + ignore_errors: yes + with_items: "{{ plugins_to_remove | default([]) }}" + notify: restart elasticsearch + register: plugin_removed + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + +- name: Install elasticsearch plugins + become: yes + command: "{{es_home}}/bin/elasticsearch-plugin install {{ item.plugin }} --batch --silent" + register: plugin_installed + failed_when: "'ERROR' in plugin_installed.stdout" + changed_when: plugin_installed.rc == 0 + with_items: "{{ es_plugins }}" + when: item.plugin in plugins_to_install + notify: restart elasticsearch + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + ES_JAVA_OPTS: "{% if item.proxy_host is defined and item.proxy_host != '' and item.proxy_port is defined and item.proxy_port != ''%} -Dhttp.proxyHost={{ item.proxy_host }} -Dhttp.proxyPort={{ item.proxy_port }} -Dhttps.proxyHost={{ item.proxy_host }} -Dhttps.proxyPort={{ item.proxy_port }} {% elif es_proxy_host is defined and es_proxy_host != '' %} -Dhttp.proxyHost={{ es_proxy_host }} -Dhttp.proxyPort={{ es_proxy_port }} -Dhttps.proxyHost={{ es_proxy_host }} -Dhttps.proxyPort={{ es_proxy_port }} {% endif %}" + until: plugin_installed.rc == 0 + retries: 5 + delay: 5 + +#Set permissions on plugins directory +- name: Set Plugin Directory Permissions + become: yes + file: state=directory path={{ es_home }}/plugins owner={{ es_user }} group={{ es_group }} recurse=yes diff --git a/roles/es6/tasks/elasticsearch-scripts.yml b/roles/es6/tasks/elasticsearch-scripts.yml new file mode 100644 index 0000000..e38c3b4 --- /dev/null +++ b/roles/es6/tasks/elasticsearch-scripts.yml @@ -0,0 +1,26 @@ +--- + +- name: set fact es_script_dir + set_fact: es_script_dir={{ es_conf_dir }}/{{es_instance_name}} + tags: + - always + +- name: set fact es_script_dir when path.scripts + set_fact: es_script_dir={{es_config['path.scripts']}} + when: es_config['path.scripts'] is defined + tags: + - always + +- name: Create script dir + become: yes + file: state=directory path={{ es_script_dir }} owner={{ es_user }} group={{ es_group }} recurse=yes + +- name: Copy default scripts to elasticsearch + become: yes + copy: src=scripts dest={{ es_script_dir }} owner={{ es_user }} group={{ es_group }} + when: es_scripts_fileglob is not defined + +- name: Copy scripts to elasticsearch + become: yes + copy: src={{ item }} dest={{ es_script_dir }} owner={{ es_user }} group={{ es_group }} + with_fileglob: "{{ es_scripts_fileglob | default('') }}" diff --git a/roles/es6/tasks/elasticsearch-template.yml b/roles/es6/tasks/elasticsearch-template.yml new file mode 100644 index 0000000..6059c7d --- /dev/null +++ b/roles/es6/tasks/elasticsearch-template.yml @@ -0,0 +1,40 @@ +--- +- name: ensure templates dir is created + file: + path: /etc/elasticsearch/templates + state: directory + owner: "{{ es_user }}" + group: "{{ es_group }}" + +- name: Copy templates to elasticsearch + copy: src={{ item }} dest=/etc/elasticsearch/templates owner={{ es_user }} group={{ es_group }} + register: load_templates + with_fileglob: + - "{{ es_templates_fileglob | default('') }}" + +- name: Install templates without auth + uri: + url: "http://{{es_api_host}}:{{es_api_port}}/_template/{{item | filename}}" + method: PUT + status_code: 200 + body_format: json + body: "{{ lookup('file', item) }}" + when: load_templates.changed and es_start_service and not es_enable_xpack or not es_xpack_features is defined or "security" not in es_xpack_features + with_fileglob: + - "{{ es_templates_fileglob | default('') }}" + run_once: True + +- name: Install templates with auth + uri: + url: "http://{{es_api_host}}:{{es_api_port}}/_template/{{item | filename}}" + method: PUT + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + body_format: json + body: "{{ lookup('file', item) }}" + when: load_templates.changed and es_start_service and es_enable_xpack and es_xpack_features is defined and "security" in es_xpack_features + with_fileglob: + - "{{ es_templates_fileglob | default('') }}" + run_once: True diff --git a/roles/es6/tasks/elasticsearch.yml b/roles/es6/tasks/elasticsearch.yml new file mode 100644 index 0000000..e2361d4 --- /dev/null +++ b/roles/es6/tasks/elasticsearch.yml @@ -0,0 +1,13 @@ +--- + +- name: Include optional user and group creation. + when: (es_user_id is defined) and (es_group_id is defined) + include: elasticsearch-optional-user.yml + +- name: Include specific Elasticsearch + include: elasticsearch-Debian.yml + when: ansible_os_family == 'Debian' + +- name: Include specific Elasticsearch + include: elasticsearch-RedHat.yml + when: ansible_os_family == 'RedHat' diff --git a/roles/es6/tasks/java.yml b/roles/es6/tasks/java.yml new file mode 100644 index 0000000..a4ecac0 --- /dev/null +++ b/roles/es6/tasks/java.yml @@ -0,0 +1,51 @@ +--- + +- name: set fact java_state to present + set_fact: java_state="present" + +- name: set fact java_state to latest + set_fact: java_state="latest" + when: update_java == true + +- name: RedHat - Ensure Java is installed + become: yes + yum: name={{ java }} state={{java_state}} + when: ansible_os_family == 'RedHat' + +- name: Get the installed java path + shell: "update-alternatives --display java | grep '^/' | awk '{print $1}' | grep 1.8.0" + register: java_full_path + failed_when: False + changed_when: False + when: ansible_os_family == 'RedHat' + +- name: correct java version selected + alternatives: + name: java + path: "{{ java_full_path.stdout }}" + link: /usr/bin/java + when: ansible_os_family == 'RedHat' and java_full_path is defined + +- name: Refresh java repo + become: yes + apt: update_cache=yes + changed_when: false + when: ansible_os_family == 'Debian' + +- name: Debian - Ensure Java is installed + become: yes + apt: name={{ java }} state={{java_state}} + when: ansible_os_family == 'Debian' + +- name: register open_jdk version + shell: java -version 2>&1 | grep OpenJDK + register: open_jdk + ignore_errors: yes + changed_when: false + +#https://github.com/docker-library/openjdk/issues/19 - ensures tests pass due to java 8 broken certs +- name: refresh the java ca-certificates + become: yes + command: /var/lib/dpkg/info/ca-certificates-java.postinst configure + when: ansible_distribution == 'Ubuntu' and open_jdk.rc == 0 + changed_when: false diff --git a/roles/es6/tasks/main.yml b/roles/es6/tasks/main.yml new file mode 100644 index 0000000..bc6a1ba --- /dev/null +++ b/roles/es6/tasks/main.yml @@ -0,0 +1,84 @@ +--- +- name: os-specific vars + include_vars: "{{ansible_os_family}}.yml" + tags: + - always + +- name: check-set-parameters + include: elasticsearch-parameters.yml + tags: + - always + +# - name: include java.yml +# include: java.yml +# when: es_java_install +# tags: +# - java + +- name: include elasticsearch.yml + include: elasticsearch.yml + tags: + - install + +- name: include elasticsearch-config.yml + include: elasticsearch-config.yml + tags: + - config + +- name: include elasticsearch-scripts.yml + include: elasticsearch-scripts.yml + when: es_scripts + tags: + - scripts + +- name: include elasticsearch-plugins.yml + include: elasticsearch-plugins.yml + when: es_plugins is defined or es_plugins_reinstall + tags: + - plugins + + #We always execute xpack as we may need to remove features +- name: include xpack/elasticsearch-xpack.yml + include: xpack/elasticsearch-xpack.yml + tags: + - xpack + +- name: flush handlers + meta: flush_handlers + +- name: Make sure elasticsearch is started + service: name={{instance_init_script | basename}} state=started enabled=yes + when: es_start_service + +- name: Wait for elasticsearch to startup + wait_for: host={{es_api_host}} port={{es_api_port}} delay=5 connect_timeout=1 + when: es_restarted is defined and es_restarted.changed and es_start_service + +- name: set fact manage_native_realm to false + set_fact: manage_native_realm=false + +- name: set fact manage_native_realm to true + set_fact: manage_native_realm=true + when: es_start_service and (es_enable_xpack and "security" in es_xpack_features) and ((es_users is defined and es_users.native is defined) or (es_roles is defined and es_roles.native is defined)) + +# If playbook runs too fast, Native commands could fail as the Native Realm is not yet up +- name: Wait 15 seconds for the Native Relm to come up + pause: seconds=15 + when: manage_native_realm + +- name: activate-license + include: ./xpack/security/elasticsearch-xpack-activation.yml + when: es_start_service and es_enable_xpack and es_xpack_license is defined and es_xpack_license != '' + +#perform security actions here now elasticsearch is started +- name: include xpack/security/elasticsearch-security-native.yml + include: ./xpack/security/elasticsearch-security-native.yml + when: manage_native_realm + +#Templates done after restart - handled by flushing the handlers. e.g. suppose user removes security on a running node and doesn't specify es_api_basic_auth_username and es_api_basic_auth_password. The templates will subsequently not be removed if we don't wait for the node to restart. +#We also do after the native realm to ensure any changes are applied here first and its denf up. +- name: include elasticsearch-template.yml + include: elasticsearch-template.yml + when: es_templates + tags: + - templates \ No newline at end of file diff --git a/roles/es6/tasks/xpack/elasticsearch-xpack-install.yml b/roles/es6/tasks/xpack/elasticsearch-xpack-install.yml new file mode 100644 index 0000000..522f816 --- /dev/null +++ b/roles/es6/tasks/xpack/elasticsearch-xpack-install.yml @@ -0,0 +1,68 @@ +--- + +#Test if feature is installed +- name: Test if x-pack is installed + shell: "{{es_home}}/bin/elasticsearch-plugin list | grep x-pack" + become: yes + register: x_pack_installed + changed_when: False + failed_when: "'ERROR' in x_pack_installed.stdout" + check_mode: no + ignore_errors: yes + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + + +#Remove X-Pack if installed and its not been requested or the ES version has changed +- name: Remove x-pack plugin + become: yes + command: "{{es_home}}/bin/elasticsearch-plugin remove x-pack" + register: xpack_state + failed_when: "'ERROR' in xpack_state.stdout" + changed_when: xpack_state.rc == 0 + when: x_pack_installed.rc == 0 and (not es_enable_xpack or es_version_changed) + notify: restart elasticsearch + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + + +#Install plugin if not installed, or the es version has changed (so removed above), and its been requested +- name: Download x-pack from url + get_url: url={{ es_xpack_custom_url }} dest=/tmp/x-pack-{{ es_version }}.zip + when: (x_pack_installed.rc == 1 or es_version_changed) and (es_enable_xpack and es_xpack_custom_url is defined) + +- name: Install x-pack plugin from local + become: yes + command: > + {{es_home}}/bin/elasticsearch-plugin install --silent --batch file:///tmp/x-pack-{{ es_version }}.zip + register: xpack_state + changed_when: xpack_state.rc == 0 + when: (x_pack_installed.rc == 1 or es_version_changed) and (es_enable_xpack and es_xpack_custom_url is defined) + notify: restart elasticsearch + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + +- name: Delete x-pack zip file + file: dest=/tmp/x-pack-{{ es_version }}.zip state=absent + when: es_xpack_custom_url is defined + +- name: Install x-pack plugin from elastic.co + become: yes + command: > + {{es_home}}/bin/elasticsearch-plugin install --silent --batch x-pack + register: xpack_state + failed_when: "'ERROR' in xpack_state.stdout" + changed_when: xpack_state.rc == 0 + when: (x_pack_installed.rc == 1 or es_version_changed) and (es_enable_xpack and es_xpack_custom_url is not defined) + notify: restart elasticsearch + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_INCLUDE: "{{ instance_default_file }}" + ES_JAVA_OPTS: "{% if es_proxy_host is defined and es_proxy_host != '' %}-Dhttp.proxyHost={{ es_proxy_host }} -Dhttp.proxyPort={{ es_proxy_port }} -Dhttps.proxyHost={{ es_proxy_host }} -Dhttps.proxyPort={{ es_proxy_port }}{% endif %}" diff --git a/roles/es6/tasks/xpack/elasticsearch-xpack.yml b/roles/es6/tasks/xpack/elasticsearch-xpack.yml new file mode 100644 index 0000000..ec82a68 --- /dev/null +++ b/roles/es6/tasks/xpack/elasticsearch-xpack.yml @@ -0,0 +1,22 @@ +--- + +- name: set fact es_version_changed + set_fact: es_version_changed={{ ((elasticsearch_install_from_package is defined and (debian_elasticsearch_install_from_repo.changed or redhat_elasticsearch_install_from_repo.changed)) or (elasticsearch_install_from_package is defined and elasticsearch_install_from_package.changed)) }} + +- name: include elasticsearch-xpack-install.yml + include: elasticsearch-xpack-install.yml + +#Security configuration +- name: include security/elasticsearch-security.yml + include: security/elasticsearch-security.yml + +#Add any feature specific configuration here +- name: Set Plugin Directory Permissions + become: yes + file: state=directory path={{ es_home }}/plugins owner={{ es_user }} group={{ es_group }} recurse=yes + +#Make sure elasticsearch.keystore has correct Permissions +- name: Set elasticsearch.keystore Permissions + become: yes + file: state=file path={{ conf_dir }}/elasticsearch.keystore owner={{ es_user }} group={{ es_group }} + when: es_enable_xpack and "security" in es_xpack_features and (es_version | version_compare('6.0.0', '>')) diff --git a/roles/es6/tasks/xpack/security/elasticsearch-security-file.yml b/roles/es6/tasks/xpack/security/elasticsearch-security-file.yml new file mode 100644 index 0000000..8d6f878 --- /dev/null +++ b/roles/es6/tasks/xpack/security/elasticsearch-security-file.yml @@ -0,0 +1,80 @@ +--- +- name: set fact manage_file_users + set_fact: manage_file_users=es_users is defined and es_users.file is defined and es_users.file.keys() | length > 0 + +#List current users +- name: List Users + become: yes + shell: cat {{conf_dir}}/x-pack/users | awk -F':' '{print $1}' + register: current_file_users + when: manage_file_users + changed_when: False + +- name: set fact users_to_remove + set_fact: users_to_remove={{ current_file_users.stdout_lines | difference (es_users.file.keys()) }} + when: manage_file_users + +#Remove users +- name: Remove Users + become: yes + command: > + {{es_home}}/bin/x-pack/users userdel {{item}} + with_items: "{{users_to_remove | default([])}}" + when: manage_file_users + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_HOME: "{{es_home}}" + +- name: set fact users_to_add + set_fact: users_to_add={{ es_users.file.keys() | difference (current_file_users.stdout_lines) }} + when: manage_file_users + +#Add users +- name: Add Users + become: yes + command: > + {{es_home}}/bin/x-pack/users useradd {{item}} -p {{es_users.file[item].password}} + with_items: "{{ users_to_add | default([]) }}" + when: manage_file_users + no_log: True + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_HOME: "{{es_home}}" + +#Set passwords for all users declared - Required as the useradd will not change existing user passwords +- name: Set User Passwords + become: yes + command: > + {{es_home}}/bin/x-pack/users passwd {{ item }} -p {{es_users.file[item].password}} + with_items: "{{ es_users.file.keys() | default([]) }}" + when: manage_file_users + #Currently no easy way to figure out if the password has changed or to know what it currently is so we can skip. + changed_when: False + no_log: True + environment: + CONF_DIR: "{{ conf_dir }}" + ES_PATH_CONF: "{{ conf_dir }}" + ES_HOME: "{{es_home}}" + +- name: set fact users_roles + set_fact: users_roles={{es_users.file | extract_role_users () }} + when: manage_file_users + +#Copy Roles files +- name: Copy roles.yml File for Instance + become: yes + template: src=security/roles.yml.j2 dest={{conf_dir}}/x-pack/roles.yml owner={{ es_user }} group={{ es_group }} mode=0644 force=yes + when: es_roles is defined and es_roles.file is defined + +#Overwrite users_roles file +- name: Copy User Roles + become: yes + template: src=security/users_roles.j2 dest={{conf_dir}}/x-pack/users_roles mode=0644 force=yes + when: manage_file_users and users_roles | length > 0 + +#Set permission on security directory. E.g. if 2 nodes are installed on the same machine, the second node will not get the users file created at install, causing the files being created at es_users call and then having the wrong Permissions. +- name: Set Security Directory Permissions Recursive + become: yes + file: state=directory path={{conf_dir}}/x-pack/ owner={{ es_user }} group={{ es_group }} recurse=yes diff --git a/roles/es6/tasks/xpack/security/elasticsearch-security-native.yml b/roles/es6/tasks/xpack/security/elasticsearch-security-native.yml new file mode 100644 index 0000000..63024fa --- /dev/null +++ b/roles/es6/tasks/xpack/security/elasticsearch-security-native.yml @@ -0,0 +1,191 @@ +--- +- name: set fact change_api_password to false + set_fact: change_api_password=false + +- name: set fact manage_native_users to false + set_fact: manage_native_users=false + +- name: set fact manage_native_users to true + set_fact: manage_native_users=true + when: es_users is defined and es_users.native is defined and es_users.native.keys() | length > 0 + +- name: set fact manage_native_role to false + set_fact: manage_native_roles=false + +- name: set fact manange_native_roles to true + set_fact: manage_native_roles=true + when: es_roles is defined and es_roles.native is defined and es_roles.native.keys() | length > 0 + +#If the node has just has security installed it maybe either stopped or started 1. if stopped, we need to start to load native realms 2. if started, we need to restart to load + +#List current users +- name: List Native Users + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/user + method: GET + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + status_code: 200 + register: user_list_response + when: manage_native_users + +- name: set fact reserved_users equals user_list_response.json + set_fact: reserved_users={{ user_list_response.json | filter_reserved }} + when: manage_native_users + +#Current users not inc. those reserved +- name: set fact current_users equals user_list_response.json.keys not including reserved + set_fact: current_users={{ user_list_response.json.keys() | difference (reserved_users) }} + when: manage_native_users + +#We are changing the es_api_basic_auth_username password, so we need to do it first and update the param +- name: set fact native_users + set_fact: native_users={{ es_users.native }} + when: manage_native_users + +- name: set fact change_api_password to true + set_fact: change_api_password=true + when: manage_native_users and es_api_basic_auth_username in native_users and native_users[es_api_basic_auth_username].password is defined + +- name: Update API User Password + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/user/{{es_api_basic_auth_username}}/_password + method: POST + body_format: json + body: "{ \"password\":\"{{native_users[es_api_basic_auth_username].password}}\" }" + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: change_api_password + +- name: set fact es_api_basic_auth_password + set_fact: es_api_basic_auth_password={{native_users[es_api_basic_auth_username].password}} + when: change_api_password + +#Identify users that are present in ES but not declared and thus should be removed +- name: set fact users_to_remove + set_fact: users_to_remove={{ current_users | difference ( native_users.keys() ) }} + when: manage_native_users + +#Delete all non required users NOT inc. reserved +- name: Delete Native Users + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/user/{{item}} + method: DELETE + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: manage_native_users + with_items: "{{ users_to_remove | default([]) }}" + +- name: set fact users_to_ignore + set_fact: users_to_ignore={{ native_users.keys() | intersect (reserved_users) }} + when: manage_native_users + +- name: debug message + debug: + msg: "WARNING: YOU CAN ONLY CHANGE THE PASSWORD FOR RESERVED USERS IN THE NATIVE REALM. ANY ROLE CHANGES WILL BE IGNORED: {{users_to_ignore}}" + when: manage_native_users and users_to_ignore | length > 0 + +#Update password on all reserved users +- name: Update Reserved User Passwords + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/user/{{item}}/_password + method: POST + body_format: json + body: "{ \"password\":\"{{native_users[item].password}}\" }" + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: native_users[item].password is defined + no_log: True + with_items: "{{ users_to_ignore | default([]) }}" + +- name: set fact users_to_modify + set_fact: users_to_modify={{ native_users.keys() | difference (reserved_users) }} + when: manage_native_users + +#Overwrite all other users NOT inc. those reserved +- name: Update Non-Reserved Native User Details + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/user/{{item}} + method: POST + body_format: json + body: "{{ native_users[item] | to_json }}" + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: manage_native_users + no_log: True + with_items: "{{ users_to_modify | default([]) }}" + +## ROLE CHANGES + +#List current roles not. inc those reserved +- name: List Native Roles + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/role + method: GET + body_format: json + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + status_code: 200 + register: role_list_response + when: manage_native_roles + +- name: set fact reserved roles + set_fact: reserved_roles={{ role_list_response.json | filter_reserved }} + when: manage_native_roles + +- name: set fact current roles + set_fact: current_roles={{ role_list_response.json.keys() | difference (reserved_roles) }} + when: manage_native_roles + +- name: set fact roles to ignore + set_fact: roles_to_ignore={{ es_roles.native.keys() | intersect (reserved_roles) | default([]) }} + when: manage_native_roles + +- name: debug message + debug: + msg: "WARNING: YOU CANNOT CHANGE RESERVED ROLES. THE FOLLOWING WILL BE IGNORED: {{roles_to_ignore}}" + when: manage_native_roles and roles_to_ignore | length > 0 + +- name: set fact roles_to_remove + set_fact: roles_to_remove={{ current_roles | difference ( es_roles.native.keys() ) }} + when: manage_native_roles + +#Delete all non required roles NOT inc. reserved +- name: Delete Native Roles + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/role/{{item}} + method: DELETE + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: manage_native_roles + with_items: "{{roles_to_remove | default([]) }}" + +- name: set fact roles_to_modify + set_fact: roles_to_modify={{ es_roles.native.keys() | difference (reserved_roles) }} + when: manage_native_roles + +#Update other roles - NOT inc. reserved roles +- name: Update Native Roles + uri: + url: http://{{es_api_host}}:{{es_api_port}}/_xpack/security/role/{{item}} + method: POST + body_format: json + body: "{{ es_roles.native[item] | to_json}}" + status_code: 200 + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + force_basic_auth: yes + when: manage_native_roles + with_items: "{{ roles_to_modify | default([]) }}" diff --git a/roles/es6/tasks/xpack/security/elasticsearch-security.yml b/roles/es6/tasks/xpack/security/elasticsearch-security.yml new file mode 100644 index 0000000..14f4d20 --- /dev/null +++ b/roles/es6/tasks/xpack/security/elasticsearch-security.yml @@ -0,0 +1,60 @@ +--- +#Security specific configuration done here + +#TODO: 1. Skip users with no password defined or error 2. Passwords | length > 6 + +#Ensure x-pack conf directory is created if necessary +- name: Ensure x-pack conf directory exists (file) + file: path={{ conf_dir }}/x-pack state=directory owner={{ es_user }} group={{ es_group }} + changed_when: False + when: + - es_enable_xpack and "security" in es_xpack_features + - (es_users is defined and es_users.file is defined) or (es_roles is defined and es_roles.file is defined) or (es_role_mapping is defined) + +#-----------------------------Create Bootstrap User----------------------------------- +- name: Check if bootstrap password is set + command: > + {{es_home}}/bin/elasticsearch-keystore list + register: list_keystore + changed_when: False + environment: + ES_PATH_CONF: "{{ conf_dir }}" + when: + - (es_enable_xpack and "security" in es_xpack_features) and (es_version | version_compare('6.0.0', '>')) + +- name: Create Bootstrap password for elastic user + shell: echo "{{es_api_basic_auth_password}}" | {{es_home}}/bin/elasticsearch-keystore add -x 'bootstrap.password' + when: + - (es_enable_xpack and "security" in es_xpack_features) and (es_version | version_compare('6.0.0', '>')) and es_api_basic_auth_username is defined and list_keystore is defined and es_api_basic_auth_username == 'elastic' and 'bootstrap.password' not in list_keystore.stdout_lines + environment: + ES_PATH_CONF: "{{ conf_dir }}" + no_log: true + +#-----------------------------FILE BASED REALM---------------------------------------- + +- include: elasticsearch-security-file.yml + when: (es_enable_xpack and "security" in es_xpack_features) and ((es_users is defined and es_users.file is defined) or (es_roles is defined and es_roles.file is defined)) + +#-----------------------------ROLE MAPPING ---------------------------------------- + +#Copy Roles files +- name: Copy role_mapping.yml File for Instance + become: yes + template: src=security/role_mapping.yml.j2 dest={{conf_dir}}/x-pack/role_mapping.yml owner={{ es_user }} group={{ es_group }} mode=0644 force=yes + when: es_role_mapping is defined + +#-----------------------------AUTH FILE---------------------------------------- + +- name: Copy message auth key to elasticsearch + become: yes + copy: src={{ es_message_auth_file }} dest={{conf_dir}}/x-pack/system_key owner={{ es_user }} group={{ es_group }} mode=0600 force=yes + when: es_message_auth_file is defined + +#------------------------------------------------------------------------------------ + +#Ensure security conf directory is created +- name: Ensure security conf directory exists + become: yes + file: path={{ conf_dir }}/security state=directory owner={{ es_user }} group={{ es_group }} + changed_when: False + when: es_enable_xpack and "security" in es_xpack_features diff --git a/roles/es6/tasks/xpack/security/elasticsearch-xpack-activation.yml b/roles/es6/tasks/xpack/security/elasticsearch-xpack-activation.yml new file mode 100644 index 0000000..cd72d6a --- /dev/null +++ b/roles/es6/tasks/xpack/security/elasticsearch-xpack-activation.yml @@ -0,0 +1,37 @@ +--- + +- name: Activate ES license (without security authentication) + uri: + method: PUT + url: "http://{{es_api_host}}:{{es_api_port}}/_xpack/license?acknowledge=true" + body_format: json + body: "{{ es_xpack_license }}" + return_content: yes + register: license_activated + no_log: True + when: not "security" in es_xpack_features + failed_when: > + license_activated.status != 200 or + license_activated.json.license_status is not defined or + license_activated.json.license_status != 'valid' + +- name: Activate ES license (with security authentication) + uri: + method: PUT + url: "http://{{es_api_host}}:{{es_api_port}}/_xpack/license?acknowledge=true" + user: "{{es_api_basic_auth_username}}" + password: "{{es_api_basic_auth_password}}" + body_format: json + force_basic_auth: yes + body: "{{ es_xpack_license }}" + return_content: yes + register: license_activated + no_log: True + when: "'security' in es_xpack_features" + failed_when: > + license_activated.status != 200 or + license_activated.json.license_status is not defined or + license_activated.json.license_status != 'valid' + +- debug: + msg: "License: {{ license_activated }}" diff --git a/roles/es6/templates/elasticsearch.j2 b/roles/es6/templates/elasticsearch.j2 new file mode 100644 index 0000000..5bf5746 --- /dev/null +++ b/roles/es6/templates/elasticsearch.j2 @@ -0,0 +1,83 @@ +################################ +# Elasticsearch +################################ + +# Elasticsearch home directory +ES_HOME={{es_home}} + +# Elasticsearch Java path +#JAVA_HOME= + +# Elasticsearch configuration directory +CONF_DIR={{conf_dir}} +ES_PATH_CONF={{conf_dir}} + +# Elasticsearch data directory +DATA_DIR={{ data_dirs | array_to_str }} + +# Elasticsearch logs directory +LOG_DIR={{log_dir}} + +# Elasticsearch PID directory +PID_DIR={{pid_dir}} + +ES_JVM_OPTIONS={{conf_dir}}/jvm.options + +# Configure restart on package upgrade (true, every other setting will lead to not restarting) +#ES_RESTART_ON_UPGRADE=true + +# Path to the GC log file +#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log + +################################ +# Elasticsearch service +################################ + +# SysV init.d +# +# When executing the init script, this user will be used to run the elasticsearch service. +# The default value is 'elasticsearch' and is declared in the init.d file. +# Note that this setting is only used by the init script. If changed, make sure that +# the configured user can read and write into the data, work, plugins and log directories. +# For systemd service, the user is usually configured in file /usr/lib/systemd/system/elasticsearch.service +ES_USER={{es_user}} +ES_GROUP={{es_group}} + +# The number of seconds to wait before checking if Elasticsearch started successfully as a daemon process +ES_STARTUP_SLEEP_TIME=5 + +################################ +# System properties +################################ + +# Specifies the maximum file descriptor number that can be opened by this process +# When using Systemd, this setting is ignored and the LimitNOFILE defined in +# /usr/lib/systemd/system/elasticsearch.service takes precedence +{% if es_max_open_files is defined %} +#MAX_OPEN_FILES +MAX_OPEN_FILES={{es_max_open_files}} +{% endif %} + +# The maximum number of bytes of memory that may be locked into RAM +# Set to "unlimited" if you use the 'bootstrap.memory_lock: true' option +# in elasticsearch.yml +# When using Systemd, the LimitMEMLOCK property must be set +# in /usr/lib/systemd/system/elasticsearch.service +#MAX_LOCKED_MEMORY= +{% if m_lock_enabled %} +MAX_LOCKED_MEMORY=unlimited +{% endif %} + +# Maximum number of VMA (Virtual Memory Areas) a process can own +# When using Systemd, this setting is ignored and the 'vm.max_map_count' +# property is set at boot time in /usr/lib/sysctl.d/elasticsearch.conf +#MAX_MAP_COUNT=262144 +{% if es_max_map_count is defined %} +MAX_MAP_COUNT={{es_max_map_count}} +{% endif %} + +# Specifies the maximum number of threads that can be started. +# Elasticsearch requires a minimum of 2048. +{% if es_max_threads is defined %} +MAX_THREADS={{ es_max_threads }} +{% endif %} diff --git a/roles/es6/templates/elasticsearch.repo b/roles/es6/templates/elasticsearch.repo new file mode 100644 index 0000000..b629904 --- /dev/null +++ b/roles/es6/templates/elasticsearch.repo @@ -0,0 +1,11 @@ +[elasticsearch-{{ es_major_version }}] +name=Elasticsearch repository for {{ es_major_version }} packages +baseurl=https://artifacts.elastic.co/packages/{{ es_major_version }}/yum +gpgcheck=1 +gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch +enabled=1 +autorefresh=1 +type=rpm-md +{% if es_proxy_host is defined and es_proxy_host != '' and es_proxy_port is defined %} +proxy=http://{{ es_proxy_host }}:{{es_proxy_port}} +{% endif %} diff --git a/roles/es6/templates/elasticsearch.yml.j2 b/roles/es6/templates/elasticsearch.yml.j2 new file mode 100644 index 0000000..dcf6f7a --- /dev/null +++ b/roles/es6/templates/elasticsearch.yml.j2 @@ -0,0 +1,52 @@ + +{% if es_config %} +{{ es_config | to_nice_yaml }} +{% endif %} + +{% if es_config['cluster.name'] is not defined %} +cluster.name: elasticsearch +{% endif %} + +{% if es_config['node.name'] is not defined %} +node.name: {{inventory_hostname}}-{{es_instance_name}} +{% endif %} + +#################################### Paths #################################### + +# Path to directory containing configuration (this file and logging.yml): + +{% if (es_version | version_compare('6.0.0', '<')) %} +path.conf: {{ conf_dir }} +{% endif %} + +path.data: {{ data_dirs | array_to_str }} + +path.logs: {{ log_dir }} + +{% if es_enable_xpack %} +{% if not "security" in es_xpack_features %} +xpack.security.enabled: false +{% endif %} + +{% if not "monitoring" in es_xpack_features %} +xpack.monitoring.enabled: false +{% endif %} + +{% if not "alerting" in es_xpack_features %} +xpack.watcher.enabled: false +{% endif %} + +{% if not "ml" in es_xpack_features %} +xpack.ml.enabled: false +{% endif %} + +{% if not "graph" in es_xpack_features %} +xpack.graph.enabled: false +{% endif %} +{% endif %} + +network.host: 0.0.0.0 + +{% if es_remote_reindex is defined %} +reindex.remote.whitelist: {{es_remote_host}}:9200 +{% endif %} diff --git a/roles/es6/templates/init/debian/elasticsearch.j2 b/roles/es6/templates/init/debian/elasticsearch.j2 new file mode 100755 index 0000000..efe2c37 --- /dev/null +++ b/roles/es6/templates/init/debian/elasticsearch.j2 @@ -0,0 +1,229 @@ +#!/bin/bash +# +# /etc/init.d/elasticsearch -- startup script for Elasticsearch +# +### BEGIN INIT INFO +# Provides: elasticsearch +# Required-Start: $network $remote_fs $named +# Required-Stop: $network $remote_fs $named +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Starts elasticsearch +# Description: Starts elasticsearch using start-stop-daemon +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +NAME={{es_instance_name}}_{{default_file | basename}} +{% if es_config['node.name'] is defined %} +DESC="Elasticsearch Server - {{es_config['node.name']}}" +{% else %} +DESC="Elasticsearch Server - {{es_instance_name}}" +{% endif %} + +DEFAULT=/etc/default/$NAME + +if [ `id -u` -ne 0 ]; then + echo "You need root privileges to run this script" + exit 1 +fi + +. /lib/lsb/init-functions +if [ -r /etc/default/rcS ]; then + . /etc/default/rcS +fi + +# The following variables can be overwritten in $DEFAULT + +# Run Elasticsearch as this user ID and group ID +ES_USER={{es_user}} +ES_GROUP={{es_group}} + +# Directory where the Elasticsearch binary distribution resides +ES_HOME={{es_home}} + +# Maximum number of open files +{% if es_max_open_files is defined %} +MAX_OPEN_FILES={{es_max_open_files}} +{% endif %} + +# Maximum amount of locked memory +#MAX_LOCKED_MEMORY= +{% if m_lock_enabled %} +MAX_LOCKED_MEMORY=unlimited +{% endif %} + +# Elasticsearch log directory +LOG_DIR={{log_dir}} + +# Elasticsearch data directory +DATA_DIR={{ data_dirs | array_to_str }} + +# Elasticsearch configuration directory +CONF_DIR={{conf_dir}} +ES_PATH_CONF={{ conf_dir }} + +# Maximum number of VMA (Virtual Memory Areas) a process can own +{% if es_max_map_count is defined %} +MAX_MAP_COUNT={{es_max_map_count}} +{% endif %} + +# Elasticsearch PID file directory +PID_DIR={{pid_dir}} + +ES_JVM_OPTIONS="{{conf_dir}}/jvm.options" + +# End of variables that can be overwritten in $DEFAULT + +# overwrite settings from default file +if [ -f "$DEFAULT" ]; then + . "$DEFAULT" +fi + +# CONF_FILE setting was removed +if [ ! -z "$CONF_FILE" ]; then + echo "CONF_FILE setting is no longer supported. elasticsearch.yml must be placed in the config directory and cannot be renamed." + exit 1 +fi + +if [ "$ES_USER" != "elasticsearch" ] || [ "$ES_GROUP" != "elasticsearch" ]; then + echo "WARNING: ES_USER and ES_GROUP are deprecated and will be removed in the next major version of Elasticsearch, got: [$ES_USER:$ES_GROUP]" +fi + +# Define other required variables +PID_FILE="$PID_DIR/$NAME.pid" +DAEMON=$ES_HOME/bin/elasticsearch +{% if (es_version | version_compare('6.0.0', '<')) %} +DAEMON_OPTS="-d -p $PID_FILE -Edefault.path.logs=$LOG_DIR -Edefault.path.data=$DATA_DIR -Edefault.path.conf=$CONF_DIR" +{% else %} +DAEMON_OPTS="-d -p $PID_FILE" +{% endif %} + +export ES_JAVA_OPTS +export JAVA_HOME +export ES_INCLUDE +export ES_JVM_OPTIONS +export ES_PATH_CONF + +# export unsupported variables so bin/elasticsearch can reject them and inform the user these are unsupported +if test -n "$ES_MIN_MEM"; then export ES_MIN_MEM; fi +if test -n "$ES_MAX_MEM"; then export ES_MAX_MEM; fi +if test -n "$ES_HEAP_SIZE"; then export ES_HEAP_SIZE; fi +if test -n "$ES_HEAP_NEWSIZE"; then export ES_HEAP_NEWSIZE; fi +if test -n "$ES_DIRECT_SIZE"; then export ES_DIRECT_SIZE; fi +if test -n "$ES_USE_IPV4"; then export ES_USE_IPV4; fi +if test -n "$ES_GC_OPTS"; then export ES_GC_OPTS; fi +if test -n "$ES_GC_LOG_FILE"; then export ES_GC_LOG_FILE; fi + +# Check DAEMON exists +if [ ! -x "$DAEMON" ]; then + echo "The elasticsearch startup script does not exists or it is not executable, tried: $DAEMON" + exit 1 +fi + +checkJava() { + if [ -x "$JAVA_HOME/bin/java" ]; then + JAVA="$JAVA_HOME/bin/java" + else + JAVA=`which java` + fi + + if [ ! -x "$JAVA" ]; then + echo "Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME" + exit 1 + fi +} + +case "$1" in + start) + checkJava + + log_daemon_msg "Starting $DESC" + + pid=`pidofproc -p $PID_FILE elasticsearch` + if [ -n "$pid" ] ; then + log_begin_msg "Already running." + log_end_msg 0 + exit 0 + fi + + # Ensure that the PID_DIR exists (it is cleaned at OS startup time) + if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then + mkdir -p "$PID_DIR" && chown "$ES_USER":"$ES_GROUP" "$PID_DIR" + fi + if [ -n "$PID_FILE" ] && [ ! -e "$PID_FILE" ]; then + touch "$PID_FILE" && chown "$ES_USER":"$ES_GROUP" "$PID_FILE" + fi + + if [ -n "$MAX_OPEN_FILES" ]; then + ulimit -n $MAX_OPEN_FILES + fi + + if [ -n "$MAX_LOCKED_MEMORY" ]; then + ulimit -l $MAX_LOCKED_MEMORY + fi + + if [ -n "$MAX_THREADS" ]; then + ulimit -u $MAX_THREADS + fi + + if [ -n "$MAX_MAP_COUNT" -a -f /proc/sys/vm/max_map_count ]; then + sysctl -q -w vm.max_map_count=$MAX_MAP_COUNT + fi + + # Start Daemon + start-stop-daemon -d $ES_HOME --start --user "$ES_USER" -c "$ES_USER" --pidfile "$PID_FILE" --exec $DAEMON -- $DAEMON_OPTS + return=$? + if [ $return -eq 0 ]; then + i=0 + timeout={{es_debian_startup_timeout}} + # Wait for the process to be properly started before exiting + until { kill -0 `cat "$PID_FILE"`; } >/dev/null 2>&1 + do + sleep 1 + i=$(($i + 1)) + if [ $i -gt $timeout ]; then + log_end_msg 1 + exit 1 + fi + done + fi + log_end_msg $return + exit $return + ;; + stop) + log_daemon_msg "Stopping $DESC" + + if [ -f "$PID_FILE" ]; then + start-stop-daemon --stop --pidfile "$PID_FILE" \ + --user "$ES_USER" \ + --quiet \ + --retry forever/TERM/20 > /dev/null + if [ $? -eq 1 ]; then + log_progress_msg "$DESC is not running but pid file exists, cleaning up" + elif [ $? -eq 3 ]; then + PID="`cat $PID_FILE`" + log_failure_msg "Failed to stop $DESC (pid $PID)" + exit 1 + fi + rm -f "$PID_FILE" + else + log_progress_msg "(not running)" + fi + log_end_msg 0 + ;; + status) + status_of_proc -p $PID_FILE elasticsearch elasticsearch && exit 0 || exit $? + ;; + restart|force-reload) + if [ -f "$PID_FILE" ]; then + $0 stop + fi + $0 start + ;; + *) + log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}" + exit 1 + ;; +esac + +exit 0 diff --git a/roles/es6/templates/init/redhat/elasticsearch.j2 b/roles/es6/templates/init/redhat/elasticsearch.j2 new file mode 100755 index 0000000..c993e14 --- /dev/null +++ b/roles/es6/templates/init/redhat/elasticsearch.j2 @@ -0,0 +1,217 @@ +#!/bin/bash +# +# elasticsearch