diff options
Diffstat (limited to 'roles/contiv')
35 files changed, 876 insertions, 291 deletions
diff --git a/roles/contiv/README.md b/roles/contiv/README.md index fa36039d9..ce414f9fb 100644 --- a/roles/contiv/README.md +++ b/roles/contiv/README.md @@ -19,8 +19,8 @@ Install Contiv components (netmaster, netplugin, contiv_etcd) on Master and Mini  * ``openshift_use_contiv=True``  * ``openshift_use_openshift_sdn=False``  * ``os_sdn_network_plugin_name='cni'`` -* ``netmaster_interface=eth0`` -* ``netplugin_interface=eth1`` +* ``contiv_netmaster_interface=eth0`` +* ``contiv_netplugin_interface=eth1``  * ref. Openshift docs Contiv section for more details  ## Example bare metal deployment of Openshift + Contiv  diff --git a/roles/contiv/defaults/main.yml b/roles/contiv/defaults/main.yml index aa976d921..4869abc61 100644 --- a/roles/contiv/defaults/main.yml +++ b/roles/contiv/defaults/main.yml @@ -1,51 +1,63 @@  ---  # The version of Contiv binaries to use -contiv_version: 1.1.1 +contiv_version: 1.2.0  # The version of cni binaries -cni_version: v0.4.0 +contiv_cni_version: v0.4.0 + +# If the node we are deploying to is to be a contiv master. +contiv_master: false  contiv_default_subnet: "10.128.0.0/16"  contiv_default_gw: "10.128.254.254" -# TCP port that Netmaster listens for network connections -netmaster_port: 9999 -# Default for contiv_role -contiv_role: netmaster +# Ports netmaster listens on +contiv_netmaster_port: 9999 +contiv_netmaster_port_proto: tcp +contiv_ofnet_master_port: 9001 +contiv_ofnet_master_port_proto: tcp +# Ports netplugin listens on +contiv_netplugin_port: 6640 +contiv_netplugin_port_proto: tcp +contiv_ofnet_vxlan_port: 9002 +contiv_ofnet_vxlan_port_proto: tcp +contiv_ovs_port: 9003 +contiv_ovs_port_proto: tcp -# TCP port that Netplugin listens for network connections -netplugin_port: 6640 -contiv_rpc_port1: 9001 -contiv_rpc_port2: 9002 -contiv_rpc_port3: 9003 +contiv_vxlan_port: 4789 +contiv_vxlan_port_proto: udp  # Interface used by Netplugin for inter-host traffic when encap_mode is vlan.  # The interface must support 802.1Q trunking. -netplugin_interface: "eno16780032" +contiv_netplugin_interface: "eno16780032"  # IP address of the interface used for control communication within the cluster  # It needs to be reachable from all nodes in the cluster. -netplugin_ctrl_ip: "{{ hostvars[inventory_hostname]['ansible_' + netplugin_interface].ipv4.address }}" +contiv_netplugin_ctrl_ip: "{{ hostvars[inventory_hostname]['ansible_' + contiv_netplugin_interface].ipv4.address }}"  # IP used to terminate vxlan tunnels -netplugin_vtep_ip: "{{ hostvars[inventory_hostname]['ansible_' + netplugin_interface].ipv4.address }}" +contiv_netplugin_vtep_ip: "{{ hostvars[inventory_hostname]['ansible_' + contiv_netplugin_interface].ipv4.address }}"  # Interface used to bind Netmaster service -netmaster_interface: "{{ netplugin_interface }}" +contiv_netmaster_interface: "{{ contiv_netplugin_interface }}" + +# IP address of the interface used for control communication within the cluster +# It needs to be reachable from all nodes in the cluster. +contiv_netmaster_ctrl_ip: "{{ hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address }}"  # Path to the contiv binaries -bin_dir: /usr/bin +contiv_bin_dir: /usr/bin  # Path to the contivk8s cni binary -cni_bin_dir: /opt/cni/bin +contiv_cni_bin_dir: /opt/cni/bin  # Path to cni archive download directory -cni_download_dir: /tmp +contiv_cni_download_dir: /tmp  # URL for cni binaries -cni_bin_url_base: "https://github.com/containernetworking/cni/releases/download/" -cni_bin_url: "{{ cni_bin_url_base }}/{{ cni_version }}/cni-{{ cni_version }}.tbz2" +contiv_cni_bin_url_base: "https://github.com/containernetworking/cni/releases/download/" +contiv_cni_bin_url: "{{ contiv_cni_bin_url_base }}/{{ contiv_cni_version }}/cni-{{ contiv_cni_version }}.tbz2"  # Contiv config directory @@ -60,11 +72,11 @@ contiv_download_url_base: "https://github.com/contiv/netplugin/releases/download  contiv_download_url: "{{ contiv_download_url_base }}/{{ contiv_version }}/netplugin-{{ contiv_version }}.tar.bz2"  # This is where kubelet looks for plugin files -kube_plugin_dir: /usr/libexec/kubernetes/kubelet-plugins/net/exec +contiv_kube_plugin_dir: /usr/libexec/kubernetes/kubelet-plugins/net/exec  # Specifies routed mode vs bridged mode for networking (bridge | routing)  # if you are using an external router for all routing, you should select bridge here -netplugin_fwd_mode: bridge +contiv_netplugin_fwd_mode: routing  # Contiv fabric mode aci|default  contiv_fabric_mode: default @@ -73,10 +85,10 @@ contiv_fabric_mode: default  contiv_vlan_range: "2900-3000"  # Encapsulation type vlan|vxlan to use for instantiating container networks -contiv_encap_mode: vlan +contiv_encap_mode: vxlan  # Backend used by Netplugin for instantiating container networks -netplugin_driver: ovs +contiv_netplugin_driver: ovs  # Create a default Contiv network for use by pods  contiv_default_network: true @@ -85,39 +97,80 @@ contiv_default_network: true  contiv_default_network_tag: ""  #SRFIXME (use the openshift variables) -https_proxy: "" -http_proxy: "" -no_proxy: "" +contiv_https_proxy: "" +contiv_http_proxy: "" +contiv_no_proxy: ""  # The following are aci specific parameters when contiv_fabric_mode: aci is set.  # Otherwise, you can ignore these. -apic_url: "" -apic_username: "" -apic_password: "" -apic_leaf_nodes: "" -apic_phys_dom: "" -apic_contracts_unrestricted_mode: no -apic_epg_bridge_domain: not_specified +contiv_apic_url: "" +contiv_apic_username: "" +contiv_apic_password: "" +contiv_apic_leaf_nodes: "" +contiv_apic_phys_dom: "" +contiv_apic_contracts_unrestricted_mode: no +contiv_apic_epg_bridge_domain: not_specified  apic_configure_default_policy: false -apic_default_external_contract: "uni/tn-common/brc-default" -apic_default_app_profile: "contiv-infra-app-profile" -is_atomic: False -kube_cert_dir: "/data/src/github.com/openshift/origin/openshift.local.config/master" -master_name: "{{ groups['masters'][0] }}" -contiv_etcd_port: 22379 -etcd_url: "{{ hostvars[groups['masters'][0]]['ansible_' + netmaster_interface].ipv4.address }}:{{ contiv_etcd_port }}" -kube_ca_cert: "{{ kube_cert_dir }}/ca.crt" -kube_key: "{{ kube_cert_dir }}/admin.key" -kube_cert: "{{ kube_cert_dir }}/admin.crt" -kube_master_api_port: 8443 +contiv_apic_default_external_contract: "uni/tn-common/brc-default" +contiv_apic_default_app_profile: "contiv-infra-app-profile" +contiv_kube_cert_dir: "/data/src/github.com/openshift/origin/openshift.local.config/master" +contiv_kube_ca_cert: "{{ contiv_kube_cert_dir }}/ca.crt" +contiv_kube_key: "{{ contiv_kube_cert_dir }}/admin.key" +contiv_kube_cert: "{{ contiv_kube_cert_dir }}/admin.crt" +contiv_kube_master_api_port: 8443 +contiv_kube_master_api_port_proto: tcp  # contivh1 default subnet and gateway -#contiv_h1_subnet_default: "132.1.1.0/24" -#contiv_h1_gw_default: "132.1.1.1"  contiv_h1_subnet_default: "10.129.0.0/16"  contiv_h1_gw_default: "10.129.0.1"  # contiv default private subnet for ext access  contiv_private_ext_subnet: "10.130.0.0/16" -openshift_docker_service_name: "{{ 'container-engine' if (openshift_docker_use_system_container | default(False)) else 'docker' }}" +contiv_openshift_docker_service_name: "{{ 'container-engine' if (openshift_docker_use_system_container | default(False) | bool) else 'docker' }}" + +contiv_api_proxy_port: 10000 +contiv_api_proxy_port_proto: tcp +contiv_api_proxy_image_repo: contiv/auth_proxy +contiv_api_proxy_ip: "{{ hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address }}" + +contiv_etcd_system_user: contivetcd +contiv_etcd_system_uid: 823 +contiv_etcd_system_group: contivetcd +contiv_etcd_system_gid: 823 +contiv_etcd_port: 22379 +contiv_etcd_port_proto: tcp +contiv_etcd_peer_port: 22380 +contiv_etcd_peer_port_proto: tcp +contiv_etcd_url: "http://127.0.0.1:{{ contiv_etcd_port }}" +contiv_etcd_init_image_repo: ferest/etcd-initer +contiv_etcd_init_image_tag: latest +contiv_etcd_image_repo: quay.io/coreos/etcd +contiv_etcd_image_tag: v3.2.4 +contiv_etcd_conf_dir: /etc/contiv-etcd +contiv_etcd_data_dir: /var/lib/contiv-etcd +contiv_etcd_peers: |- +  {% for host in groups.oo_masters_to_config -%} +    {{ host }}=http://{{ hostvars[host]['ip'] | default(hostvars[host].ansible_default_ipv4['address']) }}:{{ contiv_etcd_peer_port }}{% if not loop.last %},{% endif %} +  {%- endfor %} + +# List of port/protocol pairs to allow inbound access to on every host +# netplugin runs on, from all host IPs in the cluster. +contiv_netplugin_internal: [ "{{ contiv_ofnet_vxlan_port }}/{{ contiv_ofnet_vxlan_port_proto }}", +                             "{{ contiv_ovs_port }}/{{ contiv_ovs_port_proto }}", +                             "{{ contiv_vxlan_port }}/{{ contiv_vxlan_port_proto }}" ] +# Allow all forwarded traffic in and out of these interfaces. +contiv_netplugin_forward_interfaces: [ contivh0, contivh1 ] + +# List of port/protocol pairs to allow inbound access to on every host +# netmaster runs on, from all host IPs in the cluster.  Note that every host +# that runs netmaster also runs netplugin, so the above netplugin rules will +# apply as well. +contiv_netmaster_internal: [ "{{ contiv_ofnet_master_port }}/{{ contiv_ofnet_master_port_proto }}", +                             "{{ contiv_netmaster_port }}/{{ contiv_netmaster_port_proto }}", +                             "{{ contiv_etcd_port }}/{{ contiv_etcd_port_proto }}", +                             "{{ contiv_etcd_peer_port }}/{{ contiv_etcd_peer_port_proto }}", +                             "{{ contiv_kube_master_api_port }}/{{ contiv_kube_master_api_port_proto }}" ] +# List of port/protocol pairs to allow inbound access to on every host +# netmaster runs on, from any host anywhere. +contiv_netmaster_external: [ "{{ contiv_api_proxy_port }}/{{ contiv_api_proxy_port_proto }}" ] diff --git a/roles/contiv/meta/main.yml b/roles/contiv/meta/main.yml index 52b9d09dd..e8607cc90 100644 --- a/roles/contiv/meta/main.yml +++ b/roles/contiv/meta/main.yml @@ -13,18 +13,5 @@ galaxy_info:    - cloud    - system  dependencies: +- role: lib_utils  - role: contiv_facts -- role: etcd -  etcd_service: contiv-etcd -  etcd_is_thirdparty: True -  etcd_peer_port: 22380 -  etcd_client_port: 22379 -  etcd_conf_dir: /etc/contiv-etcd/ -  etcd_data_dir: /var/lib/contiv-etcd/ -  etcd_ca_host: "{{ groups.oo_etcd_to_config.0 }}" -  etcd_cert_config_dir: /etc/contiv-etcd/ -  etcd_url_scheme: http -  etcd_peer_url_scheme: http -  when: contiv_role == "netmaster" -- role: contiv_auth_proxy -  when: contiv_role == "netmaster" diff --git a/roles/contiv/tasks/aci.yml b/roles/contiv/tasks/aci.yml index 30d2eb339..8a56b3590 100644 --- a/roles/contiv/tasks/aci.yml +++ b/roles/contiv/tasks/aci.yml @@ -11,7 +11,7 @@  - name: ACI | Copy shell script used by aci-gw service    template:      src: aci_gw.j2 -    dest: "{{ bin_dir }}/aci_gw.sh" +    dest: "{{ contiv_bin_dir }}/aci_gw.sh"      mode: u=rwx,g=rx,o=rx  - name: ACI | Copy systemd units for aci-gw diff --git a/roles/contiv/tasks/api_proxy.yml b/roles/contiv/tasks/api_proxy.yml new file mode 100644 index 000000000..8b524dd6e --- /dev/null +++ b/roles/contiv/tasks/api_proxy.yml @@ -0,0 +1,120 @@ +--- +- name: API proxy | Create contiv-api-proxy openshift user +  oc_serviceaccount: +    state: present +    name: contiv-api-proxy +    namespace: kube-system +  run_once: true + +- name: API proxy | Set contiv-api-proxy openshift user permissions +  oc_adm_policy_user: +    user: system:serviceaccount:kube-system:contiv-api-proxy +    resource_kind: scc +    resource_name: hostnetwork +    state: present +  run_once: true + +- name: API proxy | Create temp directory for doing work +  command: mktemp -d /tmp/openshift-contiv-XXXXXX +  register: mktemp +  changed_when: False +  # For things that pass temp files between steps, we want to make sure they +  # run on the same node. +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Check for existing api proxy secret volume +  oc_obj: +    namespace: kube-system +    kind: secret +    state: list +    selector: "name=contiv-api-proxy-secret" +  register: existing_secret_volume +  run_once: true + +- name: API proxy | Generate a self signed certificate for api proxy +  command: openssl req -new -nodes -x509 -subj "/C=US/ST=/L=/O=/CN=localhost" -days 3650 -keyout "{{ mktemp.stdout }}/key.pem" -out "{{ mktemp.stdout }}/cert.pem" -extensions v3_ca +  when: (contiv_api_proxy_cert is not defined or contiv_api_proxy_key is not defined) +        and not existing_secret_volume.results.results[0]['items'] +  register: created_self_signed_cert +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Read self signed certificate file +  command: cat "{{ mktemp.stdout }}/cert.pem" +  register: generated_cert +  when: created_self_signed_cert.changed +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Read self signed key file +  command: cat "{{ mktemp.stdout }}/key.pem" +  register: generated_key +  when: created_self_signed_cert.changed +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Create api-proxy-secrets.yml from template using generated cert +  template: +    src: api-proxy-secrets.yml.j2 +    dest: "{{ mktemp.stdout }}/api-proxy-secrets.yml" +  vars: +    key: "{{ generated_key.stdout }}" +    cert: "{{ generated_cert.stdout }}" +  when: created_self_signed_cert.changed +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Create api-proxy-secrets.yml from template using user defined cert +  template: +    src: api-proxy-secrets.yml.j2 +    dest: "{{ mktemp.stdout }}/api-proxy-secrets.yml" +  vars: +    key: "{{ lookup('file', contiv_api_proxy_key) }}" +    cert: "{{ lookup('file', contiv_api_proxy_cert) }}" +  when: contiv_api_proxy_cert is defined and contiv_api_proxy_key is defined +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Create secret certificate volume +  oc_obj: +    state: present +    namespace: "kube-system" +    kind: secret +    name: contiv-api-proxy-secret +    files: +      - "{{ mktemp.stdout }}/api-proxy-secrets.yml" +  when: (contiv_api_proxy_cert is defined and contiv_api_proxy_key is defined) +        or created_self_signed_cert.changed +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Create api-proxy-daemonset.yml from template +  template: +    src: api-proxy-daemonset.yml.j2 +    dest: "{{ mktemp.stdout }}/api-proxy-daemonset.yml" +  vars: +    etcd_host: "etcd://{{ groups.oo_etcd_to_config.0 }}:{{ contiv_etcd_port }}" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +# Always "import" this file, k8s won't do anything if it matches exactly what +# is already in the cluster. +- name: API proxy | Add API proxy daemonset +  oc_obj: +    state: present +    namespace: "kube-system" +    kind: daemonset +    name: contiv-api-proxy +    files: +      - "{{ mktemp.stdout }}/api-proxy-daemonset.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: API proxy | Delete temp directory +  file: +    name: "{{ mktemp.stdout }}" +    state: absent +  changed_when: False +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true diff --git a/roles/contiv/tasks/default_network.yml b/roles/contiv/tasks/default_network.yml index 8a928ea54..e9763d34a 100644 --- a/roles/contiv/tasks/default_network.yml +++ b/roles/contiv/tasks/default_network.yml @@ -1,71 +1,71 @@  --- -- name: Contiv | Wait for netmaster -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" tenant ls' +- name: Default network | Wait for netmaster +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" tenant ls'    register: tenant_result    until: tenant_result.stdout.find("default") != -1    retries: 9    delay: 10 -- name: Contiv | Set globals -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" global set --fabric-mode {{ contiv_fabric_mode }} --vlan-range {{ contiv_vlan_range }} --fwd-mode {{ netplugin_fwd_mode }} --private-subnet {{ contiv_private_ext_subnet }}' +- name: Default network | Set globals +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" global set --fabric-mode {{ contiv_fabric_mode }} --vlan-range {{ contiv_vlan_range }} --fwd-mode {{ contiv_netplugin_fwd_mode }} --private-subnet {{ contiv_private_ext_subnet }}'    run_once: true -- name: Contiv | Set arp mode to flood if ACI -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" global set --arp-mode flood' +- name: Default network | Set arp mode to flood if ACI +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" global set --arp-mode flood'    when: contiv_fabric_mode == "aci"    run_once: true -- name: Contiv | Check if default-net exists -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" net ls' +- name: Default network | Check if default-net exists +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" net ls'    register: net_result    run_once: true -- name: Contiv | Create default-net -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" net create --subnet={{ contiv_default_subnet }} -e {{ contiv_encap_mode }} -p {{ contiv_default_network_tag }} --gateway {{ contiv_default_gw }} default-net' +- name: Default network | Create default-net +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" net create --subnet={{ contiv_default_subnet }} -e {{ contiv_encap_mode }} -p {{ contiv_default_network_tag }} --gateway {{ contiv_default_gw }} default-net'    when: net_result.stdout.find("default-net") == -1    run_once: true -- name: Contiv | Create host access infra network for VxLan routing case -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" net create --subnet={{ contiv_h1_subnet_default }} --gateway={{ contiv_h1_gw_default }} --nw-type="infra" contivh1' -  when: (contiv_encap_mode == "vxlan") and (netplugin_fwd_mode == "routing") +- name: Default network | Create host access infra network for VxLan routing case +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" net create --subnet={{ contiv_h1_subnet_default }} --gateway={{ contiv_h1_gw_default }} --nw-type="infra" contivh1' +  when: (contiv_encap_mode == "vxlan") and (contiv_netplugin_fwd_mode == "routing")    run_once: true -#- name: Contiv | Create an allow-all policy for the default-group -#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" policy create ose-allow-all-policy' +#- name: Default network | Create an allow-all policy for the default-group +#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" policy create ose-allow-all-policy'  #  when: contiv_fabric_mode == "aci"  #  run_once: true -- name: Contiv | Set up aci external contract to consume default external contract -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" external-contracts create -c -a {{ apic_default_external_contract }} oseExtToConsume' +- name: Default network | Set up aci external contract to consume default external contract +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" external-contracts create -c -a {{ contiv_apic_default_external_contract }} oseExtToConsume'    when: (contiv_fabric_mode == "aci") and (apic_configure_default_policy == true)    run_once: true -- name: Contiv | Set up aci external contract to provide default external contract -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" external-contracts create -p -a {{ apic_default_external_contract }} oseExtToProvide' +- name: Default network | Set up aci external contract to provide default external contract +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" external-contracts create -p -a {{ contiv_apic_default_external_contract }} oseExtToProvide'    when: (contiv_fabric_mode == "aci") and (apic_configure_default_policy == true)    run_once: true -- name: Contiv | Create aci default-group -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" group create default-net default-group' +- name: Default network | Create aci default-group +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" group create default-net default-group'    when: contiv_fabric_mode == "aci"    run_once: true -- name: Contiv | Add external contracts to the default-group -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" group create -e oseExtToConsume -e oseExtToProvide default-net default-group' +- name: Default network | Add external contracts to the default-group +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" group create -e oseExtToConsume -e oseExtToProvide default-net default-group'    when: (contiv_fabric_mode == "aci") and (apic_configure_default_policy == true)    run_once: true -#- name: Contiv | Add policy rule 1 for allow-all policy -#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" policy rule-add -d in --action allow ose-allow-all-policy 1' +#- name: Default network | Add policy rule 1 for allow-all policy +#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" policy rule-add -d in --action allow ose-allow-all-policy 1'  #  when: contiv_fabric_mode == "aci"  #  run_once: true -#- name: Contiv | Add policy rule 2 for allow-all policy -#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" policy rule-add -d out --action allow ose-allow-all-policy 2' +#- name: Default network | Add policy rule 2 for allow-all policy +#  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" policy rule-add -d out --action allow ose-allow-all-policy 2'  #  when: contiv_fabric_mode == "aci"  #  run_once: true -- name: Contiv | Create default aci app profile -  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ netmaster_port }}" app-profile create -g default-group {{ apic_default_app_profile }}' +- name: Default network | Create default aci app profile +  command: 'netctl --netmaster "http://{{ inventory_hostname }}:{{ contiv_netmaster_port }}" app-profile create -g default-group {{ contiv_apic_default_app_profile }}'    when: contiv_fabric_mode == "aci"    run_once: true diff --git a/roles/contiv/tasks/download_bins.yml b/roles/contiv/tasks/download_bins.yml index 831fd360a..47d74da9c 100644 --- a/roles/contiv/tasks/download_bins.yml +++ b/roles/contiv/tasks/download_bins.yml @@ -4,7 +4,7 @@      path: "{{ contiv_current_release_directory }}"      state: directory -- name: Install bzip2 +- name: Download Bins | Install bzip2    yum:      name: bzip2      state: installed @@ -18,9 +18,9 @@      mode: 0755      validate_certs: False    environment: -    http_proxy: "{{ http_proxy|default('') }}" -    https_proxy: "{{ https_proxy|default('') }}" -    no_proxy: "{{ no_proxy|default('') }}" +    http_proxy: "{{ contiv_http_proxy|default('') }}" +    https_proxy: "{{ contiv_https_proxy|default('') }}" +    no_proxy: "{{ contiv_no_proxy|default('') }}"  - name: Download Bins | Extract Contiv tar file    unarchive: @@ -30,19 +30,19 @@  - name: Download Bins | Download cni tar file    get_url: -    url: "{{ cni_bin_url }}" -    dest: "{{ cni_download_dir }}" +    url: "{{ contiv_cni_bin_url }}" +    dest: "{{ contiv_cni_download_dir }}"      mode: 0755      validate_certs: False    environment: -    http_proxy: "{{ http_proxy|default('') }}" -    https_proxy: "{{ https_proxy|default('') }}" -    no_proxy: "{{ no_proxy|default('') }}" +    http_proxy: "{{ contiv_http_proxy|default('') }}" +    https_proxy: "{{ contiv_https_proxy|default('') }}" +    no_proxy: "{{ contiv_no_proxy|default('') }}"    register: download_file  - name: Download Bins | Extract cni tar file    unarchive:      src: "{{ download_file.dest }}" -    dest: "{{ cni_download_dir }}" +    dest: "{{ contiv_cni_download_dir }}"      copy: no    when: download_file.changed diff --git a/roles/contiv/tasks/etcd.yml b/roles/contiv/tasks/etcd.yml new file mode 100644 index 000000000..b08ead982 --- /dev/null +++ b/roles/contiv/tasks/etcd.yml @@ -0,0 +1,114 @@ +--- +# To run contiv-etcd in a container as non-root, we need to match the uid/gid +# with the filesystem permissions on the host. +- name: Contiv etcd | Create local unix group +  group: +    name: "{{ contiv_etcd_system_group }}" +    gid: "{{ contiv_etcd_system_gid }}" +    system: yes + +- name: Contiv etcd | Create local unix user +  user: +    name: "{{ contiv_etcd_system_user }}" +    createhome: no +    uid: "{{ contiv_etcd_system_uid }}" +    group: "{{ contiv_etcd_system_group }}" +    home: "{{ contiv_etcd_data_dir }}" +    shell: /bin/false +    system: yes + +- name: Contiv etcd | Create directories +  file: +    path: "{{ item }}" +    state: directory +    mode: g-rwx,o-rwx +    owner: "{{ contiv_etcd_system_user }}" +    group: "{{ contiv_etcd_system_group }}" +    setype: svirt_sandbox_file_t +    seuser: system_u +    serole: object_r +    selevel: s0 +    recurse: yes +  with_items: +    - "{{ contiv_etcd_data_dir }}" +    - "{{ contiv_etcd_conf_dir }}" + +- name: Contiv etcd | Create contiv-etcd openshift user +  oc_serviceaccount: +    state: present +    name: contiv-etcd +    namespace: kube-system +  run_once: true + +- name: Contiv etcd | Create temp directory for doing work +  command: mktemp -d /tmp/openshift-contiv-XXXXXX +  register: mktemp +  changed_when: False +  # For things that pass temp files between steps, we want to make sure they +  # run on the same node. +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Create etcd-scc.yml from template +  template: +    src: etcd-scc.yml.j2 +    dest: "{{ mktemp.stdout }}/etcd-scc.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Create etcd.yml from template +  template: +    src: etcd-daemonset.yml.j2 +    dest: "{{ mktemp.stdout }}/etcd-daemonset.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Create etcd-proxy.yml from template +  template: +    src: etcd-proxy-daemonset.yml.j2 +    dest: "{{ mktemp.stdout }}/etcd-proxy-daemonset.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Add etcd scc +  oc_obj: +    state: present +    namespace: "kube-system" +    kind: SecurityContextConstraints +    name: contiv-etcd +    files: +      - "{{ mktemp.stdout }}/etcd-scc.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +# Always "import" this file, k8s won't do anything if it matches exactly what +# is already in the cluster. +- name: Contiv etcd | Add etcd daemonset +  oc_obj: +    state: present +    namespace: "kube-system" +    kind: daemonset +    name: contiv-etcd +    files: +      - "{{ mktemp.stdout }}/etcd-daemonset.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Add etcd-proxy daemonset +  oc_obj: +    state: present +    namespace: "kube-system" +    kind: daemonset +    name: contiv-etcd-proxy +    files: +      - "{{ mktemp.stdout }}/etcd-proxy-daemonset.yml" +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true + +- name: Contiv etcd | Delete temp directory +  file: +    name: "{{ mktemp.stdout }}" +    state: absent +  changed_when: False +  delegate_to: "{{ groups.oo_masters_to_config.0 }}" +  run_once: true diff --git a/roles/contiv/tasks/main.yml b/roles/contiv/tasks/main.yml index cb9196a71..4d530ae90 100644 --- a/roles/contiv/tasks/main.yml +++ b/roles/contiv/tasks/main.yml @@ -1,14 +1,15 @@  --- -- name: Ensure bin_dir exists +- include_tasks: old_version_cleanup.yml + +- name: Ensure contiv_bin_dir exists    file: -    path: "{{ bin_dir }}" +    path: "{{ contiv_bin_dir }}"      recurse: yes      state: directory  - include_tasks: download_bins.yml  - include_tasks: netmaster.yml -  when: contiv_role == "netmaster" +  when: contiv_master  - include_tasks: netplugin.yml -  when: contiv_role == "netplugin" diff --git a/roles/contiv/tasks/netmaster.yml b/roles/contiv/tasks/netmaster.yml index 6f15af8c2..bb22fb801 100644 --- a/roles/contiv/tasks/netmaster.yml +++ b/roles/contiv/tasks/netmaster.yml @@ -1,34 +1,16 @@  ---  - include_tasks: netmaster_firewalld.yml -  when: has_firewalld +  when: contiv_has_firewalld  - include_tasks: netmaster_iptables.yml -  when: not has_firewalld and has_iptables +  when: not contiv_has_firewalld and contiv_has_iptables -- name: Netmaster | Check is /etc/hosts file exists -  stat: -    path: /etc/hosts -  register: hosts - -- name: Netmaster | Create hosts file if it is not present -  file: -    path: /etc/hosts -    state: touch -  when: not hosts.stat.exists - -- name: Netmaster | Build hosts file -  lineinfile: -    dest: /etc/hosts -    regexp: .*netmaster$ -    line: "{{ hostvars[item]['ansible_' + netmaster_interface].ipv4.address }} netmaster" -    state: present -  when: hostvars[item]['ansible_' + netmaster_interface].ipv4.address is defined -  with_items: "{{ groups['masters'] }}" +- include_tasks: etcd.yml  - name: Netmaster | Create netmaster symlinks    file:      src: "{{ contiv_current_release_directory }}/{{ item }}" -    dest: "{{ bin_dir }}/{{ item }}" +    dest: "{{ contiv_bin_dir }}/{{ item }}"      state: link    with_items:      - netmaster @@ -36,7 +18,7 @@  - name: Netmaster | Copy environment file for netmaster    template: -    src: netmaster.env.j2 +    src: netmaster.j2      dest: /etc/default/netmaster      mode: 0644    notify: restart netmaster @@ -75,3 +57,5 @@  - include_tasks: default_network.yml    when: contiv_default_network == true + +- include_tasks: api_proxy.yml diff --git a/roles/contiv/tasks/netmaster_firewalld.yml b/roles/contiv/tasks/netmaster_firewalld.yml index 2975351ac..0d52f821d 100644 --- a/roles/contiv/tasks/netmaster_firewalld.yml +++ b/roles/contiv/tasks/netmaster_firewalld.yml @@ -1,16 +1,17 @@  --- -- name: Netmaster Firewalld | Open Netmaster port +- name: Netmaster Firewalld | Add internal rules    firewalld: -    port: "{{ netmaster_port }}/tcp" -    permanent: false -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes +    immediate: true +    permanent: true +    port: "{{ item[0] }}" +    source: "{{ item[1] }}" +  with_nested: +    - "{{ contiv_netmaster_internal }}" +    - "{{ groups.oo_nodes_to_config|difference(hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address)|list }}" -- name: Netmaster Firewalld | Save Netmaster port +- name: Netmaster Firewalld | Add external rules    firewalld: -    port: "{{ netmaster_port }}/tcp" +    immediate: true      permanent: true -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes +    port: "{{ item }}" +  with_items: "{{ contiv_netmaster_external }}" diff --git a/roles/contiv/tasks/netmaster_iptables.yml b/roles/contiv/tasks/netmaster_iptables.yml index c98e7b6a5..3b68ea0c3 100644 --- a/roles/contiv/tasks/netmaster_iptables.yml +++ b/roles/contiv/tasks/netmaster_iptables.yml @@ -1,27 +1,32 @@  --- -- name: Netmaster IPtables | Get iptables rules -  command: iptables -L --wait -  register: iptablesrules -  check_mode: no - -- name: Netmaster IPtables | Enable iptables at boot -  service: -    name: iptables -    enabled: yes -    state: started - -- name: Netmaster IPtables | Open Netmaster with iptables -  command: /sbin/iptables -I INPUT 1 -p tcp --dport {{ item }} -j ACCEPT -m comment --comment "contiv" -  with_items: -    - "{{ contiv_rpc_port1 }}" -    - "{{ contiv_rpc_port2 }}" -    - "{{ contiv_rpc_port3 }}" -  when: iptablesrules.stdout.find("contiv") == -1 +- name: Netmaster IPtables | Add internal rules +  iptables: +    action: insert +    chain: INPUT +    # Parsed from the contiv_netmaster_internal list, this will be tcp or udp. +    protocol: "{{ item[0].split('/')[1] }}" +    match: "{{ item[0].split('/')[1] }}" +    # Parsed from the contiv_netmaster_internal list, this will be a port number. +    destination_port: "{{ item[0].split('/')[0] }}" +    # This is an IP address from a node in the cluster. +    source: "{{ item[1] }}" +    jump: ACCEPT +    comment: contiv +  with_nested: +    - "{{ contiv_netmaster_internal }}" +    - "{{ groups.oo_nodes_to_config|difference(hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address)|list }}"    notify: Save iptables rules -- name: Netmaster IPtables | Open netmaster main port -  command: /sbin/iptables -I INPUT 1 -p tcp -s {{ item }} --dport {{ netmaster_port }} -j ACCEPT -m comment --comment "contiv" -  with_items: -    - "{{ groups.oo_nodes_to_config|difference(hostvars[inventory_hostname]['ansible_' + netmaster_interface].ipv4.address)|list }}" -  when: iptablesrules.stdout.find("contiv") == -1 +- name: Netmaster IPtables | Add external rules +  iptables: +    action: insert +    chain: INPUT +    # Parsed from the contiv_netmaster_external list, this will be tcp or udp. +    protocol: "{{ item.split('/')[1] }}" +    match: "{{ item.split('/')[1] }}" +    # Parsed from the contiv_netmaster_external list, this will be a port number. +    destination_port: "{{ item.split('/')[0] }}" +    jump: ACCEPT +    comment: contiv +  with_items: "{{ contiv_netmaster_external }}"    notify: Save iptables rules diff --git a/roles/contiv/tasks/netplugin.yml b/roles/contiv/tasks/netplugin.yml index 540f6e4bc..60f432202 100644 --- a/roles/contiv/tasks/netplugin.yml +++ b/roles/contiv/tasks/netplugin.yml @@ -1,9 +1,9 @@  ---  - include_tasks: netplugin_firewalld.yml -  when: has_firewalld +  when: contiv_has_firewalld  - include_tasks: netplugin_iptables.yml -  when: has_iptables +  when: not contiv_has_firewalld and contiv_has_iptables  - name: Netplugin | Ensure localhost entry correct in /etc/hosts    lineinfile: @@ -20,41 +20,40 @@      state: absent  - include_tasks: ovs.yml -  when: netplugin_driver == "ovs" +  when: contiv_netplugin_driver == "ovs"  - name: Netplugin | Create Netplugin bin symlink    file:      src: "{{ contiv_current_release_directory }}/netplugin" -    dest: "{{ bin_dir }}/netplugin" +    dest: "{{ contiv_bin_dir }}/netplugin"      state: link - -- name: Netplugin | Ensure cni_bin_dir exists +- name: Netplugin | Ensure contiv_cni_bin_dir exists    file: -    path: "{{ cni_bin_dir }}" +    path: "{{ contiv_cni_bin_dir }}"      recurse: yes      state: directory  - name: Netplugin | Create CNI bin symlink    file:      src: "{{ contiv_current_release_directory }}/contivk8s" -    dest: "{{ cni_bin_dir }}/contivk8s" +    dest: "{{ contiv_cni_bin_dir }}/contivk8s"      state: link  - name: Netplugin | Copy CNI loopback bin    copy: -    src: "{{ cni_download_dir }}/loopback" -    dest: "{{ cni_bin_dir }}/loopback" +    src: "{{ contiv_cni_download_dir }}/loopback" +    dest: "{{ contiv_cni_bin_dir }}/loopback"      remote_src: True      mode: 0755 -- name: Netplugin | Ensure kube_plugin_dir and cni/net.d directories exist +- name: Netplugin | Ensure contiv_kube_plugin_dir and cni/net.d directories exist    file:      path: "{{ item }}"      recurse: yes      state: directory    with_items: -    - "{{ kube_plugin_dir }}" +    - "{{ contiv_kube_plugin_dir }}"      - "/etc/cni/net.d"  - name: Netplugin | Ensure contiv_config_dir exists @@ -68,7 +67,7 @@      src: contiv_cni.conf      dest: "{{ item }}"    with_items: -    - "{{ kube_plugin_dir }}/contiv_cni.conf" +    - "{{ contiv_kube_plugin_dir }}/contiv_cni.conf"      - "/etc/cni/net.d"  # notify: restart kubelet @@ -85,11 +84,11 @@      mode: 0644    notify: restart netplugin -- name: Docker | Make sure proxy setting exists +- name: Netplugin | Make sure docker proxy setting exists    lineinfile:      dest: /etc/sysconfig/docker-network      regexp: '^https_proxy.*' -    line: 'https_proxy={{ https_proxy }}' +    line: 'https_proxy={{ contiv_https_proxy }}'      state: present    register: docker_updated @@ -103,9 +102,9 @@    command: systemctl daemon-reload    when: docker_updated is changed -- name: Docker | Restart docker +- name: Netplugin | Restart docker    service: -    name: "{{ openshift_docker_service_name }}" +    name: "{{ contiv_openshift_docker_service_name }}"      state: restarted    when: docker_updated is changed    register: l_docker_restart_docker_in_contiv_result diff --git a/roles/contiv/tasks/netplugin_firewalld.yml b/roles/contiv/tasks/netplugin_firewalld.yml index 3aeffae56..5ac531ec6 100644 --- a/roles/contiv/tasks/netplugin_firewalld.yml +++ b/roles/contiv/tasks/netplugin_firewalld.yml @@ -1,34 +1,17 @@  --- -- name: Netplugin Firewalld | Open Netplugin port +- name: Netplugin Firewalld | Add internal rules    firewalld: -    port: "{{ netplugin_port }}/tcp" -    permanent: false -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes - -- name: Netplugin Firewalld | Save Netplugin port -  firewalld: -    port: "{{ netplugin_port }}/tcp" +    immediate: true      permanent: true -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes - -- name: Netplugin Firewalld | Open vxlan port -  firewalld: -    port: "8472/udp" -    permanent: false -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes -  when: contiv_encap_mode == "vxlan" +    port: "{{ item[0] }}" +    source: "{{ item[1] }}" +  with_nested: +    - "{{ contiv_netplugin_internal }}" +    - "{{ groups.oo_nodes_to_config|difference(hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address)|list }}" -- name: Netplugin Firewalld | Save firewalld vxlan port for flanneld +- name: Netplugin Firewalld | Add dns rule    firewalld: -    port: "8472/udp" +    immediate: true      permanent: true -    state: enabled -  # in case this is also a node where firewalld turned off -  ignore_errors: yes -  when: contiv_encap_mode == "vxlan" +    port: "53/udp" +    interface: contivh0 diff --git a/roles/contiv/tasks/netplugin_iptables.yml b/roles/contiv/tasks/netplugin_iptables.yml index 3ea34645d..9d376f4e5 100644 --- a/roles/contiv/tasks/netplugin_iptables.yml +++ b/roles/contiv/tasks/netplugin_iptables.yml @@ -1,58 +1,52 @@  --- -- name: Netplugin IPtables | Get iptables rules -  command: iptables -L --wait -  register: iptablesrules -  check_mode: no +- name: Netplugin IPtables | Add internal rules +  iptables: +    action: insert +    chain: INPUT +    protocol: "{{ item[0].split('/')[1] }}" +    match: "{{ item[0].split('/')[1] }}" +    destination_port: "{{ item[0].split('/')[0] }}" +    source: "{{ item[1] }}" +    jump: ACCEPT +    comment: contiv +  with_nested: +    - "{{ contiv_netplugin_internal }}" +    - "{{ groups.oo_nodes_to_config|difference(hostvars[inventory_hostname]['ansible_' + contiv_netmaster_interface].ipv4.address)|list }}" +  notify: Save iptables rules + +- name: Netplugin IPtables | Add [in] forward rules +  iptables: +    action: insert +    chain: FORWARD +    in_interface: "{{ item }}" +    jump: ACCEPT +    comment: contiv +  with_items: "{{ contiv_netplugin_forward_interfaces }}" +  notify: Save iptables rules + +- name: Netplugin IPtables | Add [out] forward rules +  iptables: +    action: insert +    chain: FORWARD +    out_interface: "{{ item }}" +    jump: ACCEPT +    comment: contiv +  with_items: "{{ contiv_netplugin_forward_interfaces }}" +  notify: Save iptables rules + +- name: Netplugin IPtables | Add dns rule +  iptables: +    action: insert +    chain: INPUT +    protocol: udp +    match: udp +    destination_port: 53 +    in_interface: contivh0 +    jump: ACCEPT +    comment: contiv +  notify: Save iptables rules  - name: Netplugin IPtables | Enable iptables at boot    service:      name: iptables      enabled: yes -    state: started - -- name: Netplugin IPtables | Open Netmaster with iptables -  command: /sbin/iptables -I INPUT 1 -p tcp --dport {{ item }} -j ACCEPT -m comment --comment "contiv" -  with_items: -  - "{{ netmaster_port }}" -  - "{{ contiv_rpc_port1 }}" -  - "{{ contiv_rpc_port2 }}" -  - "{{ contiv_rpc_port3 }}" -  - "{{ contiv_etcd_port }}" -  - "{{ kube_master_api_port }}" -  when: iptablesrules.stdout.find("contiv") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Open vxlan port with iptables -  command: /sbin/iptables -I INPUT 1 -p udp --dport 8472 -j ACCEPT -m comment --comment "netplugin vxlan 8472" -  when: iptablesrules.stdout.find("netplugin vxlan 8472") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Open vxlan port with iptables -  command: /sbin/iptables -I INPUT 1 -p udp --dport 4789 -j ACCEPT -m comment --comment "netplugin vxlan 4789" -  when: iptablesrules.stdout.find("netplugin vxlan 4789") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Allow from contivh0 -  command: /sbin/iptables -I FORWARD 1 -i contivh0 -j ACCEPT -m comment --comment "contivh0 FORWARD input" -  when: iptablesrules.stdout.find("contivh0 FORWARD input") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Allow to contivh0 -  command: /sbin/iptables -I FORWARD 1 -o contivh0 -j ACCEPT -m comment --comment "contivh0 FORWARD output" -  when: iptablesrules.stdout.find("contivh0 FORWARD output") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Allow from contivh1 -  command: /sbin/iptables -I FORWARD 1 -i contivh1 -j ACCEPT -m comment --comment "contivh1 FORWARD input" -  when: iptablesrules.stdout.find("contivh1 FORWARD input") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Allow to contivh1 -  command: /sbin/iptables -I FORWARD 1 -o contivh1 -j ACCEPT -m comment --comment "contivh1 FORWARD output" -  when: iptablesrules.stdout.find("contivh1 FORWARD output") == -1 -  notify: Save iptables rules - -- name: Netplugin IPtables | Allow dns -  command: /sbin/iptables -I INPUT 1 -p udp --dport 53 -j ACCEPT -m comment --comment "contiv dns" -  when: iptablesrules.stdout.find("contiv dns") == -1 -  notify: Save iptables rules diff --git a/roles/contiv/tasks/old_version_cleanup.yml b/roles/contiv/tasks/old_version_cleanup.yml new file mode 100644 index 000000000..8b3d88096 --- /dev/null +++ b/roles/contiv/tasks/old_version_cleanup.yml @@ -0,0 +1,43 @@ +--- +- name: Old version cleanup | Check if old auth proxy service exists +  stat: +    path: /etc/systemd/system/auth-proxy.service +  register: auth_proxy_stat + +- name: Old version cleanup | Stop old auth proxy +  service: +    name: auth-proxy +    enabled: no +    state: stopped +  when: auth_proxy_stat.stat.exists + +# Note(NB): The new containerized contiv-etcd service uses the same data +# directory on the host, so etcd data is not lost. +- name: Old version cleanup | Check if old contiv-etcd service exists +  stat: +    path: /etc/systemd/system/contiv-etcd.service +  register: contiv_etcd_stat + +- name: Old version cleanup | Stop old contiv-etcd +  service: +    name: contiv-etcd +    enabled: no +    state: stopped +  when: contiv_etcd_stat.stat.exists + +- name: Old version cleanup | Delete old files +  file: +    state: absent +    path: "{{ item }}" +  with_items: +    - /etc/systemd/system/auth-proxy.service +    - /var/contiv/certs +    - /usr/bin/auth_proxy.sh +    - /etc/systemd/system/contiv-etcd.service +    - /etc/systemd/system/contiv-etcd.service.d + +- include_tasks: old_version_cleanup_iptables.yml +  when: not contiv_has_firewalld and contiv_has_iptables + +- include_tasks: old_version_cleanup_firewalld.yml +  when: contiv_has_firewalld diff --git a/roles/contiv/tasks/old_version_cleanup_firewalld.yml b/roles/contiv/tasks/old_version_cleanup_firewalld.yml new file mode 100644 index 000000000..675a6358a --- /dev/null +++ b/roles/contiv/tasks/old_version_cleanup_firewalld.yml @@ -0,0 +1,11 @@ +--- +- name: Old version cleanup | Delete old firewalld rules +  firewalld: +    state: absent +    immediate: true +    permanent: true +    port: "{{ item }}" +  with_items: +    - "9999/tcp" +    - "6640/tcp" +    - "8472/udp" diff --git a/roles/contiv/tasks/old_version_cleanup_iptables.yml b/roles/contiv/tasks/old_version_cleanup_iptables.yml new file mode 100644 index 000000000..513357606 --- /dev/null +++ b/roles/contiv/tasks/old_version_cleanup_iptables.yml @@ -0,0 +1,44 @@ +--- +- name: Old version cleanup | Delete old forward [in] iptables rules +  iptables: +    state: absent +    chain: FORWARD +    in_interface: "{{ item }}" +    jump: ACCEPT +    comment: "{{ item }} FORWARD input" +  with_items: +    - contivh0 +    - contivh1 +  notify: Save iptables rules + +- name: Old version cleanup | Delete old forward [out] iptables rules +  iptables: +    state: absent +    chain: FORWARD +    out_interface: "{{ item }}" +    jump: ACCEPT +    comment: "{{ item }} FORWARD output" +  with_items: +    - contivh0 +    - contivh1 +  notify: Save iptables rules + +- name: Old version cleanup | Delete old input iptables rules +  iptables: +    state: absent +    chain: INPUT +    protocol: "{{ item.split('/')[1] }}" +    match: "{{ item.split('/')[1] }}" +    destination_port: "{{ item.split('/')[0] }}" +    comment: "{{ item.split('/')[2] }}" +    jump: ACCEPT +  with_items: +    - "53/udp/contiv dns" +    - "4789/udp/netplugin vxlan 4789" +    - "8472/udp/netplugin vxlan 8472" +    - "9003/tcp/contiv" +    - "9002/tcp/contiv" +    - "9001/tcp/contiv" +    - "9999/tcp/contiv" +    - "10000/tcp/Contiv auth proxy service (10000)" +  notify: Save iptables rules diff --git a/roles/contiv/tasks/ovs.yml b/roles/contiv/tasks/ovs.yml index 5c92e90e9..21ba6ead4 100644 --- a/roles/contiv/tasks/ovs.yml +++ b/roles/contiv/tasks/ovs.yml @@ -1,6 +1,6 @@  ---  - include_tasks: packageManagerInstall.yml -  when: source_type == "packageManager" +  when: contiv_source_type == "packageManager"    tags:      - binary-update diff --git a/roles/contiv/tasks/packageManagerInstall.yml b/roles/contiv/tasks/packageManagerInstall.yml index d5726476c..8c8e7a7bd 100644 --- a/roles/contiv/tasks/packageManagerInstall.yml +++ b/roles/contiv/tasks/packageManagerInstall.yml @@ -4,10 +4,9 @@      did_install: false  - include_tasks: pkgMgrInstallers/centos-install.yml -  when: (ansible_os_family == "RedHat") and -        not is_atomic +  when: ansible_os_family == "RedHat" and not openshift_is_atomic | bool  - name: Package Manager | Set fact saying we did CentOS package install    set_fact:      did_install: true -  when: (ansible_os_family == "RedHat") +  when: ansible_os_family == "RedHat" diff --git a/roles/contiv/tasks/pkgMgrInstallers/centos-install.yml b/roles/contiv/tasks/pkgMgrInstallers/centos-install.yml index 53c5b4099..2c82973d6 100644 --- a/roles/contiv/tasks/pkgMgrInstallers/centos-install.yml +++ b/roles/contiv/tasks/pkgMgrInstallers/centos-install.yml @@ -12,9 +12,9 @@      dest: /tmp/rdo-release-ocata-2.noarch.rpm      validate_certs: False    environment: -    http_proxy: "{{ http_proxy|default('') }}" -    https_proxy: "{{ https_proxy|default('') }}" -    no_proxy: "{{ no_proxy|default('') }}" +    http_proxy: "{{ contiv_http_proxy|default('') }}" +    https_proxy: "{{ contiv_https_proxy|default('') }}" +    no_proxy: "{{ contiv_no_proxy|default('') }}"    tags:      - ovs_install @@ -30,9 +30,9 @@      pkg=openvswitch      state=present    environment: -    http_proxy: "{{ http_proxy|default('') }}" -    https_proxy: "{{ https_proxy|default('') }}" -    no_proxy: "{{ no_proxy|default('') }}" +    http_proxy: "{{ contiv_http_proxy|default('') }}" +    https_proxy: "{{ contiv_https_proxy|default('') }}" +    no_proxy: "{{ contiv_no_proxy|default('') }}"    tags:      - ovs_install    register: result diff --git a/roles/contiv/templates/aci-gw.service b/roles/contiv/templates/aci-gw.service index 9b3f12567..e2813c99d 100644 --- a/roles/contiv/templates/aci-gw.service +++ b/roles/contiv/templates/aci-gw.service @@ -1,10 +1,10 @@  [Unit]  Description=Contiv ACI gw -After=auditd.service systemd-user-sessions.service time-sync.target {{ openshift_docker_service_name }}.service +After=auditd.service systemd-user-sessions.service time-sync.target {{ contiv_openshift_docker_service_name }}.service  [Service] -ExecStart={{ bin_dir }}/aci_gw.sh start -ExecStop={{ bin_dir }}/aci_gw.sh stop +ExecStart={{ contiv_bin_dir }}/aci_gw.sh start +ExecStop={{ contiv_bin_dir }}/aci_gw.sh stop  KillMode=control-group  Restart=always  RestartSec=10 diff --git a/roles/contiv/templates/aci_gw.j2 b/roles/contiv/templates/aci_gw.j2 index ab4ad46a6..5ff349945 100644 --- a/roles/contiv/templates/aci_gw.j2 +++ b/roles/contiv/templates/aci_gw.j2 @@ -11,13 +11,13 @@ start)      set -e      docker run --net=host \ -    -e "APIC_URL={{ apic_url }}" \ -    -e "APIC_USERNAME={{ apic_username }}" \ -    -e "APIC_PASSWORD={{ apic_password }}" \ -    -e "APIC_LEAF_NODE={{ apic_leaf_nodes }}" \ -    -e "APIC_PHYS_DOMAIN={{ apic_phys_dom }}" \ -    -e "APIC_EPG_BRIDGE_DOMAIN={{ apic_epg_bridge_domain }}" \ -    -e "APIC_CONTRACTS_UNRESTRICTED_MODE={{ apic_contracts_unrestricted_mode }}" \ +    -e "APIC_URL={{ contiv_apic_url }}" \ +    -e "APIC_USERNAME={{ contiv_apic_username }}" \ +    -e "APIC_PASSWORD={{ contiv_apic_password }}" \ +    -e "APIC_LEAF_NODE={{ contiv_apic_leaf_nodes }}" \ +    -e "APIC_PHYS_DOMAIN={{ contiv_apic_phys_dom }}" \ +    -e "APIC_EPG_BRIDGE_DOMAIN={{ contiv_apic_epg_bridge_domain }}" \ +    -e "APIC_CONTRACTS_UNRESTRICTED_MODE={{ contiv_apic_contracts_unrestricted_mode }}" \      --name=contiv-aci-gw \      contiv/aci-gw      ;; diff --git a/roles/contiv/templates/api-proxy-daemonset.yml.j2 b/roles/contiv/templates/api-proxy-daemonset.yml.j2 new file mode 100644 index 000000000..a15073580 --- /dev/null +++ b/roles/contiv/templates/api-proxy-daemonset.yml.j2 @@ -0,0 +1,57 @@ +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: +  name: contiv-api-proxy +  namespace: kube-system +spec: +  updateStrategy: +    type: RollingUpdate +  selector: +    matchLabels: +      name: contiv-api-proxy +  template: +    metadata: +      namespace: kube-system +      labels: +        name: contiv-api-proxy +      annotations: +        scheduler.alpha.kubernetes.io/critical-pod: "" +    spec: +      serviceAccountName: contiv-api-proxy +      hostNetwork: true +      affinity: +        nodeAffinity: +          requiredDuringSchedulingIgnoredDuringExecution: +            nodeSelectorTerms: +            - matchExpressions: +              - key: kubernetes.io/hostname +                operator: In +                values: +{% for node in groups.oo_masters_to_config %} +                  - "{{ node }}" +{% endfor %} +      tolerations: +        - key: node-role.kubernetes.io/master +          effect: NoSchedule +      containers: +        - name: contiv-api-proxy +          image: "{{ contiv_api_proxy_image_repo }}:{{ contiv_version }}" +          args: +            - "--listen-address=0.0.0.0:{{ contiv_api_proxy_port }}" +            - --tls-key-file=/var/contiv/api_proxy_key.pem +            - --tls-certificate=/var/contiv/api_proxy_cert.pem +            - "--data-store-address={{ etcd_host }}" +            - --data-store-driver=etcd +            - "--netmaster-address=127.0.0.1:{{ contiv_netmaster_port }}" +          ports: +            - containerPort: "{{ contiv_api_proxy_port }}" +              hostPort: "{{ contiv_api_proxy_port }}" +          volumeMounts: +            - name: secret-volume +              mountPath: /var/contiv +              readOnly: true +      volumes: +        - name: secret-volume +          secret: +            secretName: contiv-api-proxy-secret diff --git a/roles/contiv/templates/api-proxy-secrets.yml.j2 b/roles/contiv/templates/api-proxy-secrets.yml.j2 new file mode 100644 index 000000000..cd800c97d --- /dev/null +++ b/roles/contiv/templates/api-proxy-secrets.yml.j2 @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Secret +metadata: +    name: contiv-api-proxy-secret +    namespace: kube-system +    labels: +      name: contiv-api-proxy-secret +# Use data+b64encode, because stringData doesn't preserve newlines. +data: +    api_proxy_key.pem: "{{ key | b64encode }}" +    api_proxy_cert.pem: "{{ cert | b64encode }}" diff --git a/roles/contiv/templates/contiv.cfg.j2 b/roles/contiv/templates/contiv.cfg.j2 index f0e99c556..1dce9fcc2 100644 --- a/roles/contiv/templates/contiv.cfg.j2 +++ b/roles/contiv/templates/contiv.cfg.j2 @@ -1,5 +1,5 @@  { -  "K8S_API_SERVER": "https://{{ hostvars[groups['masters'][0]]['ansible_' + netmaster_interface].ipv4.address }}:{{ kube_master_api_port }}", +  "K8S_API_SERVER": "https://{{ hostvars[groups['masters'][0]]['ansible_' + contiv_netmaster_interface].ipv4.address }}:{{ contiv_kube_master_api_port }}",    "K8S_CA": "{{ openshift.common.config_base }}/node/ca.crt",    "K8S_KEY": "{{ openshift.common.config_base }}/node/system:node:{{ openshift.common.hostname }}.key",    "K8S_CERT": "{{ openshift.common.config_base }}/node/system:node:{{ openshift.common.hostname }}.crt", diff --git a/roles/contiv/templates/contiv.cfg.master.j2 b/roles/contiv/templates/contiv.cfg.master.j2 index fac8e3c4c..ca29b8001 100644 --- a/roles/contiv/templates/contiv.cfg.master.j2 +++ b/roles/contiv/templates/contiv.cfg.master.j2 @@ -1,5 +1,5 @@  { -  "K8S_API_SERVER": "https://{{ hostvars[groups['masters'][0]]['ansible_' + netmaster_interface].ipv4.address }}:{{ kube_master_api_port }}", +  "K8S_API_SERVER": "https://{{ hostvars[groups['masters'][0]]['ansible_' + contiv_netmaster_interface].ipv4.address }}:{{ contiv_kube_master_api_port }}",    "K8S_CA": "{{ openshift.common.config_base }}/master/ca.crt",    "K8S_KEY": "{{ openshift.common.config_base }}/master/system:node:{{ openshift.common.hostname }}.key",    "K8S_CERT": "{{ openshift.common.config_base }}/master/system:node:{{ openshift.common.hostname }}.crt", diff --git a/roles/contiv/templates/etcd-daemonset.yml.j2 b/roles/contiv/templates/etcd-daemonset.yml.j2 new file mode 100644 index 000000000..76937e670 --- /dev/null +++ b/roles/contiv/templates/etcd-daemonset.yml.j2 @@ -0,0 +1,83 @@ +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: +  name: contiv-etcd +  namespace: kube-system +spec: +  updateStrategy: +    type: RollingUpdate +  selector: +    matchLabels: +      name: contiv-etcd +  template: +    metadata: +      namespace: kube-system +      labels: +        name: contiv-etcd +      annotations: +        scheduler.alpha.kubernetes.io/critical-pod: "" +    spec: +      serviceAccountName: contiv-etcd +      hostNetwork: true +      affinity: +        nodeAffinity: +          requiredDuringSchedulingIgnoredDuringExecution: +            nodeSelectorTerms: +            - matchExpressions: +              - key: kubernetes.io/hostname +                operator: In +                values: +{% for node in groups.oo_masters_to_config %} +                  - "{{ node }}" +{% endfor %} +      tolerations: +        - key: node-role.kubernetes.io/master +          effect: NoSchedule +      initContainers: +        - name: contiv-etcd-init +          image: "{{ contiv_etcd_init_image_repo }}:{{ contiv_etcd_init_image_tag }}" +          env: +            - name: ETCD_INIT_ARGSFILE +              value: "{{ contiv_etcd_conf_dir }}/contiv-etcd-args" +            - name: ETCD_INIT_LISTEN_PORT +              value: "{{ contiv_etcd_port }}" +            - name: ETCD_INIT_PEER_PORT +              value: "{{ contiv_etcd_peer_port }}" +            - name: ETCD_INIT_CLUSTER +              value: "{{ contiv_etcd_peers }}" +            - name: ETCD_INIT_DATA_DIR +              value: "{{ contiv_etcd_data_dir }}" +          volumeMounts: +            - name: contiv-etcd-conf-dir +              mountPath: "{{ contiv_etcd_conf_dir }}" +          securityContext: +            runAsUser: "{{ contiv_etcd_system_uid }}" +            fsGroup: "{{ contiv_etcd_system_gid }}" +      containers: +        - name: contiv-etcd +          image: "{{ contiv_etcd_image_repo }}:{{ contiv_etcd_image_tag }}" +          command: +            - sh +            - -c +            - 'exec etcd $(cat "$ETCD_INIT_ARGSFILE")' +          env: +            - name: ETCD_INIT_ARGSFILE +              value: "{{ contiv_etcd_conf_dir }}/contiv-etcd-args" +          volumeMounts: +            - name: contiv-etcd-conf-dir +              mountPath: "{{ contiv_etcd_conf_dir }}" +            - name: contiv-etcd-data-dir +              mountPath: "{{ contiv_etcd_data_dir }}" +          securityContext: +            runAsUser: "{{ contiv_etcd_system_uid }}" +            fsGroup: "{{ contiv_etcd_system_gid }}" +      volumes: +        - name: contiv-etcd-data-dir +          hostPath: +            type: DirectoryOrCreate +            path: "{{ contiv_etcd_data_dir }}" +        - name: contiv-etcd-conf-dir +          hostPath: +            type: DirectoryOrCreate +            path: "{{ contiv_etcd_conf_dir }}" diff --git a/roles/contiv/templates/etcd-proxy-daemonset.yml.j2 b/roles/contiv/templates/etcd-proxy-daemonset.yml.j2 new file mode 100644 index 000000000..4ec6cfd76 --- /dev/null +++ b/roles/contiv/templates/etcd-proxy-daemonset.yml.j2 @@ -0,0 +1,55 @@ +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: +  name: contiv-etcd-proxy +  namespace: kube-system +spec: +  updateStrategy: +    type: RollingUpdate +  selector: +    matchLabels: +      name: contiv-etcd-proxy +  template: +    metadata: +      namespace: kube-system +      labels: +        name: contiv-etcd-proxy +      annotations: +        scheduler.alpha.kubernetes.io/critical-pod: "" +    spec: +      serviceAccountName: contiv-etcd +      hostNetwork: true +      affinity: +        nodeAffinity: +          requiredDuringSchedulingIgnoredDuringExecution: +            nodeSelectorTerms: +            - matchExpressions: +              - key: kubernetes.io/hostname +                operator: NotIn +                values: +{% for node in groups.oo_masters_to_config %} +                  - "{{ node }}" +{% endfor %} +      tolerations: +        - key: node-role.kubernetes.io/master +          effect: NoSchedule +      containers: +        - name: contiv-etcd-proxy +          image: "{{ contiv_etcd_image_repo }}:{{ contiv_etcd_image_tag }}" +          command: +            - etcd +            - "--proxy=on" +            - "--listen-client-urls=http://127.0.0.1:{{ contiv_etcd_port }}" +            - "--advertise-client-urls=http://127.0.0.1:{{ contiv_etcd_port }}" +            - "--initial-cluster={{ contiv_etcd_peers }}" +            - "--data-dir={{ contiv_etcd_data_dir }}" +          volumeMounts: +            - name: contiv-etcd-data-dir +              mountPath: "{{ contiv_etcd_data_dir }}" +          securityContext: +            runAsUser: "{{ contiv_etcd_system_uid }}" +            fsGroup: "{{ contiv_etcd_system_gid }}" +      volumes: +        - name: contiv-etcd-data-dir +          emptyDir: {} diff --git a/roles/contiv/templates/etcd-scc.yml.j2 b/roles/contiv/templates/etcd-scc.yml.j2 new file mode 100644 index 000000000..6c4bb1d1e --- /dev/null +++ b/roles/contiv/templates/etcd-scc.yml.j2 @@ -0,0 +1,42 @@ +allowHostDirVolumePlugin: true +allowHostIPC: false +allowHostNetwork: true +allowHostPID: false +allowHostPorts: false +allowPrivilegedContainer: false +allowedCapabilities: [] +allowedFlexVolumes: [] +apiVersion: v1 +defaultAddCapabilities: [] +fsGroup: +  ranges: +  - max: "{{ contiv_etcd_system_gid }}" +    min: "{{ contiv_etcd_system_gid }}" +  type: MustRunAs +groups: [] +kind: SecurityContextConstraints +metadata: +  annotations: +    kubernetes.io/description: 'For contiv-etcd only.' +  creationTimestamp: null +  name: contiv-etcd +priority: null +readOnlyRootFilesystem: true +requiredDropCapabilities: +- KILL +- MKNOD +- SETUID +- SETGID +runAsUser: +  type: MustRunAs +  uid: "{{ contiv_etcd_system_uid }}" +seLinuxContext: +  type: MustRunAs +supplementalGroups: +  type: MustRunAs +users: +- system:serviceaccount:kube-system:contiv-etcd +volumes: +- emptyDir +- hostPath +- secret diff --git a/roles/contiv/templates/netmaster.env.j2 b/roles/contiv/templates/netmaster.env.j2 deleted file mode 100644 index 5b5c84a2e..000000000 --- a/roles/contiv/templates/netmaster.env.j2 +++ /dev/null @@ -1,2 +0,0 @@ -NETMASTER_ARGS='--cluster-store etcd://{{ etcd_url }}  --cluster-mode=kubernetes' - diff --git a/roles/contiv/templates/netmaster.j2 b/roles/contiv/templates/netmaster.j2 new file mode 100644 index 000000000..c9db122b5 --- /dev/null +++ b/roles/contiv/templates/netmaster.j2 @@ -0,0 +1 @@ +NETMASTER_ARGS='--etcd={{ contiv_etcd_url }} --listen-url=127.0.0.1:{{ contiv_netmaster_port }} --fwdmode={{ contiv_netplugin_fwd_mode }} --infra={{ contiv_fabric_mode }} --control-url={{ contiv_netmaster_ctrl_ip }}:{{ contiv_netmaster_port }} --cluster-mode=kubernetes --netmode={{ contiv_encap_mode }}' diff --git a/roles/contiv/templates/netmaster.service b/roles/contiv/templates/netmaster.service index ce7d0c75e..b7289bc38 100644 --- a/roles/contiv/templates/netmaster.service +++ b/roles/contiv/templates/netmaster.service @@ -4,7 +4,7 @@ After=auditd.service systemd-user-sessions.service contiv-etcd.service  [Service]  EnvironmentFile=/etc/default/netmaster -ExecStart={{ bin_dir }}/netmaster $NETMASTER_ARGS +ExecStart={{ contiv_bin_dir }}/netmaster $NETMASTER_ARGS  KillMode=control-group  Restart=always  RestartSec=10 diff --git a/roles/contiv/templates/netplugin.j2 b/roles/contiv/templates/netplugin.j2 index a4928cc3d..0fd727401 100644 --- a/roles/contiv/templates/netplugin.j2 +++ b/roles/contiv/templates/netplugin.j2 @@ -1,7 +1,6 @@  {% if contiv_encap_mode == "vlan" %} -NETPLUGIN_ARGS='-vlan-if {{ netplugin_interface }} -ctrl-ip {{ netplugin_ctrl_ip }} -plugin-mode kubernetes -cluster-store etcd://{{ etcd_url }}' +NETPLUGIN_ARGS='--vlan-if={{ contiv_netplugin_interface }} --ctrl-ip={{ contiv_netplugin_ctrl_ip }} --etcd={{ contiv_etcd_url }} --fwdmode={{ contiv_netplugin_fwd_mode }} --cluster-mode=kubernetes --netmode={{ contiv_encap_mode }}'  {% endif %}  {% if contiv_encap_mode == "vxlan" %} -NETPLUGIN_ARGS='-vtep-ip {{ netplugin_ctrl_ip }} -ctrl-ip {{ netplugin_ctrl_ip }} -plugin-mode kubernetes -cluster-store etcd://{{ etcd_url }}' +NETPLUGIN_ARGS='--vtep-ip={{ contiv_netplugin_ctrl_ip }} --vxlan-port={{ contiv_vxlan_port }} --ctrl-ip={{ contiv_netplugin_ctrl_ip }} --etcd={{ contiv_etcd_url }} --fwdmode={{ contiv_netplugin_fwd_mode }} --cluster-mode=kubernetes --netmode={{ contiv_encap_mode }}'  {% endif %} - diff --git a/roles/contiv/templates/netplugin.service b/roles/contiv/templates/netplugin.service index 6358d89ec..2e1ca1bdf 100644 --- a/roles/contiv/templates/netplugin.service +++ b/roles/contiv/templates/netplugin.service @@ -4,7 +4,7 @@ After=auditd.service systemd-user-sessions.service contiv-etcd.service  [Service]  EnvironmentFile=/etc/default/netplugin -ExecStart={{ bin_dir }}/netplugin $NETPLUGIN_ARGS +ExecStart={{ contiv_bin_dir }}/netplugin $NETPLUGIN_ARGS  KillMode=control-group  Restart=always  RestartSec=10  | 
