ODROID-HC2 and Ansible

After installing Fedora 29 on my ODROID-HC2 nodes, I want to get an ansible user onto them so that my usual Ansible playbooks can configure them.

Overview of steps

  1. Ensure that both python and libselinux-python are installed on the ODROID
  2. Ensure your ODROID-HC2 is in your inventory
  3. Set up variables as needed
  4. Ensure you can ansible … -m ping …
  5. optional: Create an ansible user on the ODROID-HC2 by doing one of
    • using a playbook that connects as user root
    • using shell commands
  6. optional: Run all future playbooks as the ansible user

Prerequisites

  1. An OS supported by Ansible on your ODROID-HC2, I installed Fedora on mine
  2. Ability to log into the ODROID-HC2 via ssh as root using a ssh key

Should you be unable to ssh, then you will probablyt need a serial console to fix it. See installing Fedora 29 on my ODROID-HC2 for details on the serial console.

Prepare node for Ansible

Since the image Fedora-Minimal-armhfp-29-1.2 is lacking 2 packages needed for ansible to control the node, install them manually.

On the ODROID, as root

dnf install python libselinux-python

NOTE: be patient with your first use of dnf, it can take a few minutes. This improves after dnf-makecache ran once. You can check the status of dnf-makecache.service and system activity on the ODROID, as root, by using

journalctl _SYSTEMD_UNIT=dnf-makecache.service
top -bn1 | head -n 10

Verify Ansible Connectivity

Verify that you can reach the ODROID with Ansible. For now as user root, as no other user yet present.

On the Ansible control node

ansible odroid-hc2-00 -m ping -e ansible_user=root

Using -e ansible_user=root ensures it takes highest variable precedence. (thanks to jtanner for the doc pointer). Unless of course you created a user for Ansible during your OS installation of the ODROID-HC2. Then you drop the option, ansible odroid-hc2-00 -m ping

It should return this

odroid-hc2-00 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

If this fails, you will need to ssh -v (with your key) to the ODROID as root and debug why Ansible can not connect.

Configure your ODROID with Ansible

At this point, you can configure your ODROID-HC2 nodes’ Fedora with Ansible. Hopefully you wrote your playbooks and roles without hardcoding x86_64 ;-)

Notes:

  • use the ssh privkey matching the pubkey you installed on the ODROID
    • I recomend using ssh-agent if you Ansible from a shell or development environment
    • I recommend a credentials store if you use Ansible Tower.
  • as my instructions create only a root user, initially start with an Ansible play that connects as root and sets up an ansible user.
    • do not forget to set up password-less sudo.

You may want to continue reading to get an idea of the steps I perform.

my Ansible setup

Note that the below is just what I used while creating this post.

You probably want to use your own playbooks and roles now that you learned what needs doing.

This section mainly serves as a note to self.

group_vars

inventories/group_vars/ceph-housenet.yml contains the following

---
user_owner: pcfe
ansible_user: ansible
common_timezone: Europe/Berlin

inventories/group_vars/ceph-arm-nodes contains the following

---
ansible_python_interpreter: /usr/bin/python3
# the firewalld Ansible module needs python3
# see https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3

ansible_python_interpreter because I use the firewalld module in my module pcfe.check_mk.

sample host_vars

inventories/host_vars/odroid-hc2-00.yml

network_connections:
  - name: "Wired connection 1"
    type: "ethernet"
    interface_name: "eth0"
    zone: "public"
    state: up
    ip:
      dhcp4:      no
      auto6:      no
      gateway4:   192.168.50.251
      dns:        192.168.50.252
      dns_search: internal.pcfe.net
      address:    192.168.50.160/24

inventory

inventories/ceph-HouseNet-cluster contains the following

[ceph-arm-nodes]
odroid-hc2-[00:04]

[ceph-x86-nodes]
ceph-ansible
ceph-dashboard

[ceph-housenet:children]
ceph-arm-nodes
ceph-x86-nodes

[ceph-housenet:vars]
ansible_user=ansible

[mons]
odroid-hc2-[00:02]

# MGRs are typically collocated with MONs
[mgrs]
odroid-hc2-[00:02]

[osds]
odroid-hc2-[00:04]

