今天在整理ansible安装k3s时,遇到了个问题,想法是在安装过程中对node能打多个label, 如:
定义hosts.ini
1 2 3 |
[k3s_nodes] 172.20.47.254 k3s_control_node=true nodeRole=ingress,node ansible_ssh_user=root ansible_ssh_port=22 172.20.47.201 nodeRole=node ansible_ssh_user=root ansible_ssh_port=22 |
其中k3s.service.j2模块中的定义如下:
1 2 3 4 5 6 7 |
{% if k3s_node_labels is defined and k3s_node_labels is iterable %} {% for label in k3s_node_labels %} {% for key, value in label.items() %} --node-label {{ key }}={{ value }} {% endfor %} {% endfor %} {% endif %} |
而生成的k3s.service应是这个结果:
1 2 3 4 5 |
ExecStart=/usr/local/bin/k3s server \ --disable-network-policy --flannel-backend none --cluster-cidr 10.42.0.0/16 --service-cidr 10.43.0.0/16 \ --no-deploy traefik --docker --node-name 172.20.47.254 \ --node-label node.kubernetes.io/ingress= \ --node-label node.kubernetes.io/node= |
可以看到, 应该给node打两个label,
经反复尝试,终于生成了, 下面是我的k3s.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
- hosts: k3s_nodes vars: #k3s_control_node_address: 172.20.47.250 # k3s_datastore_endpoint: "mysql://root:mypass@tcp(172.20.47.38:3306)/k3sdb" k3s_cluster_cidr: 10.42.0.0/16 k3s_service_cidr: 10.43.0.0/16 k3s_use_docker: true k3s_no_flannel: true k3s_no_traefik: true # k3s_control_node_address: "k8s.apiserver.io" ingress_http_port: 8000 ingress_https_port: 4443 # if set k3s_disable_network_policy=false, # it will show error: User "system:k3s-controller" cannot get resource "nodes" in API group "" at the cluster scope # refer to: https://github.com/rancher/k3s/issues/1792 k3s_disable_network_policy: true k3s_server_manifests_templates: - "manifests/calico.yaml.j2" - "manifests/coredns.yaml.j2" - "manifests/local-storage.yaml.j2" - "manifests/metrics-server-deployment.yaml.j2" - "manifests/nginx-ingress.yaml.j2" - "manifests/kuboard.yaml.j2" - "manifests/cert-manager-no-webhook.yaml.j2" pre_tasks: - name: Set k3s_node_name set_fact: k3s_node_name: "{{ inventory_hostname }}" - name: Set node labels set_fact: # k3s_node_labels: "{{ k3s_node_labels|default([]) | combine({'node.kubernetes.io/'+item: ''}) }}" k3s_node_labels: "{{ k3s_node_labels|default([]) + [{'node.kubernetes.io/'+item: ''}] }}" with_items: - "{{ nodeRole.split(',') }}" when: nodeRole is defined # tasks: # - debug: msg="{{ k3s_node_labels }}" roles: - { role: k3s, k3s_release_version: v1.18.2+k3s1 } |
定义了: k3s_node_labels: “{{ k3s_node_labels|default([]) + [{‘node.kubernetes.io/’+item: ”}] }}”
意思是定义一个列表k3s_node_labels,将with_items中的变量append到列表中, 结果是这样:
1 2 3 4 5 6 7 8 |
[ { "node.kubernetes.io/ingress": "" }, { "node.kubernetes.io/node": "" } ] |
除了用+号, 也可以用union([item])
而如果这样定义的话:
k3s_node_labels: “{{ k3s_node_labels|default([]) | combine({‘node.kubernetes.io/’+item: ”}) }}” 或
k3s_node_labels: “{{ k3s_node_labels|default({}) | combine({‘node.kubernetes.io/’+item: ”}) }}”
都将会这种结果:
1 2 3 4 |
{ "node.kubernetes.io/ingress": "", "node.kubernetes.io/node": "" } |
即将字典扩充, 此做法不符合我的要求
参考了:
https://ttl255.com/ansible-appending-to-lists-and-dictionaries/
0 Comments