WIP: Add role to auto install docker on hosts 75/61575/6
authorKamil Wiatrowski <kamilx.wiatrowski@intel.com>
Thu, 7 Jun 2018 04:13:01 +0000 (05:13 +0100)
committerKamil Wiatrowski <kamilx.wiatrowski@intel.com>
Fri, 28 Sep 2018 14:47:42 +0000 (16:47 +0200)
Auto install docker with dependencies on hosts:
apt install python
apt install python-pip
pip install docker-py
apt install docker.io
Set docker proxy using host proxy settings.
Updated documentation.

Change-Id: Ibec7e0a7e484d5a9a8656cd3598c3acc7c2e2184
Signed-off-by: Kamil Wiatrowski <kamilx.wiatrowski@intel.com>
17 files changed:
docker/ansible/collectd_service.yml
docker/ansible/collectd_ves.yml
docker/ansible/default.inv [new file with mode: 0644]
docker/ansible/roles/config_files/tasks/ipmi.yml
docker/ansible/roles/config_files/tasks/main.yml
docker/ansible/roles/config_files/tasks/mcelog.yml
docker/ansible/roles/config_files/tasks/uuid.yml [moved from docker/ansible/roles/config_files/tasks/types_db.yml with 81% similarity]
docker/ansible/roles/config_files/templates/default_read_plugins.conf.j2
docker/ansible/roles/config_files/templates/uuid.conf.j2 [new file with mode: 0644]
docker/ansible/roles/config_files/vars/main.yml
docker/ansible/roles/install_docker/tasks/centos.yml [new file with mode: 0644]
docker/ansible/roles/install_docker/tasks/main.yml [new file with mode: 0644]
docker/ansible/roles/install_docker/tasks/proxy.yml [new file with mode: 0644]
docker/ansible/roles/install_docker/tasks/ubuntu.yml [new file with mode: 0644]
docker/ansible/roles/install_docker/vars/main.yml [new file with mode: 0644]
docker/ansible/roles/run_grafana/vars/main.yml
docs/release/userguide/docker.userguide.rst

index bc484d3..965ec8e 100644 (file)
 # limitations under the License.
 ---
 
+- hosts: collectd_hosts influxdb_hosts grafana_hosts
+  become: true
+  become_user: root
+  gather_facts: true
+  roles:
+      - install_docker
+
 - hosts: collectd_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
       - config_files
       - run_collectd
 
 - hosts: influxdb_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
-    - run_influxdb
+      - run_influxdb
 
 - hosts: grafana_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
-    - run_grafana
+      - run_grafana
index aa3f3ff..f6140a5 100644 (file)
 # limitations under the License.
 ---
 
+- hosts: collectd_hosts kafka_hosts ves_hosts
+  become: true
+  become_user: root
+  gather_facts: true
+  roles:
+      - install_docker
+
 - hosts: collectd_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
       - config_files
       - run_collectd
 
 - hosts: kafka_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
-    - run_kafka
+      - run_kafka
 
 - hosts: ves_hosts
-  remote_user: root
+  become: true
+  become_user: root
   roles:
-    - run_ves
+      - run_ves
diff --git a/docker/ansible/default.inv b/docker/ansible/default.inv
new file mode 100644 (file)
index 0000000..b3b21c3
--- /dev/null
@@ -0,0 +1,18 @@
+[collectd_hosts]
+localhost
+
+[collectd_hosts:vars]
+install_mcelog=true
+insert_ipmi_modules=true
+
+[influxdb_hosts]
+#localhost
+
+[grafana_hosts]
+#localhost
+
+[kafka_hosts]
+#localhost
+
+[ves_hosts]
+#localhost
index 5ea62c4..c7359fb 100644 (file)
 # limitations under the License.
 ---
 
-- name: Check if /dev/ipmi0 exists
-  stat:
-    path: /dev/ipmi0
-  register: ipmi0_exists
-  ignore_errors: True
-  tags:
-    - ipmi
-
 - name: check ipmi_devintf is loaded
   shell: "lsmod | cut -d' ' -f1 | grep ipmi_devintf"
   register: ipmi_devintf
   tags:
     - ipmi
 