#[clients]
#odroid-hc2-00

# ceph-grafana should not live on an OSD node
[ceph-grafana]
ceph-dashboard

My Initial Setup Playbook

My Playbook odroid-initial-setup.yml uses the following roles

  • pcfe.user_owner is abused to create the ansible user
  • pcfe.basic-security-setup sets non-negotiable security settings
  • pcfe.housenet sets up timezone and the use of local package mirrors

It will also

  • set up chrony
  • apply all errata
  • ensure the ansible user can sudo without a password

The play odroid-initial-setup.yml is as follows

# initially sets up a Fedora 29 ARM minimal install
# you can run this after completing the steps at
# https://blog.pcfe.net/hugo/posts/2019-01-27-fedora-29-on-odroid-hc2/
#
# this initial setup Playbook must connect as user root,
# after it ran we can connect as user ansible.
# since user_owner is set (in vars: below) to 'ansible',
# pcfe.user_owner creates the user 'ansible' and drops in ssh pubkeys
#
# this is for my ODROID-HC2 boxes
#
- hosts:
  - ceph-arm-nodes
  become: no
  roles:
    - pcfe.user_owner
    - pcfe.basic-security-setup
    - pcfe.housenet

  vars:
    ansible_user: root
    user_owner: ansible

  tasks:
    # start by enabling time sync, while my ODROIDs do have the RTC battery add-on, yours might not.
    # Plus it's nice to be able to wake up the boards from poweroff
    # and have the correct time alredy before chrony-wait runs at boot
    - name:         "CHRONYD | ensure chrony-wait is enabled"
      service:
        name:       chrony-wait
        enabled:    true
    - name:         "CHRONYD | ensure chronyd is enabled and running"
      service:
        name:       chronyd
        enabled:    true
        state:      started

    # I do want all errata applied
    - name: "DNF | ensure all updates are applied"
      dnf:
        update_cache: yes
        name: '*'
        state: latest
      tags: apply_errata


    # enable passwordless sudo for the created ansible user
    - name: "SUDO | enable passwordless sudo for ansible user"
      copy:
        dest: /etc/sudoers.d/ansible
        content: |
          ansible   ALL=NOPASSWD:   ALL
        owner: root
        group: root
        mode: 0440

Output of Initial Setup Playbook

So that you can get an idea of what the roles used do, the full log follows. Still, you most probably want to use your own playbooks and roles.

ansible-playbook -i ../inventories/ceph-HouseNet-cluster -l odroid-hc2-00 --skip-tags apply_errata odroid-initial-setup.yml | tee ../../hugo-blog.pcfe.net/static/code/odroid-initial-setup.log

(In this example, I skip applying errata in order to get this log output quicker)


PLAY [ceph-arm-nodes] *******************************************************************************

TASK [Gathering Facts] ******************************************************************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure group ansible exists] ***********************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure user ansible exists] ************************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure authorized key for ansible exists] **********************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure authorized key for root exists] *************************
ok: [odroid-hc2-00]

TASK [pcfe.basic-security-setup : BASIC SEC | ensure selinux is running with enforcing] *************
ok: [odroid-hc2-00]

TASK [pcfe.basic-security-setup : BASIC SEC | ensure ssh auth is via ssh-key only] ******************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : TIMEZONE | ensure timezone is Europe/Berlin] **********************************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure repo CentOS-Updates-HouseNet is enabled if on CentOS >= 7.0] *****
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure updates repo is disabled if on CentOS >= 7.0] ********************
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure all security updates are applied if on CentOS >= 7.0] ************
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure repo updates-housenet is enabled if on Fedora >= 28] *************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure updates repo is disabled if on Fedora >= 28] *********************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure repo fedora-everything-housenet is enabled if on Fedora >= 28] ***
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure fedora repo is disabled if on Fedora >= 28] **********************
ok: [odroid-hc2-00]

TASK [CHRONYD | ensure chrony-wait is enabled] ******************************************************
ok: [odroid-hc2-00]

TASK [CHRONYD | ensure chronyd is enabled and running] **********************************************
ok: [odroid-hc2-00]

TASK [SUDO | enable passwordless sudo for ansible user] *********************************************
ok: [odroid-hc2-00]

