diff options
author | Kamil Wiatrowski <kamilx.wiatrowski@intel.com> | 2018-06-07 05:13:01 +0100 |
---|---|---|
committer | Kamil Wiatrowski <kamilx.wiatrowski@intel.com> | 2018-09-28 16:47:42 +0200 |
commit | 24c5124e304b8e2854d98284f6ee4715a75ee735 (patch) | |
tree | 420ff7e0158e3a8c68d3e2710469fbcb9c06c853 | |
parent | b52c942a4fbfc5023780d23954de953b817c6dc0 (diff) |
WIP: Add role to auto install docker on hosts
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, 525 insertions, 34 deletions
diff --git a/docker/ansible/collectd_service.yml b/docker/ansible/collectd_service.yml index bc484d31..965ec8ee 100644 --- a/docker/ansible/collectd_service.yml +++ b/docker/ansible/collectd_service.yml @@ -13,18 +13,28 @@ # 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 diff --git a/docker/ansible/collectd_ves.yml b/docker/ansible/collectd_ves.yml index aa3f3ffa..f6140a5f 100644 --- a/docker/ansible/collectd_ves.yml +++ b/docker/ansible/collectd_ves.yml @@ -13,18 +13,28 @@ # 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 index 00000000..b3b21c35 --- /dev/null +++ b/docker/ansible/default.inv @@ -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 diff --git a/docker/ansible/roles/config_files/tasks/ipmi.yml b/docker/ansible/roles/config_files/tasks/ipmi.yml index 5ea62c47..c7359fbf 100644 --- a/docker/ansible/roles/config_files/tasks/ipmi.yml +++ b/docker/ansible/roles/config_files/tasks/ipmi.yml @@ -13,14 +13,6 @@ # 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 @@ -35,6 +27,30 @@ 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 diff --git a/docker/ansible/roles/config_files/tasks/main.yml b/docker/ansible/roles/config_files/tasks/main.yml index 9a9cb300..4bf81f81 100644 --- a/docker/ansible/roles/config_files/tasks/main.yml +++ b/docker/ansible/roles/config_files/tasks/main.yml @@ -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 diff --git a/docker/ansible/roles/config_files/tasks/mcelog.yml b/docker/ansible/roles/config_files/tasks/mcelog.yml index 9c935e3e..bab4b142 100644 --- a/docker/ansible/roles/config_files/tasks/mcelog.yml +++ b/docker/ansible/roles/config_files/tasks/mcelog.yml @@ -13,6 +13,23 @@ # 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 diff --git a/docker/ansible/roles/config_files/tasks/types_db.yml b/docker/ansible/roles/config_files/tasks/uuid.yml index 7603bdcf..25cfa128 100644 --- a/docker/ansible/roles/config_files/tasks/types_db.yml +++ b/docker/ansible/roles/config_files/tasks/uuid.yml @@ -13,10 +13,9 @@ # 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/default_read_plugins.conf.j2 b/docker/ansible/roles/config_files/templates/default_read_plugins.conf.j2 index fd941a76..48beb0be 100644 --- a/docker/ansible/roles/config_files/templates/default_read_plugins.conf.j2 +++ b/docker/ansible/roles/config_files/templates/default_read_plugins.conf.j2 @@ -30,6 +30,5 @@ Interval "{{ interval_value }}" #LoadPlugin processes #LoadPlugin swap #LoadPlugin turbostat -#LoadPlugin uuid #LoadPlugin uptime 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 index 00000000..a9a84e71 --- /dev/null +++ b/docker/ansible/roles/config_files/templates/uuid.conf.j2 @@ -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> + diff --git a/docker/ansible/roles/config_files/vars/main.yml b/docker/ansible/roles/config_files/vars/main.yml index 37120d86..bfa0fd68 100644 --- a/docker/ansible/roles/config_files/vars/main.yml +++ b/docker/ansible/roles/config_files/vars/main.yml @@ -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 index 00000000..b84d98f2 --- /dev/null +++ b/docker/ansible/roles/install_docker/tasks/centos.yml @@ -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 index 00000000..7e015bbc --- /dev/null +++ b/docker/ansible/roles/install_docker/tasks/main.yml @@ -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 index 00000000..397bed4c --- /dev/null +++ b/docker/ansible/roles/install_docker/tasks/proxy.yml @@ -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 index 00000000..44156873 --- /dev/null +++ b/docker/ansible/roles/install_docker/tasks/ubuntu.yml @@ -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 index 00000000..0673a63a --- /dev/null +++ b/docker/ansible/roles/install_docker/vars/main.yml @@ -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" + diff --git a/docker/ansible/roles/run_grafana/vars/main.yml b/docker/ansible/roles/run_grafana/vars/main.yml index 0975b598..5caf45da 100644 --- a/docker/ansible/roles/run_grafana/vars/main.yml +++ b/docker/ansible/roles/run_grafana/vars/main.yml @@ -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') }}" diff --git a/docs/release/userguide/docker.userguide.rst b/docs/release/userguide/docker.userguide.rst index 50cd7e15..f5291ce1 100644 --- a/docs/release/userguide/docker.userguide.rst +++ b/docs/release/userguide/docker.userguide.rst @@ -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. |