+- name: insert ipmi module ipmi_devintf
+  command: "modprobe ipmi_devintf"
+  register: ipmi_devintf
+  ignore_errors: true
+  when: ipmi_devintf|failed and insert_ipmi_modules|default(false)|bool
+  tags:
+     - ipmi
+
+- name: insert ipmi module ipmi_si
+  command: "modprobe ipmi_si"
+  register: ipmi_devsi
+  ignore_errors: true
+  when: ipmi_devsi|failed and insert_ipmi_modules|default(false)|bool
+  tags:
+     - ipmi
+
+- name: Check if /dev/ipmi0 exists
+  stat:
+    path: /dev/ipmi0
+  register: ipmi0_exists
+  ignore_errors: true
+  tags:
+     - ipmi
+
 - name: enable ipmi plugin
   template:
     src: ipmi.conf.j2
index 9a9cb30..4bf81f8 100644 (file)
@@ -74,8 +74,8 @@
 - name: enable ipmi plugin
   include: ipmi.yml
 
+- name: enable uuid plugin
+  include: uuid.yml
+
 - name: copy additional config files
   include: additional_configs.yml
-
-- name: copy types.db to target
-  include: types_db.yml
index 9c935e3..bab4b14 100644 (file)
 # limitations under the License.
 ---
 
+- name: install mcelog package
+  package:
+     name: mcelog
+     state: present
+  when: install_mcelog|default(false)|bool
+  tags:
+     - mcelogs
+
+- name: start mcelog daemon if not running
+  service:
+     name: mcelog
+     state: started
+     enabled: true
+  when: install_mcelog|default(false)|bool
+  tags:
+     - mcelogs
+
 - name: check if mcelog running on host
   shell: ps -ef | grep mcelog | grep -v grep > /dev/null
   register: mcelog_running
 # limitations under the License.
 ---
 
-- name: copy types.db to target system
-  copy:
-    src: types.db
-    dest: "{{ typesdb_dir }}/types.db"
-  ignore_errors: True
+- name: enable uuid plugin
+  template:
+    src: uuid.conf.j2
+    dest: "{{ config_file_dir }}/uuid.conf"
   tags:
-     - typesdb
+    - uuid
diff --git a/docker/ansible/roles/config_files/templates/uuid.conf.j2 b/docker/ansible/roles/config_files/templates/uuid.conf.j2
new file mode 100644 (file)
index 0000000..a9a84e7
--- /dev/null
@@ -0,0 +1,20 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+
+LoadPlugin uuid
+
+#<Plugin uuid>
+#  UUIDFile "/etc/uuid"
+#</Plugin>
+
index 37120d8..bfa0fd6 100644 (file)
@@ -23,7 +23,7 @@ interval_value: 10
 
 #network plugin vars
 network_port: 25826
-network_ip_addr: localhost
+network_ip_addr: "{{ (groups['influxdb_hosts']|default({}))[0] | default('localhost') }}"
 
 #ovs event and stats plugin vars
 ovs_event_interval: 1
@@ -54,6 +54,3 @@ write_per_sec: 50
 
 #additional configuration files path
 additional_configs_path: ""