PLAY RECAP ******************************************************************************************
odroid-hc2-00              : ok=15   changed=0    unreachable=0    failed=0   


My Site-Specific Setup Playbook

After I created the bare minimum with odroid-initial-setup.yml by running it once (I’m not going to needlessly run the task DNF | ensure all updates are applied, it takes a while), I have a bunch of local settings I like applied. They are only shown here because I reference odroid-initial-setup.yml in another post.

My play odroid-general-setup.yml uses these roles:

  • linux-system-roles.network to set up static network configuration
    • new group name, update above
    • host_vars containing static network info, idem
  • pcfe.basic-security-setup sets non-negotiable settings
  • pcfe.housenet sets up timezone and the use of local package mirrors
  • pcfe.user_owner creates the user ‘pcfe’ (defined in group_vars/) and copies over in my ssh pubkey
  • pcfe.comfort to set up some bits that make my shell use more comfortable
  • pcfe.check_mk sets up to host for monitoring with my local Check_MK instance

And the following tasks:

  • implements a dirty work-around until check-mk-agent ≥ 1.5.0 is available in Fedora

  • installs language packs for languages I speak.

    • A nice side effect is that this stops dnf from complaining Failed to set locale, defaulting to C.
  • sets up the hardware watchdog.

The play odroid-general-setup.yml is as follows

# sets up a Fedora 29 ARM minimal install with site-specific settings
# to be run AFTER odroid-initial-setup.yml RAN ONCE at least
# this is for my ODROID-HC2 boxes
- hosts:
  - ceph-arm-nodes
  become: yes
  roles:
    - linux-system-roles.network
    - pcfe.basic-security-setup
    - pcfe.housenet
    - pcfe.user_owner
    - pcfe.comfort
    - pcfe.check_mk

  # remove this Würgaround pre-task once 1.5.0 or later is available in Fedora repo
  pre_tasks:
    - name: "Ensure check-mk-agent-1.5.0p11-1.noarch.rpm is installed, because earlier versions have trouble with thermal zone output"
      dnf:
        name: 'http://check-mk.internal.pcfe.net/HouseNet/check_mk/agents/check-mk-agent-1.5.0p11-1.noarch.rpm'
        state: present
    - name: "ensure /usr/share/check-mk-agent exists"
      file:
        path: /usr/share/check-mk-agent
        state: directory
        mode: 0755
    - name: "symlink plugins and local from /usr/lib/check_mk_agent/ to /usr/share/check-mk-agent/"
      file:
        src: '/usr/lib/check_mk_agent/{{ item.src }}'
        dest: '/usr/share/check-mk-agent/{{ item.dest }}'
        state: link
      with_items:
        - { src: 'plugins', dest: 'plugins' }
        - { src: 'local', dest: 'local' }
  tasks:
