From 9d589811b68c65da6fb701e70cd0703cd744fd38 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 7 Apr 2018 11:29:22 +0100 Subject: [PATCH] Stats collection WIP --- group_vars/all.yml.dist | 8 + roles/ansible-nas/tasks/general.yml | 1 + roles/ansible-nas/tasks/main.yml | 6 +- roles/ansible-nas/tasks/stats.yml | 35 ++ roles/ansible-nas/tasks/vpn.yml | 38 ++ roles/ansible-nas/templates/telegraf.conf | 424 ++++++++++++++++++++++ 6 files changed, 511 insertions(+), 1 deletion(-) create mode 100644 roles/ansible-nas/tasks/stats.yml create mode 100644 roles/ansible-nas/tasks/vpn.yml create mode 100644 roles/ansible-nas/templates/telegraf.conf diff --git a/group_vars/all.yml.dist b/group_vars/all.yml.dist index d817ba58..c9a3614b 100644 --- a/group_vars/all.yml.dist +++ b/group_vars/all.yml.dist @@ -184,3 +184,11 @@ crashplan_group_id: 0 znc_data_directory: "{{ docker_home }}/znc" znc_user_id: 0 znc_group_id: 0 + + +### +### Stats +### +telegraf_config_directory: "{{ docker_home }}/telegraf" +influxdb_data_directory: "{{ docker_home }}/influxdb" +stat_collection_interval: 15s \ No newline at end of file diff --git a/roles/ansible-nas/tasks/general.yml b/roles/ansible-nas/tasks/general.yml index 2969d364..3f83711a 100644 --- a/roles/ansible-nas/tasks/general.yml +++ b/roles/ansible-nas/tasks/general.yml @@ -20,6 +20,7 @@ - zfs - bonnie++ - unzip + - lm-sensors # - name: Configure smartmontools diff --git a/roles/ansible-nas/tasks/main.yml b/roles/ansible-nas/tasks/main.yml index 084f8d9b..cb06757a 100644 --- a/roles/ansible-nas/tasks/main.yml +++ b/roles/ansible-nas/tasks/main.yml @@ -41,4 +41,8 @@ - include: znc.yml when: znc_enabled == true - tags: znc \ No newline at end of file + tags: znc + +- include: stats.yml + when: stats_enabled == true + tags: stats \ No newline at end of file diff --git a/roles/ansible-nas/tasks/stats.yml b/roles/ansible-nas/tasks/stats.yml new file mode 100644 index 00000000..6d59b2d5 --- /dev/null +++ b/roles/ansible-nas/tasks/stats.yml @@ -0,0 +1,35 @@ +--- +- name: Create Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ influxdb_data_directory }}" + - "{{ telegraf_config_directory }}" + +- name: influxdb + docker_container: + name: influxdb + image: influxdb + pull: true + volumes: + - "{{ influxdb_data_directory }}:/var/lib/influxdb:rw" + - "8086:8086" + restart_policy: unless-stopped + memory: 1g + +- name: Template telegraf.conf + template: + src: telegraf.conf + dest: "{{ telegraf_config_directory }}/telegraf.conf" + +- name: telegraf + docker_container: + name: telegraf + image: telegraf + pull: true + volumes: + - "{{ telegraf_config_directory }}/telegraf.conf:/etc/telegraf/telegraf.conf:ro" + restart_policy: unless-stopped + memory: 1g + diff --git a/roles/ansible-nas/tasks/vpn.yml b/roles/ansible-nas/tasks/vpn.yml new file mode 100644 index 00000000..1d408ffa --- /dev/null +++ b/roles/ansible-nas/tasks/vpn.yml @@ -0,0 +1,38 @@ +--- +- include_vars: group_vars/vpn_credentials.yml + +- name: Create NordVPN Config Directory + file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ openvpn_config_directory }}/nordvpn" + +- name: Download latest NordVPN configs + unarchive: + src: https://nordvpn.com/api/files/zip + dest: "{{ openvpn_config_directory }}/nordvpn" + remote_src: True + +- name: Replace NordVPN configs with credential file + shell: 'sed -i "s/auth-user-pass/auth-user-pass \/config\/openvpn-credentials.txt/" {{ openvpn_config_directory }}/nordvpn/*.ovpn' + +- name: VPN Container + docker_container: + name: openvpn-client + image: dceschmidt/openvpn-client + pull: true + env: + OPENVPN_PROVIDER: "{{ openvpn_provider }}" + OPENVPN_USERNAME: "{{ openvpn_username }}" + OPENVPN_PASSWORD: "{{ openvpn_password }}" + OPENVPN_CONFIG: "{{ openvpn_config }}" + volumes: + "{{ openvpn_config_directory }}/nordvpn:/etc/openvpn/conf/nordvpn:rw" + devices: + - /dev/net/tun + capabilities: + - NET_ADMIN + restart_policy: unless-stopped + memory: 1g diff --git a/roles/ansible-nas/templates/telegraf.conf b/roles/ansible-nas/templates/telegraf.conf new file mode 100644 index 00000000..1c194940 --- /dev/null +++ b/roles/ansible-nas/templates/telegraf.conf @@ -0,0 +1,424 @@ +# Telegraf Configuration +# +# Telegraf is entirely plugin driven. All metrics are gathered from the +# declared inputs, and sent to the declared outputs. +# +# Plugins must be declared in here to be active. +# To deactivate a plugin, comment out the name and any variables. +# +# Use 'telegraf -config telegraf.conf -test' to see what metrics a config +# file would generate. +# +# Environment variables can be used anywhere in this config file, simply prepend +# them with $. For strings the variable must be within quotes (ie, "$STR_VAR"), +# for numbers and booleans they should be plain (ie, $INT_VAR, $BOOL_VAR) + + +# Global tags can be specified here in key="value" format. +[global_tags] + # dc = "us-east-1" # will tag all metrics with dc=us-east-1 + # rack = "1a" + ## Environment variables can be used as tags, and throughout the config file + # user = "$USER" + + +# Configuration for telegraf agent +[agent] + ## Default data collection interval for all inputs + interval = "{{ stat_collection_interval }}" + ## Rounds collection interval to 'interval' + ## ie, if interval="10s" then always collect on :00, :10, :20, etc. + round_interval = true + + ## Telegraf will send metrics to outputs in batches of at most + ## metric_batch_size metrics. + ## This controls the size of writes that Telegraf sends to output plugins. + metric_batch_size = 1000 + + ## For failed writes, telegraf will cache metric_buffer_limit metrics for each + ## output, and will flush this buffer on a successful write. Oldest metrics + ## are dropped first when this buffer fills. + ## This buffer only fills when writes fail to output plugin(s). + metric_buffer_limit = 10000 + + ## Collection jitter is used to jitter the collection by a random amount. + ## Each plugin will sleep for a random time within jitter before collecting. + ## This can be used to avoid many plugins querying things like sysfs at the + ## same time, which can have a measurable effect on the system. + collection_jitter = "0s" + + ## Default flushing interval for all outputs. You shouldn't set this below + ## interval. Maximum flush_interval will be flush_interval + flush_jitter + flush_interval = "10s" + ## Jitter the flush interval by a random amount. This is primarily to avoid + ## large write spikes for users running a large number of telegraf instances. + ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s + flush_jitter = "0s" + + ## By default or when set to "0s", precision will be set to the same + ## timestamp order as the collection interval, with the maximum being 1s. + ## ie, when interval = "10s", precision will be "1s" + ## when interval = "250ms", precision will be "1ms" + ## Precision will NOT be used for service inputs. It is up to each individual + ## service input to set the timestamp at the appropriate precision. + ## Valid time units are "ns", "us" (or "µs"), "ms", "s". + precision = "" + + ## Logging configuration: + ## Run telegraf with debug log messages. + debug = false + ## Run telegraf in quiet mode (error log messages only). + quiet = true + ## Specify the log file name. The empty string means to log to stderr. + logfile = "" + + ## Override default hostname, if empty use os.Hostname() + hostname = "{{ ansible_nas_hostname }}" + ## If set to true, do no set the "host" tag in the telegraf agent. + omit_hostname = false + + +############################################################################### +# OUTPUT PLUGINS # +############################################################################### + +# Configuration for sending metrics to InfluxDB +[[outputs.influxdb]] + ## The full HTTP or UDP URL for your InfluxDB instance. + ## + ## Multiple URLs can be specified for a single cluster, only ONE of the + ## urls will be written to each interval. + urls = ["unix:///var/run/influxdb.sock"] + # urls = ["udp://127.0.0.1:8089"] + urls = ["http://{{ ansible_nas_hostname }}:8086"] + + ## The target database for metrics; will be created as needed. + # database = "telegraf" + + ## If true, no CREATE DATABASE queries will be sent. Set to true when using + ## Telegraf with a user without permissions to create databases or when the + ## database already exists. + # skip_database_creation = false + + ## Name of existing retention policy to write to. Empty string writes to + ## the default retention policy. + # retention_policy = "" + + ## Write consistency (clusters only), can be: "any", "one", "quorum", "all" + # write_consistency = "any" + + ## Timeout for HTTP messages. + # timeout = "5s" + + ## HTTP Basic Auth + # username = "telegraf" + # password = "metricsmetricsmetricsmetrics" + + ## HTTP User-Agent + # user_agent = "telegraf" + + ## UDP payload size is the maximum packet size to send. + # udp_payload = 512 + + ## Optional SSL Config + # ssl_ca = "/etc/telegraf/ca.pem" + # ssl_cert = "/etc/telegraf/cert.pem" + # ssl_key = "/etc/telegraf/key.pem" + ## Use SSL but skip chain & host verification + # insecure_skip_verify = false + + ## HTTP Proxy override, if unset values the standard proxy environment + ## variables are consulted to determine which proxy, if any, should be used. + # http_proxy = "http://corporate.proxy:3128" + + ## Additional HTTP headers + # http_headers = {"X-Special-Header" = "Special-Value"} + + ## HTTP Content-Encoding for write request body, can be set to "gzip" to + ## compress body or "identity" to apply no encoding. + # content_encoding = "identity" + + ## When true, Telegraf will output unsigned integers as unsigned values, + ## i.e.: "42u". You will need a version of InfluxDB supporting unsigned + ## integer values. Enabling this option will result in field type errors if + ## existing data has been written. + # influx_uint_support = false + + + + +############################################################################### +# INPUT PLUGINS # +############################################################################### + +# Read metrics about cpu usage +[[inputs.cpu]] + ## Whether to report per-cpu stats or not + percpu = true + ## Whether to report total system cpu stats or not + totalcpu = true + ## If true, collect raw CPU time metrics. + collect_cpu_time = false + ## If true, compute and report the sum of all non-idle CPU states. + report_active = false + + +# Read metrics about disk usage by mount point +[[inputs.disk]] + ## By default stats will be gathered for all mount points. + ## Set mount_points will restrict the stats to only the specified mount points. + # mount_points = ["/"] + + ## Ignore mount points by filesystem type. + ignore_fs = ["tmpfs", "devtmpfs", "devfs"] + + +# Read metrics about disk IO by device +[[inputs.diskio]] + ## By default, telegraf will gather stats for all devices including + ## disk partitions. + ## Setting devices will restrict the stats to the specified devices. + # devices = ["sda", "sdb", "vd*"] + ## Uncomment the following line if you need disk serial numbers. + # skip_serial_number = false + # + ## On systems which support it, device metadata can be added in the form of + ## tags. + ## Currently only Linux is supported via udev properties. You can view + ## available properties for a device by running: + ## 'udevadm info -q property -n /dev/sda' + # device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"] + # + ## Using the same metadata source as device_tags, you can also customize the + ## name of the device via templates. + ## The 'name_templates' parameter is a list of templates to try and apply to + ## the device. The template may contain variables in the form of '$PROPERTY' or + ## '${PROPERTY}'. The first template which does not contain any variables not + ## present for the device is used as the device name tag. + ## The typical use case is for LVM volumes, to get the VG/LV name instead of + ## the near-meaningless DM-0 name. + # name_templates = ["$ID_FS_LABEL","$DM_VG_NAME/$DM_LV_NAME"] + + +# Get kernel statistics from /proc/stat +[[inputs.kernel]] + # no configuration + + +# Read metrics about memory usage +[[inputs.mem]] + # no configuration + + +# Get the number of processes and group them by status +[[inputs.processes]] + # no configuration + + +# Read metrics about swap memory usage +[[inputs.swap]] + # no configuration + + +# Read metrics about system load & uptime +[[inputs.system]] + # no configuration + + + +# # Read metrics about docker containers +# [[inputs.docker]] +# ## Docker Endpoint +# ## To use TCP, set endpoint = "tcp://[ip]:[port]" +# ## To use environment variables (ie, docker-machine), set endpoint = "ENV" +# endpoint = "unix:///var/run/docker.sock" +# +# ## Set to true to collect Swarm metrics(desired_replicas, running_replicas) +# gather_services = false +# +# ## Only collect metrics for these containers, collect all if empty +# container_names = [] +# +# ## Containers to include and exclude. Globs accepted. +# ## Note that an empty array for both will include all containers +# container_name_include = [] +# container_name_exclude = [] +# +# ## Container states to include and exclude. Globs accepted. +# ## When empty only containers in the "running" state will be captured. +# # container_state_include = [] +# # container_state_exclude = [] +# +# ## Timeout for docker list, info, and stats commands +# timeout = "5s" +# +# ## Whether to report for each container per-device blkio (8:0, 8:1...) and +# ## network (eth0, eth1, ...) stats or not +# perdevice = true +# ## Whether to report for each container total blkio and network stats or not +# total = false +# ## Which environment variables should we use as a tag +# ##tag_env = ["JAVA_HOME", "HEAP_SIZE"] +# +# ## docker labels to include and exclude as tags. Globs accepted. +# ## Note that an empty array for both will include all labels as tags +# docker_label_include = [] +# docker_label_exclude = [] +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Monitor disks' temperatures using hddtemp +# [[inputs.hddtemp]] +# ## By default, telegraf gathers temps data from all disks detected by the +# ## hddtemp. +# ## +# ## Only collect temps from the selected disks. +# ## +# ## A * as the device name will return the temperature values of all disks. +# ## +# # address = "127.0.0.1:7634" +# # devices = ["sda", "*"] + +# Read metrics about network interface usage +[[inputs.net]] + ## By default, telegraf gathers stats from any up interface (excluding loopback) + ## Setting interfaces will tell it to gather these explicit interfaces, + ## regardless of status. + ## + # interfaces = ["eth0"] + ## + ## On linux systems telegraf also collects protocol stats. + ## Setting ignore_protocol_stats to true will skip reporting of protocol metrics. + ## + # ignore_protocol_stats = false + ## + +# Read TCP metrics such as established, time wait and sockets counts. +[[inputs.netstat]] + # no configuration + + +# Monitor sensors, requires lm-sensors package +[[inputs.sensors]] + ## Remove numbers from field names. + ## If true, a field name like 'temp1_input' will be changed to 'temp_input'. + # remove_numbers = true + + +# # Read metrics from storage devices supporting S.M.A.R.T. +# [[inputs.smart]] +# ## Optionally specify the path to the smartctl executable +# # path = "/usr/bin/smartctl" +# # +# ## On most platforms smartctl requires root access. +# ## Setting 'use_sudo' to true will make use of sudo to run smartctl. +# ## Sudo must be configured to to allow the telegraf user to run smartctl +# ## with out password. +# # use_sudo = false +# # +# ## Skip checking disks in this power mode. Defaults to +# ## "standby" to not wake up disks that have stoped rotating. +# ## See --nocheck in the man pages for smartctl. +# ## smartctl version 5.41 and 5.42 have faulty detection of +# ## power mode and might require changing this value to +# ## "never" depending on your disks. +# # nocheck = "standby" +# # +# ## Gather detailed metrics for each SMART Attribute. +# ## Defaults to "false" +# ## +# # attributes = false +# # +# ## Optionally specify devices to exclude from reporting. +# # excludes = [ "/dev/pass6" ] +# # +# ## Optionally specify devices and device type, if unset +# ## a scan (smartctl --scan) for S.M.A.R.T. devices will +# ## done and all found will be included except for the +# ## excluded in excludes. +# # devices = [ "/dev/ada0 -d atacam" ] + + +# # Sysstat metrics collector +# [[inputs.sysstat]] +# ## Path to the sadc command. +# # +# ## Common Defaults: +# ## Debian/Ubuntu: /usr/lib/sysstat/sadc +# ## Arch: /usr/lib/sa/sadc +# ## RHEL/CentOS: /usr/lib64/sa/sadc +# sadc_path = "/usr/lib/sa/sadc" # required +# # +# # +# ## Path to the sadf command, if it is not in PATH +# # sadf_path = "/usr/bin/sadf" +# # +# # +# ## Activities is a list of activities, that are passed as argument to the +# ## sadc collector utility (e.g: DISK, SNMP etc...) +# ## The more activities that are added, the more data is collected. +# # activities = ["DISK"] +# # +# # +# ## Group metrics to measurements. +# ## +# ## If group is false each metric will be prefixed with a description +# ## and represents itself a measurement. +# ## +# ## If Group is true, corresponding metrics are grouped to a single measurement. +# # group = true +# # +# # +# ## Options for the sadf command. The values on the left represent the sadf +# ## options and the values on the right their description (which are used for +# ## grouping and prefixing metrics). +# ## +# ## Run 'sar -h' or 'man sar' to find out the supported options for your +# ## sysstat version. +# [inputs.sysstat.options] +# -C = "cpu" +# -B = "paging" +# -b = "io" +# -d = "disk" # requires DISK activity +# "-n ALL" = "network" +# "-P ALL" = "per_cpu" +# -q = "queue" +# -R = "mem" +# -r = "mem_util" +# -S = "swap_util" +# -u = "cpu_util" +# -v = "inode" +# -W = "swap" +# -w = "task" +# # -H = "hugepages" # only available for newer linux distributions +# # "-I ALL" = "interrupts" # requires INT activity +# # +# # +# ## Device tags can be used to add additional tags for devices. +# ## For example the configuration below adds a tag vg with value rootvg for +# ## all metrics with sda devices. +# # [[inputs.sysstat.device_tags.sda]] +# # vg = "rootvg" + + +# Read metrics of ZFS from arcstats, zfetchstats, vdev_cache_stats, and pools +[[inputs.zfs]] + ## ZFS kstat path. Ignored on FreeBSD + ## If not specified, then default is: + # kstatPath = "/proc/spl/kstat/zfs" + + ## By default, telegraf gather all zfs stats + ## If not specified, then default is: + # kstatMetrics = ["arcstats", "zfetchstats", "vdev_cache_stats"] + ## For Linux, the default is: + # kstatMetrics = ["abdstats", "arcstats", "dnodestats", "dbufcachestats", + # "dmu_tx", "fm", "vdev_mirror_stats", "zfetchstats", "zil"] + ## By default, don't gather zpool stats + # poolMetrics = false +