-
-#directory to copy types.db file to
-typesdb_dir: "/opt/collectd/share/collectd/"
diff --git a/docker/ansible/roles/install_docker/tasks/centos.yml b/docker/ansible/roles/install_docker/tasks/centos.yml
new file mode 100644 (file)
index 0000000..b84d98f
--- /dev/null
@@ -0,0 +1,45 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+---
+
+- name: install dependencies for docker
+  package:
+     name: "{{ packages }}"
+     state: present
+  vars:
+     packages:
+        - python
+        - yum-utils
+        - device-mapper-persistent-data
+        - lvm2
+
+- name: set up docker repository
+  command: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo"
+
+- name: install docker-py
+  package:
+     name: python-docker-py
+     state: present
+
+- name: install docker
+  package:
+     name: docker-ce
+     state: present
+
+- name: start docker daemon
+  systemd:
+     name: docker
+     daemon_reload: true
+     state: started
+     enabled: true
diff --git a/docker/ansible/roles/install_docker/tasks/main.yml b/docker/ansible/roles/install_docker/tasks/main.yml
new file mode 100644 (file)
index 0000000..7e015bb
--- /dev/null
@@ -0,0 +1,31 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+---
+
+- name: proxy configuration for docker
+  tags:
+     - install_docker
+  import_tasks: proxy.yml
+
+- name: install docker for ubuntu
+  tags:
+     - install_docker
+  import_tasks: ubuntu.yml
+  when: ansible_distribution == "Ubuntu"
+
+- name: install docker for centos
+  tags:
+     - install_docker
+  import_tasks: centos.yml
+  when: ansible_distribution == "CentOS"
diff --git a/docker/ansible/roles/install_docker/tasks/proxy.yml b/docker/ansible/roles/install_docker/tasks/proxy.yml
new file mode 100644 (file)
index 0000000..397bed4
--- /dev/null
@@ -0,0 +1,55 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+---
+
+- name: create docker proxy configuration file
+  tags:
+     - add_docker_proxy
+  lineinfile:
+     path: "{{ docker_proxy_conf }}"
+     line: "[Service]"
+     create: yes
+
+- name: add docker http_proxy
+  tags:
+     - add_docker_proxy
+  lineinfile:
+     path: "{{ docker_proxy_conf }}"
+     line: "Environment=\"HTTP_PROXY={{ ansible_env.http_proxy }}\""
+  when: ansible_env.http_proxy is defined
+
+- name: add docker https_proxy
+  tags:
+     - add_docker_proxy
+  lineinfile:
+     path: "{{ docker_proxy_conf }}"
+     line: "Environment=\"HTTPS_PROXY={{ ansible_env.https_proxy }}\""
+  when: ansible_env.https_proxy is defined
+
+- name: add docker ftp_proxy
+  tags:
+     - add_docker_proxy
+  lineinfile:
+     path: "{{ docker_proxy_conf }}"
+     line: "Environment=\"FTP_PROXY={{ ansible_env.ftp_proxy }}\""
+  when: ansible_env.ftp_proxy is defined
+
+- name: add docker no_proxy
+  tags:
+     - add_docker_proxy
+  lineinfile:
+     path: "{{ docker_proxy_conf }}"
+     line: "Environment=\"NO_PROXY={{ ansible_env.no_proxy }}\""
+  when: ansible_env.no_proxy is defined
+
diff --git a/docker/ansible/roles/install_docker/tasks/ubuntu.yml b/docker/ansible/roles/install_docker/tasks/ubuntu.yml
new file mode 100644 (file)
index 0000000..4415687
--- /dev/null
@@ -0,0 +1,47 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+---
+
+- name: update package manager cache
+  tags:
+     - cache_update
+  package:
+     update_cache: yes
+
+- name: install python
+  package:
+     name: python
+     state: present
+
+- name: install python-pip
+  package:
+     name: python-pip
+     state: present
+
+- name: install docker-py
+  pip:
+     name: docker-py
+     state: present
+
+- name: install docker
+  package:
+     name: docker.io
+     state: present
+
+- name: start docker daemon
+  systemd:
+     name: docker
+     daemon_reload: true
+     state: started
+     enabled: true
diff --git a/docker/ansible/roles/install_docker/vars/main.yml b/docker/ansible/roles/install_docker/vars/main.yml
new file mode 100644 (file)
index 0000000..0673a63
--- /dev/null
@@ -0,0 +1,18 @@
+#Copyright 2018 OPNFV and Intel Corporation
+#
+# 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.
+---
+
+#docker proxy configuration file
+docker_proxy_conf: "/etc/systemd/system/docker.service.d/proxy.conf"
+
index 0975b59..5caf45d 100644 (file)
@@ -13,5 +13,5 @@
 # limitations under the License.
 ---
 