#    # linux-system-roles.network sets static network config (from host_vars)
#    # but I want the static hostname nailed down too
#    # the below does not work though, try with ansible_fqdn instead
#    - name: "set hostname"
#      hostname:
#        name: '{{ ansible_hostname }}.internal.pcfe.net'

    # fix dnf's "Failed to set locale, defaulting to C" annoyance
    - name: "PACKAGE | ensure my preferred langpacks are installed"
      package:
        name:
          - langpacks-en
          - langpacks-en_GB
          - langpacks-de
          - langpacks-fr
        state: present

    # enable watchdog based on information from https://wiki.odroid.com/odroid-xu4/application_note/software/linux_watchdog
    # write watchdog kernel module config, this is needed to enable power cycle
    # alternatively one could use the kernel boot parameters, but I personally prefer modprobe.d/
    - name: "WATCHDOG | ensure kernel module s3c2410_wdt has correct options configured"
      lineinfile:
        path:         /etc/modprobe.d/s3c2410_wdt.conf
        create:       true
        regexp:       '^options '
        insertafter:  '^#options'
        line:         'options s3c2410_wdt tmr_margin=30 tmr_atboot=1 nowayout=0'

    # while testing, configure both watchdog.service and systemd watchdog, but only use the latter for now.
    - name: "PACKAGE | ensure watchdog package is installed"
      package:
        name:         watchdog
        state:        present
    - name: "WATCHDOG | ensure correct watchdog-device is used by watchdog.service"
      lineinfile:
        path:         /etc/watchdog.conf
        regexp:       '^watchdog-device'
        insertafter:  '^#watchdog-device'
        line:         'watchdog-device = /dev/watchdog'
    # values above 32 seconds do not work, cannot set timeout 33 (errno = 22 = 'Invalid argument')
    - name: "WATCHDOG | ensure timeout is set to 30 seconds for watchdog.service"
      lineinfile:
        path:         /etc/watchdog.conf
        regexp:       '^watchdog-timeout'
        insertafter:  '^#watchdog-timeout'
        line:         'watchdog-timeout = 30'

    # testing in progress;
    # Use systemd watchdog rather than watchdog.service
    - name: "WATCHDOG | Ensure watchdog.service is disabled"
      systemd:
        name:         watchdog.service
        state:        stopped
        enabled:      false
        
    # configure systemd watchdog
    # c.f. http://0pointer.de/blog/projects/watchdog.html
    - name: "SYSTEMD | ensure systemd watchdog is enabled"
      lineinfile:
        path:         /etc/systemd/system.conf
        regexp:       '^RuntimeWatchdogSec'
        insertafter:  'EOF'
        line:         'RuntimeWatchdogSec=30'
    - name: "SYSTEMD | ensure systemd shutdown watchdog is enabled"
      lineinfile:
        path:         /etc/systemd/system.conf
        regexp:       '^ShutdownWatchdogSec'
        insertafter:  'EOF'
        line:         'ShutdownWatchdogSec=30'


    # most tweaks taken from both 
    # https://forum.odroid.com/viewtopic.php?t=25424 and
    # https://magazine.odroid.com/wp-content/uploads/ODROID-Magazine-201702.pdf#ODROID%20Magazine%20Issue%2038.indd:.314673:59549
    - name: "ODROID-HC2 TWEAKS: ensure needed packages are installed"
      package:
        name:
          - libcgroup-tools
          - tuned
          - perl-interpreter
        state: present
    - name: "ODROID-HC2 TWEAKS: ensure odroid-cpu-control is available"
      # from https://raw.githubusercontent.com/mad-ady/odroid-cpu-control/master/odroid-cpu-control
      template:
        src:            templates/ODROID-HC2/odroid-cpu-control.j2
        dest:           /usr/local/bin/odroid-cpu-control
        mode:           '0755'
        owner:          root
        group:          root
    - name: "ODROID-HC2 TWEAKS: ensure cpuset.service is available"
      # from https://raw.githubusercontent.com/mad-ady/odroid-xu4-optimizations/master/cpuset.service
      template:
        src:            templates/ODROID-HC2/cpuset.service.j2
        dest:           /etc/systemd/system/cpuset.service
        mode:           '0644'
        owner:          root
        group:          root
    - name: "ODROID-HC2 TWEAKS: ensure cpuset.service is enabled"
      systemd:
        name:           cpuset.service
        enabled:        true
    - name: "ODROID-HC2 TWEAKS: ensure affinity.service is available"
      # from https://raw.githubusercontent.com/mad-ady/odroid-xu4-optimizations/master/affinity.service
      template:
        src:            templates/ODROID-HC2/affinity.service.j2
        dest:           /etc/systemd/system/affinity.service
        mode:           '0644'
        owner:          root
        group:          root
    - name: "ODROID-HC2 TWEAKS: ensure affinity.service is enabled"
      systemd:
        name:           affinity.service
        enabled:        true
    - name: "ODROID-HC2 TWEAKS: ensure tuned profile odroid directory exists"
      file:
        path:           /etc/tuned/odroid
        state:          directory
        mode:           '0755'
    - name: "ODROID-HC2 TWEAKS: ensure tuned config odroid is present"
      template:
        src:            templates/ODROID-HC2/tuned-profile-odroid.conf.j2
        dest:           /etc/tuned/odroid/tuned.conf
        mode:           '0644'
        group:          root
        owner:          root
    - name: "ODROID-HC2 TWEAKS: ensure tuned script odroid is present"
      template:
        src:            templates/ODROID-HC2/tuned-script-odroid.sh.j2
        dest:           /etc/tuned/odroid/script.sh
        mode:           '0755'
        group:          root
        owner:          root
    - name: "ODROID-HC2 TWEAKS: ensure tuned.service is enabled and running"
      systemd:
        name:           tuned.service
        state:          started
        enabled:        true
    - block:
      - name: "ODROID-HC2 TWEAKS: check which tuned profile is active"
        shell:          tuned-adm active
        register:       tuned_active_profile
        ignore_errors:  yes
        changed_when:   no
      - name: "ODROID-HC2 TWEAKS: activate tuned profile odroid"
        shell:          tuned-adm profile odroid
        when:           "tuned_active_profile.stdout.find('Current active profile: odroid') != 0"

    # https://wiki.odroid.com/odroid-xu4/software/disk_encryption
    # luckily ceph-ansible already sets up
    #   Cipher name:    aes
    #   Cipher mode:    xts-plain64
    #   Hash spec:      sha256
    # which has the highest performance


    # this is not yet working, revisit
    # only use big cores (4-7) by adding to the relevant Service sections
    # ExecStartPost=-/bin/sh -c ‘echo $MAINPID | tee -a /sys/fs/cgroup/cpuset/bigcores/tasks’
    # - name: "SYSTEMD | CPUAffinity big cores only for all ceph-… services"
    #   lineinfile:
    #     path:         /etc/systemd/system/ceph-.service.d/ceph.conf
    #     create:       true
    #     regexp:       '^ExecStartPost='
    #     insertafter:  '^[Service]
    #     line:         'ExecStartPost=-/bin/sh -c `echo $MAINPID | tee -a /sys/fs/cgroup/cpuset/bigcores/tasks`'

