diff --git a/roles/tsg-env-mcn/files/env-mcn0/setup b/roles/tsg-env-mcn/files/env-mcn0/setup new file mode 100644 index 0000000..473e5a0 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn0/setup @@ -0,0 +1,132 @@ +#!/bin/bash +# set -x + +CURRENT_PATH=`dirname $0` +TP_SVR=192.168.100.5 +TP_PORT=10000 +REMOTE_CONTROL_BIN=switch_control_client_non_block + +function get_netdev_by_pci() +{ + DEV_LIST=`ifconfig -a |grep flags |awk -F: '{print $1}'` + for i in ${DEV_LIST} + do + ethtool -i ${i} |grep bus-info |grep "$1" > /dev/null 2>&1 + if [ $? -eq 0 ];then + TARGET=${i} + break + fi + done + + echo ${TARGET} +} + +function pf_setup() +{ + ifconfig ens1 up + + modprobe 8021q + vconfig add ens1 100 + vconfig set_flag ens1.100 1 1 + ifconfig ens1.100 192.168.100.1 netmask 255.255.255.0 up + sleep 1 +} + +function vf_setup() +{ + echo 8 > /sys/class/net/ens1/device/sriov_numvfs + sleep 5 + + ifconfig ens1f3 up + ip link set ens1 vf 2 vlan 200 + ifconfig ens1f3 192.168.200.1 netmask 255.255.255.0 + + ifconfig ens1f1 up + ifconfig ens1f2 up + ifconfig ens1f3 up + ifconfig ens1f4 up + ifconfig ens1f5 up + ifconfig ens1f6 up + ifconfig ens1f7 up + ifconfig enp1s1 up + + sleep 5 +} + +function bring_down_pfvf() +{ + echo 0 > /sys/class/net/ens1/device/sriov_numvfs + ifconfig ens1 down + sleep 3 +} + + +# Main loop +while : +do + FAIL_FLAG=0 + + # Make sure PF is valid + ping ${TP_SVR} -c 1 + if [ $? -ne 0 ];then + echo "Please make sure switch board is up." + bring_down_pfvf + pf_setup + continue + fi + + # Make sure TestPoint is up. + ${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show version" + if [ $? -ne 0 ];then + echo "Cannot reach TestPoint!" + echo "Please make sure TestPoint is up and in remote-listen mode." + sleep 5 + continue + fi + + # Create VFs and get MAC addresses + vf_setup + + PF=`get_netdev_by_pci 01:00.0` + VF1=`get_netdev_by_pci 01:00.1` + VF2=`get_netdev_by_pci 01:00.2` + VF3=`get_netdev_by_pci 01:00.3` + VF4=`get_netdev_by_pci 01:00.4` + VF5=`get_netdev_by_pci 01:00.5` + VF6=`get_netdev_by_pci 01:00.6` + VF7=`get_netdev_by_pci 01:00.7` + VF8=`get_netdev_by_pci 01:01.0` + + MAC1=`ifconfig ${VF1} |grep ether |awk -F' ' '{print $2}'` + MAC2=`ifconfig ${VF2} |grep ether |awk -F' ' '{print $2}'` + MAC3=`ifconfig ${VF3} |grep ether |awk -F' ' '{print $2}'` + MAC4=`ifconfig ${VF4} |grep ether |awk -F' ' '{print $2}'` + MAC5=`ifconfig ${VF5} |grep ether |awk -F' ' '{print $2}'` + MAC6=`ifconfig ${VF6} |grep ether |awk -F' ' '{print $2}'` + MAC7=`ifconfig ${VF7} |grep ether |awk -F' ' '{print $2}'` + MAC8=`ifconfig ${VF8} |grep ether |awk -F' ' '{print $2}'` + MAC9=`ifconfig ${PF} |grep ether |awk -F' ' '{print $2}'` + + # Make sure VFs are valid + MAC_TABLE=`${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show mac table all"` + + for i in ${MAC1} ${MAC2} ${MAC3} ${MAC4} ${MAC5} ${MAC6} ${MAC7} ${MAC8} ${MAC9} + do + echo ${MAC_TABLE} |grep ${i} > /dev/null 2>&1 + if [ $? -ne 0 ];then + echo "MAC ${i} is not in table!" + FAIL_FLAG=1 + break + fi + done + + if [ ${FAIL_FLAG} -eq 1 ];then + bring_down_pfvf + continue + fi + + echo "PF/VF setup successful." + exit 0 +done + + diff --git a/roles/tsg-env-mcn/files/env-mcn0/switch_control_client_non_block b/roles/tsg-env-mcn/files/env-mcn0/switch_control_client_non_block new file mode 100644 index 0000000..5cdba48 Binary files /dev/null and b/roles/tsg-env-mcn/files/env-mcn0/switch_control_client_non_block differ diff --git a/roles/tsg-env-mcn/files/env-mcn0/tsg-env.service b/roles/tsg-env-mcn/files/env-mcn0/tsg-env.service new file mode 100644 index 0000000..e100bb8 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn0/tsg-env.service @@ -0,0 +1,15 @@ +[Unit] +Description=tsg sled-mcn0 env init +Requires=network.target +After=network.target +Before=mrenv.service + +[Service] +ExecStart=/opt/tsg/env/setup +ExecStop=/opt/tsg/env/tsg-env_stop +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +RequiredBy=mrenv.service diff --git a/roles/tsg-env-mcn/files/env-mcn0/tsg-env_stop b/roles/tsg-env-mcn/files/env-mcn0/tsg-env_stop new file mode 100644 index 0000000..1048f28 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn0/tsg-env_stop @@ -0,0 +1,6 @@ +#!/bin/bash +# +echo 0 >/sys/class/net/ens1/device/sriov_numvfs +ifconfig ens1.100 down +vconfig rem ens1.100 +ifconfig ens1 down diff --git a/roles/tsg-env-mcn/files/env-mcn1/setup b/roles/tsg-env-mcn/files/env-mcn1/setup new file mode 100644 index 0000000..09331cd --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn1/setup @@ -0,0 +1,115 @@ +#!/bin/bash +# set -x + +CURRENT_PATH=`dirname $0` +TP_SVR=192.168.100.5 +TP_PORT=10000 +REMOTE_CONTROL_BIN=switch_control_client_non_block +modprobe 8021q + +function get_netdev_by_pci() +{ + DEV_LIST=`ifconfig -a |grep flags |awk -F: '{print $1}'` + for i in ${DEV_LIST} + do + ethtool -i ${i} |grep bus-info |grep "$1" > /dev/null 2>&1 + if [ $? -eq 0 ];then + TARGET=${i} + break + fi + done + + echo ${TARGET} +} + +function pf_setup() +{ + ifconfig ens1 up + vconfig add ens1 100 + vconfig set_flag ens1.100 1 1 + ifconfig ens1.100 192.168.100.2 netmask 255.255.255.0 up + sleep 1 +} + +function vf_setup() +{ + echo 4 > /sys/class/net/ens1/device/sriov_numvfs + sleep 5 + + ifconfig ens1f3 up + ip link set ens1 vf 2 vlan 200 + ifconfig ens1f3 192.168.200.2 netmask 255.255.255.0 + + ifconfig ens1f1 up + ifconfig ens1f2 up + ifconfig ens1f3 up + ifconfig ens1f4 up + sleep 5 +} + +function bring_down_pfvf() +{ + echo 0 > /sys/class/net/ens1/device/sriov_numvfs + ifconfig ens1 down + sleep 3 +} + +# Main loop +while : +do + FAIL_FLAG=0 + + # Make sure PF is valid + ping ${TP_SVR} -c 1 + if [ $? -ne 0 ];then + echo "Please make sure switch board is up." + bring_down_pfvf + pf_setup + continue + fi + + # Make sure TestPoint is up. + ${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show version" + if [ $? -ne 0 ];then + echo "Cannot reach TestPoint!" + echo "Please make sure TestPoint is up and in remote-listen mode." + sleep 5 + continue + fi + + # Create VFs and get MAC addresses + vf_setup + + PF=`get_netdev_by_pci 01:00.0` + VF1=`get_netdev_by_pci 01:00.1` + VF2=`get_netdev_by_pci 01:00.2` + VF3=`get_netdev_by_pci 01:00.3` + VF4=`get_netdev_by_pci 01:00.4` + + MAC0=`ifconfig ${PF} |grep ether |awk -F' ' '{print $2}'` + MAC1=`ifconfig ${VF1} |grep ether |awk -F' ' '{print $2}'` + MAC2=`ifconfig ${VF2} |grep ether |awk -F' ' '{print $2}'` + MAC3=`ifconfig ${VF3} |grep ether |awk -F' ' '{print $2}'` + MAC4=`ifconfig ${VF4} |grep ether |awk -F' ' '{print $2}'` + + # Make sure VFs are valid + MAC_TABLE=`${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show mac table all"` + + for i in ${MAC0} ${MAC1} ${MAC2} ${MAC3} ${MAC4} + do + echo ${MAC_TABLE} |grep ${i} > /dev/null 2>&1 + if [ $? -ne 0 ];then + echo "MAC ${i} is not in table!" + FAIL_FLAG=1 + break + fi + done + + if [ ${FAIL_FLAG} -eq 1 ];then + bring_down_pfvf + continue + fi + + echo "PF/VF setup successful." + exit 0 +done diff --git a/roles/tsg-env-mcn/files/env-mcn1/switch_control_client_non_block b/roles/tsg-env-mcn/files/env-mcn1/switch_control_client_non_block new file mode 100644 index 0000000..5cdba48 Binary files /dev/null and b/roles/tsg-env-mcn/files/env-mcn1/switch_control_client_non_block differ diff --git a/roles/tsg-env-mcn/files/env-mcn1/tsg-env.service b/roles/tsg-env-mcn/files/env-mcn1/tsg-env.service new file mode 100644 index 0000000..c8ce8a8 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn1/tsg-env.service @@ -0,0 +1,15 @@ +[Unit] +Description=tsg sled-mcn1 env init +Requires=network.target +After=network.target +Before=tfe-env.service mrenv.service + +[Service] +ExecStart=/opt/tsg/env/setup +ExecStop=/opt/tsg/env/tsg-env_stop +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +RequiredBy=tfe-env.service mrenv.service \ No newline at end of file diff --git a/roles/tsg-env-mcn/files/env-mcn1/tsg-env_stop b/roles/tsg-env-mcn/files/env-mcn1/tsg-env_stop new file mode 100644 index 0000000..1048f28 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn1/tsg-env_stop @@ -0,0 +1,6 @@ +#!/bin/bash +# +echo 0 >/sys/class/net/ens1/device/sriov_numvfs +ifconfig ens1.100 down +vconfig rem ens1.100 +ifconfig ens1 down diff --git a/roles/tsg-env-mcn/files/env-mcn2/setup b/roles/tsg-env-mcn/files/env-mcn2/setup new file mode 100644 index 0000000..8d3985a --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn2/setup @@ -0,0 +1,115 @@ +#!/bin/bash +# set -x + +CURRENT_PATH=`dirname $0` +TP_SVR=192.168.100.5 +TP_PORT=10000 +REMOTE_CONTROL_BIN=switch_control_client_non_block +modprobe 8021q + +function get_netdev_by_pci() +{ + DEV_LIST=`ifconfig -a |grep flags |awk -F: '{print $1}'` + for i in ${DEV_LIST} + do + ethtool -i ${i} |grep bus-info |grep "$1" > /dev/null 2>&1 + if [ $? -eq 0 ];then + TARGET=${i} + break + fi + done + + echo ${TARGET} +} + +function pf_setup() +{ + ifconfig ens8 up + vconfig add ens8 100 + vconfig set_flag ens8.100 1 1 + ifconfig ens8.100 192.168.100.3 netmask 255.255.255.0 up + sleep 1 +} + +function vf_setup() +{ + echo 4 > /sys/class/net/ens8/device/sriov_numvfs + sleep 5 + + ifconfig ens8f3 up + ip link set ens8 vf 2 vlan 200 + ifconfig ens8f3 192.168.200.3 netmask 255.255.255.0 + + ifconfig ens8f1 up + ifconfig ens8f2 up + ifconfig ens8f3 up + ifconfig ens8f4 up + sleep 5 +} + +function bring_down_pfvf() +{ + echo 0 > /sys/class/net/ens8/device/sriov_numvfs + ifconfig ens8 down + sleep 3 +} + +# Main loop +while : +do + FAIL_FLAG=0 + + # Make sure PF is valid + ping ${TP_SVR} -c 1 + if [ $? -ne 0 ];then + echo "Please make sure switch board is up." + bring_down_pfvf + pf_setup + continue + fi + + # Make sure TestPoint is up. + ${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show version" + if [ $? -ne 0 ];then + echo "Cannot reach TestPoint!" + echo "Please make sure TestPoint is up and in remote-listen mode." + sleep 5 + continue + fi + + # Create VFs and get MAC addresses + vf_setup + + PF=`get_netdev_by_pci 85:00.0` + VF1=`get_netdev_by_pci 85:00.1` + VF2=`get_netdev_by_pci 85:00.2` + VF3=`get_netdev_by_pci 85:00.3` + VF4=`get_netdev_by_pci 85:00.4` + + MAC0=`ifconfig ${PF} |grep ether |awk -F' ' '{print $2}'` + MAC1=`ifconfig ${VF1} |grep ether |awk -F' ' '{print $2}'` + MAC2=`ifconfig ${VF2} |grep ether |awk -F' ' '{print $2}'` + MAC3=`ifconfig ${VF3} |grep ether |awk -F' ' '{print $2}'` + MAC4=`ifconfig ${VF4} |grep ether |awk -F' ' '{print $2}'` + + # Make sure VFs are valid + MAC_TABLE=`${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show mac table all"` + + for i in ${MAC0} ${MAC1} ${MAC2} ${MAC3} ${MAC4} + do + echo ${MAC_TABLE} |grep ${i} > /dev/null 2>&1 + if [ $? -ne 0 ];then + echo "MAC ${i} is not in table!" + FAIL_FLAG=1 + break + fi + done + + if [ ${FAIL_FLAG} -eq 1 ];then + bring_down_pfvf + continue + fi + + echo "PF/VF setup successful." + exit 0 +done diff --git a/roles/tsg-env-mcn/files/env-mcn2/switch_control_client_non_block b/roles/tsg-env-mcn/files/env-mcn2/switch_control_client_non_block new file mode 100644 index 0000000..5cdba48 Binary files /dev/null and b/roles/tsg-env-mcn/files/env-mcn2/switch_control_client_non_block differ diff --git a/roles/tsg-env-mcn/files/env-mcn2/tsg-env.service b/roles/tsg-env-mcn/files/env-mcn2/tsg-env.service new file mode 100644 index 0000000..7ff9bc1 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn2/tsg-env.service @@ -0,0 +1,15 @@ +[Unit] +Description=tsg sled-mcn3 env init +Requires=network.target +After=network.target +Before=tfe-env.service mrenv.service + +[Service] +ExecStart=/opt/tsg/env/setup +ExecStop=/opt/tsg/env/tsg-env_stop +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +RequiredBy=tfe-env.service mrenv.service diff --git a/roles/tsg-env-mcn/files/env-mcn2/tsg-env_stop b/roles/tsg-env-mcn/files/env-mcn2/tsg-env_stop new file mode 100644 index 0000000..c5ce519 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn2/tsg-env_stop @@ -0,0 +1,6 @@ +#!/bin/bash +# +echo 0 >/sys/class/net/ens8/device/sriov_numvfs +ifconfig ens8.100 down +vconfig rem ens8.100 +ifconfig ens8 down diff --git a/roles/tsg-env-mcn/files/env-mcn3/setup b/roles/tsg-env-mcn/files/env-mcn3/setup new file mode 100644 index 0000000..fd4845d --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn3/setup @@ -0,0 +1,115 @@ +#!/bin/bash +# set -x + +CURRENT_PATH=`dirname $0` +TP_SVR=192.168.100.5 +TP_PORT=10000 +REMOTE_CONTROL_BIN=switch_control_client_non_block +modprobe 8021q + +function get_netdev_by_pci() +{ + DEV_LIST=`ifconfig -a |grep flags |awk -F: '{print $1}'` + for i in ${DEV_LIST} + do + ethtool -i ${i} |grep bus-info |grep "$1" > /dev/null 2>&1 + if [ $? -eq 0 ];then + TARGET=${i} + break + fi + done + + echo ${TARGET} +} + +function pf_setup() +{ + ifconfig ens8 up + vconfig add ens8 100 + vconfig set_flag ens8.100 1 1 + ifconfig ens8.100 192.168.100.4 netmask 255.255.255.0 up + sleep 1 +} + +function vf_setup() +{ + echo 4 > /sys/class/net/ens8/device/sriov_numvfs + sleep 5 + + ifconfig ens8f3 up + ip link set ens8 vf 2 vlan 200 + ifconfig ens8f3 192.168.200.4 netmask 255.255.255.0 + + ifconfig ens8f1 up + ifconfig ens8f2 up + ifconfig ens8f3 up + ifconfig ens8f4 up + sleep 5 +} + +function bring_down_pfvf() +{ + echo 0 > /sys/class/net/ens8/device/sriov_numvfs + ifconfig ens8 down + sleep 3 +} + +# Main loop +while : +do + FAIL_FLAG=0 + + # Make sure PF is valid + ping ${TP_SVR} -c 1 + if [ $? -ne 0 ];then + echo "Please make sure switch board is up." + bring_down_pfvf + pf_setup + continue + fi + + # Make sure TestPoint is up. + ${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show version" + if [ $? -ne 0 ];then + echo "Cannot reach TestPoint!" + echo "Please make sure TestPoint is up and in remote-listen mode." + sleep 5 + continue + fi + + # Create VFs and get MAC addresses + vf_setup + + PF=`get_netdev_by_pci 85:00.0` + VF1=`get_netdev_by_pci 85:00.1` + VF2=`get_netdev_by_pci 85:00.2` + VF3=`get_netdev_by_pci 85:00.3` + VF4=`get_netdev_by_pci 85:00.4` + + MAC0=`ifconfig ${PF} |grep ether |awk -F' ' '{print $2}'` + MAC1=`ifconfig ${VF1} |grep ether |awk -F' ' '{print $2}'` + MAC2=`ifconfig ${VF2} |grep ether |awk -F' ' '{print $2}'` + MAC3=`ifconfig ${VF3} |grep ether |awk -F' ' '{print $2}'` + MAC4=`ifconfig ${VF4} |grep ether |awk -F' ' '{print $2}'` + + # Make sure VFs are valid + MAC_TABLE=`${CURRENT_PATH}/${REMOTE_CONTROL_BIN} -s ${TP_SVR} -n ${TP_PORT} -c "show mac table all"` + + for i in ${MAC0} ${MAC1} ${MAC2} ${MAC3} ${MAC4} + do + echo ${MAC_TABLE} |grep ${i} > /dev/null 2>&1 + if [ $? -ne 0 ];then + echo "MAC ${i} is not in table!" + FAIL_FLAG=1 + break + fi + done + + if [ ${FAIL_FLAG} -eq 1 ];then + bring_down_pfvf + continue + fi + + echo "PF/VF setup successful." + exit 0 +done diff --git a/roles/tsg-env-mcn/files/env-mcn3/switch_control_client_non_block b/roles/tsg-env-mcn/files/env-mcn3/switch_control_client_non_block new file mode 100644 index 0000000..5cdba48 Binary files /dev/null and b/roles/tsg-env-mcn/files/env-mcn3/switch_control_client_non_block differ diff --git a/roles/tsg-env-mcn/files/env-mcn3/tsg-env.service b/roles/tsg-env-mcn/files/env-mcn3/tsg-env.service new file mode 100644 index 0000000..7ff9bc1 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn3/tsg-env.service @@ -0,0 +1,15 @@ +[Unit] +Description=tsg sled-mcn3 env init +Requires=network.target +After=network.target +Before=tfe-env.service mrenv.service + +[Service] +ExecStart=/opt/tsg/env/setup +ExecStop=/opt/tsg/env/tsg-env_stop +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +RequiredBy=tfe-env.service mrenv.service diff --git a/roles/tsg-env-mcn/files/env-mcn3/tsg-env_stop b/roles/tsg-env-mcn/files/env-mcn3/tsg-env_stop new file mode 100644 index 0000000..c5ce519 --- /dev/null +++ b/roles/tsg-env-mcn/files/env-mcn3/tsg-env_stop @@ -0,0 +1,6 @@ +#!/bin/bash +# +echo 0 >/sys/class/net/ens8/device/sriov_numvfs +ifconfig ens8.100 down +vconfig rem ens8.100 +ifconfig ens8 down diff --git a/roles/tsg-env-mcn/tasks/main.yml b/roles/tsg-env-mcn/tasks/main.yml new file mode 100644 index 0000000..b4428d6 --- /dev/null +++ b/roles/tsg-env-mcn/tasks/main.yml @@ -0,0 +1,57 @@ +--- +- name: "copy setup script" + copy: + src: "{{ role_path }}/files/{{item.dict}}/setup" + dest: "/opt/tsg/env/" + mode: 0755 + when: item.group_name in group_names + with_items: + - { group_name: 'blade-00', dict: 'env-mcn0' } + - { group_name: 'blade-01', dict: 'env-mcn1' } + - { group_name: 'blade-02', dict: 'env-mcn2' } + - { group_name: 'blade-03', dict: 'env-mcn3' } + + +- name: "copy switch_control_client_non_block" + copy: + src: "{{ role_path }}/files/{{item.dict}}/switch_control_client_non_block" + dest: "/opt/tsg/env/" + mode: 0755 + when: item.group_name in group_names + with_items: + - { group_name: 'blade-00', dict: 'env-mcn0' } + - { group_name: 'blade-01', dict: 'env-mcn1' } + - { group_name: 'blade-02', dict: 'env-mcn2' } + - { group_name: 'blade-03', dict: 'env-mcn3' } + + +- name: "copy tsg-env.service" + copy: + src: "{{ role_path }}/files/{{item.dict}}/tsg-env.service" + dest: "/usr/lib/systemd/system/" + mode: 0644 + when: item.group_name in group_names + with_items: + - { group_name: 'blade-00', dict: 'env-mcn0' } + - { group_name: 'blade-01', dict: 'env-mcn1' } + - { group_name: 'blade-02', dict: 'env-mcn2' } + - { group_name: 'blade-03', dict: 'env-mcn3' } + +- name: "copy tsg-env_stop" + copy: + src: "{{ role_path }}/files/{{item.dict}}/tsg-env_stop" + dest: "/opt/tsg/env/" + mode: 0755 + when: item.group_name in group_names + with_items: + - { group_name: 'blade-00', dict: 'env-mcn0' } + - { group_name: 'blade-01', dict: 'env-mcn1' } + - { group_name: 'blade-02', dict: 'env-mcn2' } + - { group_name: 'blade-03', dict: 'env-mcn3' } + + +- name: "enable tsg-env" + systemd: + name: tsg-env + enabled: yes + daemon_reload: yes