diff --git a/docs/calico.md b/docs/calico.md
index ab421166487b941008d298ebdb07a32191c9b5c8..53c9af039155de36e9cc13a4a8c93d80cedfc6b4 100644
--- a/docs/calico.md
+++ b/docs/calico.md
@@ -23,7 +23,7 @@ calicoctl status
 * Show the configured network subnet for containers
 
 ```
- calicoctl get ippool -o wide
+calicoctl get ippool -o wide
 ```
 
 or for versions prior *v1.0.0*:
diff --git a/roles/network_plugin/calico/tasks/main.yml b/roles/network_plugin/calico/tasks/main.yml
index a51831c6f897cd6707647aa5344a0bfffd2e8900..9a3f909b834c7e074006ed087d012ace9b72f7ef 100644
--- a/roles/network_plugin/calico/tasks/main.yml
+++ b/roles/network_plugin/calico/tasks/main.yml
@@ -196,17 +196,18 @@
   shell: "{{ bin_dir }}/calicoctl config set nodeToNodeMesh off"
   when: (not legacy_calicoctl and
          peer_with_router|default(false) and inventory_hostname in groups['kube-node'])
+  run_once: true
 
 - name: Calico | Configure peering with router(s)
   shell: >
    echo '{
-   "kind": "bgppeer",
-   "spec": {"asNumber": {{ item.as }}},
+   "kind": "bgpPeer",
+   "spec": {"asNumber": "{{ item.as }}"},
    "apiVersion": "v1",
-   "metadata": {"node": "rack1-host1", "scope": "node", "peerIP": "{{ item.router_id }}"}
+   "metadata": {"node": "{{ inventory_hostname }}", "scope": "node", "peerIP": "{{ item.router_id }}"}
    }'
    | {{ bin_dir }}/calicoctl create -f -
-  with_items: peers
+  with_items: "{{ peers|default([]) }}"
   when: (not legacy_calicoctl and
          peer_with_router|default(false) and inventory_hostname in groups['kube-node'])
 
@@ -214,9 +215,10 @@
   shell: "{{ bin_dir }}/calicoctl bgp node-mesh off"
   when: (legacy_calicoctl and
          peer_with_router|default(false) and inventory_hostname in groups['kube-node'])
+  run_once: true
 
 - name: Calico (old) | Configure peering with router(s)
   shell: "{{ bin_dir }}/calicoctl node bgp peer add {{ item.router_id }} as {{ item.as }}"
-  with_items: peers
+  with_items: "{{ peers|default([]) }}"
   when: (legacy_calicoctl and
          peer_with_router|default(false) and inventory_hostname in groups['kube-node'])
diff --git a/roles/network_plugin/calico/templates/calico-node.service.j2 b/roles/network_plugin/calico/templates/calico-node.service.j2
index 2e9dc4a18365a822aa9314c5ec63873952d7c73e..dc041b054a55db5586c660e5518a8167aa3eea6c 100644
--- a/roles/network_plugin/calico/templates/calico-node.service.j2
+++ b/roles/network_plugin/calico/templates/calico-node.service.j2
@@ -8,6 +8,7 @@ EnvironmentFile=/etc/calico/calico.env
 ExecStartPre=-/usr/bin/docker rm -f calico-node
 ExecStart=/usr/bin/docker run --net=host --privileged \
  --name=calico-node \
+ -e HOSTNAME=${CALICO_HOSTNAME} \
  -e IP=${CALICO_IP} \
  -e IP6=${CALICO_IP6} \
  -e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
diff --git a/roles/network_plugin/calico/templates/calico.env.j2 b/roles/network_plugin/calico/templates/calico.env.j2
index ee2a42d31cac8e50b095abc66038ddeccc9b7fe2..47f685928714a806f1646d709a137c58b21f2be5 100644
--- a/roles/network_plugin/calico/templates/calico.env.j2
+++ b/roles/network_plugin/calico/templates/calico.env.j2
@@ -12,3 +12,4 @@ CALICO_AS="{{ local_as }}"
 {% endif %}
 CALICO_NO_DEFAULT_POOLS="true"
 CALICO_LIBNETWORK_ENABLED="true"
+CALICO_HOSTNAME="{{ inventory_hostname }}"
diff --git a/roles/network_plugin/calico/templates/cni-calico.conf.j2 b/roles/network_plugin/calico/templates/cni-calico.conf.j2
index af2d28da65ad642639ac47e66f868c642c40fadb..84e8ed44747617c38e6b7c8518a9acec2b7d1715 100644
--- a/roles/network_plugin/calico/templates/cni-calico.conf.j2
+++ b/roles/network_plugin/calico/templates/cni-calico.conf.j2
@@ -1,5 +1,6 @@
 {
   "name": "calico-k8s-network",
+  "hostname": "{{ inventory_hostname }}",
   "type": "calico",
   "etcd_endpoints": "{{ etcd_access_endpoint }}",
   "etcd_cert_file": "{{ etcd_cert_dir }}/node.pem",