Output of Site-Specific Setup Playbook

So that you can get an idea of what the roles I use do, here is the full log

ansible-playbook -i ../inventories/ceph-HouseNet-cluster -l odroid-hc2-00 --skip-tags apply_errata odroid-general-setup.yml | tee ../../hugo-blog.pcfe.net/static/code/odroid-general-setup.log

(In this example, I skip applying errata in order to get this log output quicker)


PLAY [ceph-arm-nodes] *******************************************************************************

TASK [Gathering Facts] ******************************************************************************
ok: [odroid-hc2-00]

TASK [Ensure check-mk-agent-1.5.0p11-1.noarch.rpm is installed, because earlier versions have trouble with thermal zone output] ***
ok: [odroid-hc2-00]

TASK [ensure /usr/share/check-mk-agent exists] ******************************************************
ok: [odroid-hc2-00]

TASK [symlink plugins and local from /usr/lib/check_mk_agent/ to /usr/share/check-mk-agent/] ********
ok: [odroid-hc2-00] => (item={'src': 'plugins', 'dest': 'plugins'})
ok: [odroid-hc2-00] => (item={'src': 'local', 'dest': 'local'})

TASK [linux-system-roles.network : Check which services are running] ********************************
ok: [odroid-hc2-00]

TASK [linux-system-roles.network : Check which packages are installed] ******************************
ok: [odroid-hc2-00]

TASK [linux-system-roles.network : Print network provider] ******************************************
ok: [odroid-hc2-00] => {
    "msg": "Using network provider: nm"
}

TASK [linux-system-roles.network : Install packages] ************************************************
skipping: [odroid-hc2-00]

TASK [linux-system-roles.network : Enable network service] ******************************************
ok: [odroid-hc2-00]

TASK [linux-system-roles.network : Configure networking connection profiles] ************************
ok: [odroid-hc2-00]

TASK [linux-system-roles.network : Re-test connectivity] ********************************************
ok: [odroid-hc2-00]

TASK [pcfe.basic-security-setup : BASIC SEC | ensure selinux is running with enforcing] *************
ok: [odroid-hc2-00]

TASK [pcfe.basic-security-setup : BASIC SEC | ensure ssh auth is via ssh-key only] ******************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : TIMEZONE | ensure timezone is Europe/Berlin] **********************************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure repo CentOS-Updates-HouseNet is enabled if on CentOS >= 7.0] *****
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure updates repo is disabled if on CentOS >= 7.0] ********************
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : YUM | ensure all security updates are applied if on CentOS >= 7.0] ************
skipping: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure repo updates-housenet is enabled if on Fedora >= 28] *************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure updates repo is disabled if on Fedora >= 28] *********************
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure repo fedora-everything-housenet is enabled if on Fedora >= 28] ***
ok: [odroid-hc2-00]