-influxdb_hostname: localhost
-influxdb_host_ip: 127.0.0.1
+influxdb_hostname: influxdb_host
+influxdb_host_ip: "{{ (groups['influxdb_hosts']|default({}))[0] | default('localhost') }}"
index 50cd7e1..f5291ce 100644 (file)
@@ -94,6 +94,215 @@ Kafka recieves and stores metrics recieved from Collectd. VES application pulls
 which it normalizes into VES format for sending to a VES collector. Please see details in `VES Application User Guide
 <http://docs.opnfv.org/en/latest/submodules/barometer/docs/release/userguide/collectd.ves.userguide.html>`_
 
+Download and Run Docker Images with Ansible-Playbook
+----------------------------------------------------
+
+Install Ansible
+^^^^^^^^^^^^^^^
+.. note::
+   * sudo permissions or root access are required to install ansible.
+   * ansible version needs to be 2.4+, because usage of import/include statements
+
+To install Ansible 2.6.3 on Ubuntu:
+
+.. code:: bash
+
+    $ sudo apt-get install python
+    $ sudo apt-get install python-pip
+    $ sudo pip install 'ansible==2.6.3'
+
+To install Ansible 2.6.3 on Centos:
+
+.. code:: bash
+
+    $ sudo yum install python
+    $ sudo yum install epel-release
+    $ sudo yum install python-pip
+    $ sudo pip install 'ansible==2.6.3'
+
+Clone barometer repo
+^^^^^^^^^^^^^^^^^^^^
+
+.. code:: bash
+
+    $ git clone https://gerrit.opnfv.org/gerrit/barometer
+    $ cd barometer/docker/ansible
+
+Edit inventory file
+^^^^^^^^^^^^^^^^^^^
+Edit inventory file and add hosts: ~/default.inv
+
+.. code:: bash
+
+    [collectd_hosts]
+    localhost
+
+    [collectd_hosts:vars]
+    install_mcelog=true
+    insert_ipmi_modules=true
+
+    [influxdb_hosts]
+    localhost
+
+    [grafana_hosts]
+    localhost
+
+    [kafka_hosts]
+    #localhost
+
+    [ves_hosts]
+    #localhost
+
+Change localhost to different hosts where neccessary.
+Hosts for influxdb and grafana are required only for collectd_service.yml.
+Hosts for kafka and ves are required only for collectd_ves.yml.
+
+To change host for kafka edit kafka_ip_addr in ./roles/config_files/vars/main.yml.
+
+Additional plugin dependencies
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+By default ansible will try to fulfill dependencies for mcelog and ipmi plugin.
+For mcelog plugin it installs mcelog daemon. For ipmi it tries to insert ipmi_devintf
+and ipmi_si kernel modules.
+This can be changed in inventory file with use of variables install_mcelog
+and insert_ipmi_modules, both variables are independent:
+
+.. code:: bash
+
+    [collectd_hosts:vars]
+    install_mcelog=false
+    insert_ipmi_modules=false
+
+Configure ssh keys
+^^^^^^^^^^^^^^^^^^
+
+Generate ssh keys if not present, otherwise move onto next step.
+
+.. code:: bash
+
+    $ sudo ssh-keygen
+
+Coppy ssh key to all target hosts. It requires to provide root password. The example is for localhost.
+
+.. code:: bash
+
+    $ sudo ssh-copy-id root@localhost
+
+Download collectd+influxdb+grafana containers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: bash
+
+    $ sudo ansible-playbook -i ~/default.inv collectd_service.yml
+
+Check the three containers are running, the output of docker ps should be similar to:
+
+.. code:: bash
+
+    $ sudo docker ps
+    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
+    a033aeea180d        opnfv/barometer-grafana    "/run.sh"                9 days ago          Up 7 minutes                            bar-grafana
+    1bca2e4562ab        opnfv/barometer-influxdb   "/entrypoint.sh in..."   9 days ago          Up 7 minutes                            bar-influxdb
+    daeeb68ad1d5        opnfv/barometer-collectd   "/run_collectd.sh ..."   9 days ago          Up 7 minutes                            bar-collectd
+
+To make some changes when a container is running run:
+
+.. code:: bash
+
+    $ sudo docker exec -ti <CONTAINER ID> /bin/bash
+
+Connect to <host_ip>:3000 with a browser and log into grafana: admin/admin
+
+The collectd configuration files can be accessed directly on target system in '/opt/collectd/etc/collectd.conf.d'.
+It can be used for manual changes or enable/disable plugins. If configuration has been modified it is required to
+restart collectd:
+
+.. code:: bash
+
+    $ sudo docker restart bar-collectd
+
+Download collectd+kafka+ves containers
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Before running Kafka an instance of zookeeper is required. See `Run Kafka docker image`_ for notes on how to run it.
+The 'zookeeper_hostname' and 'broker_id' can be set in ./roles/run_kafka/vars/main.yml.
+
+.. code:: bash
+
+    $ sudo ansible-playbook -i ~/default.inv collectd_ves.yml
+
+Check the three containers are running, the output of docker ps should be similar to:
+
+.. code:: bash
+
+    $ sudo docker ps
+    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS               NAMES
+    8b095ad94ea1        zookeeper:3.4.11           "/docker-entrypoin..."   7 minutes ago       Up 7 minutes                                   awesome_jennings
+    eb8bba3c0b76        opnfv/barometer-ves        "./start_ves_app.s..."   21 minutes ago      Up 6 minutes                                   bar-ves
+    86702a96a68c        opnfv/barometer-kafka      "/src/start_kafka.sh"    21 minutes ago      Up 6 minutes                                   bar-kafka
+    daeeb68ad1d5        opnfv/barometer-collectd   "/run_collectd.sh ..."   13 days ago         Up 6 minutes                                   bar-collectd
+
+
+To make some changes when a container is running run:
+
+.. code:: bash
+
+    $ sudo docker exec -ti <CONTAINER ID> /bin/bash
+
+List of default plugins for collectd container
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+By default the collectd is started with default configuration which includes the followin plugins:
+   * csv, contextswitch, cpu, cpufreq, df, disk, ethstat, ipc, irq, load, memory, numa, processes,
+     swap, turbostat, uuid, uptime, exec, hugepages, intel_pmu, ipmi, write_kafka, logfile, mcelog,
+     network, intel_rdt, rrdtool, snmp_agent, syslog, virt, ovs_stats, ovs_events
+
+Some of the plugins are loaded depending on specific system requirements and can be omitted if
+dependency is not met, this is the case for:
+   * hugepages, ipmi, mcelog, intel_rdt, virt, ovs_stats, ovs_events
+
+List and description of tags used in ansible scripts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Tags can be used to run a specific part of the configuration without running the whole playbook.
+To run a specific parts only:
+
+.. code:: bash
+
+    $ sudo ansible-playbook -i ~/default.inv collectd_service.yml --tags "syslog,cpu,uuid"
+
+To disable some parts or plugins:
+
+.. code:: bash
+
+    $ sudo ansible-playbook -i ~/default.inv collectd_service.yml --skip-tags "en_default_all,syslog,cpu,uuid"
+
+List of available tags:
+
+install_docker
+  Install docker and required dependencies with package manager.
+
+add_docker_proxy
+  Configure proxy file for docker service if proxy is set on host environment.
+
+rm_config_dir
+  Remove collectd config files.
+
+copy_additional_configs
+  Copy additional configuration files to target system. Path to additional configuration
+  is stored in $barometer_dir/docker/ansible/roles/config_files/vars/main.yml as additional_configs_path.
+
+en_default_all
+  Set of default read plugins: contextswitch, cpu, cpufreq, df, disk, ethstat, ipc, irq,
+  load, memory, numa, processes, swap, turbostat, uptime.
+
+plugins tags
+  The following tags can be used to enable/disable plugins: csv, contextswitch, cpu,
+  cpufreq, df, disk, ethstat, ipc, irq, load, memory, numa, processes, swap, turbostat,
+  uptime, exec, hugepages, ipmi, kafka, logfile, mcelogs, network, pmu, rdt, rrdtool,
+  snmp, syslog, virt, ovs_stats, ovs_events, uuid.
+
 Installing Docker
 -----------------
 .. Describe the specific capabilities and usage for <XYZ> feature.