TASK [pcfe.housenet : DNF | ensure fedora repo is disabled if on Fedora >= 28] **********************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure group pcfe exists] **************************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure user pcfe exists] ***************************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure authorized key for pcfe exists] *************************
ok: [odroid-hc2-00]

TASK [pcfe.user_owner : USER OWNER | ensure authorized key for root exists] *************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : COMFORT | ensure packages for comfortable shell use are installed] *************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : COMFORT | on Fedora, also ensure fortune is installed] *************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : BASH | my additions for pcfe .bashrc] ******************************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : BASH | my additions for pcfe .bash_profile] ************************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : BASH | my additions for root .bashrc] ******************************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : BASH | my additions for root .bash_profile] ************************************
ok: [odroid-hc2-00]

TASK [pcfe.comfort : SCREEN | fixup /etc/screenrc] **************************************************
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | EL7, ensure firewalld and its python module are installed] *******
skipping: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | Fedora, ensure firewalld and its python module are installed] ****
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | ensure non VM packages for monitoring are installed] *************
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | ensure common packages for monitoring are installed] *************
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | EL, ensure firewalld permits 6556 for check-mk-agent] ************
skipping: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | Fedora, ensure firewalld permits 6556 for check-mk-agent] ********
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | ensure tarsnap cache is in fileinfo] *****************************
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | ensure entropy_avail plugin for Check_MK is present] *************
ok: [odroid-hc2-00]

TASK [pcfe.check_mk : MONITORING | non-VM ensure used plugins are enabled in check-mk-agent by setting symlink] ***
skipping: [odroid-hc2-00] => (item={'src': 'smart', 'dest': 'smart'}) 

TASK [pcfe.check_mk : MONITORING | common ensure used plugins are enabled in check-mk-agent by setting symlink] ***
skipping: [odroid-hc2-00] => (item={'src': 'lvm', 'dest': 'lvm'}) 
skipping: [odroid-hc2-00] => (item={'src': 'mk_inventory', 'dest': 'mk_inventory'}) 

TASK [pcfe.check_mk : MONITORING | Ensure check_mk.socket is started and enabled] *******************
ok: [odroid-hc2-00]

TASK [PACKAGE | ensure my preferred langpacks are installed] ****************************************
ok: [odroid-hc2-00]

TASK [WATCHDOG | ensure kernel module s3c2410_wdt has correct options configured] *******************
ok: [odroid-hc2-00]

TASK [PACKAGE | ensure watchdog package is installed] ***********************************************
ok: [odroid-hc2-00]

TASK [WATCHDOG | ensure correct watchdog-device is used by watchdog.service] ************************
ok: [odroid-hc2-00]

TASK [WATCHDOG | ensure timeout is set to 30 seconds for watchdog.service] **************************
ok: [odroid-hc2-00]

TASK [WATCHDOG | Ensure watchdog.service is disabled] ***********************************************
ok: [odroid-hc2-00]

TASK [SYSTEMD | ensure systemd watchdog is enabled] *************************************************
ok: [odroid-hc2-00]

TASK [SYSTEMD | ensure systemd shutdown watchdog is enabled] ****************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure needed packages are installed] **************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure odroid-cpu-control is available] ************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure cpuset.service is available] ****************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure cpuset.service is enabled] ******************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure affinity.service is available] **************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure affinity.service is enabled] ****************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure tuned profile odroid directory exists] ******************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure tuned config odroid is present] *************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure tuned script odroid is present] *************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: ensure tuned.service is enabled and running] *******************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: check which tuned profile is active] ***************************************
ok: [odroid-hc2-00]

TASK [ODROID-HC2 TWEAKS: activate tuned profile odroid] *********************************************
skipping: [odroid-hc2-00]

PLAY RECAP ******************************************************************************************
odroid-hc2-00              : ok=54   changed=0    unreachable=0    failed=0