之前用delegate_to将特殊任务委派给指定节点上运行,该方式只能将任务委派给一个节点。那如何委派给一个group组呢?
delegate_to delegate_to默认读取的主机清单中的facts,而不是自身被委派的主机facts,所以我们的委派任务被运行多少次取决于主机清单中的主机数量,此时若要限制只执行一次,则需要用run_once: true配合。使用该方式最终委派给一台节点运行任务,如果我要委派给一组服务器,则需要设置delegate_facts: true
主机清单样例
1 2 3 4 5 6 7 8 9 10 [root@manager project-backup]# cat hosts [web] 10.100.235.224 10.100.235.245 10.100.235.199 10.100.235.194 [lb] 10.100.235.195 10.100.235.202
第一种情况 剧本任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@manager project-backup]# cat test-bk.yaml --- - name: backup web project hosts: web tasks: - name: debug 1 debug: msg: "{{ inventory_hostname }}" - name: debug 2 debug: msg: "{{ inventory_hostname }}" delegate_facts: True delegate_to: "{{ item }}" with_items: "{{ groups['lb'] }}"
任务运行输出如下
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 44 45 46 47 48 49 50 51 52 53 54 55 [root@manager project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.245] ok: [10.100.235.224] ok: [10.100.235.194] ok: [10.100.235.199] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.224" } ok: [10.100.235.224 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.224" } ok: [10.100.235.245 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.245" } ok: [10.100.235.245 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.245" } ok: [10.100.235.199 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.199" } ok: [10.100.235.199 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.199" } ok: [10.100.235.194 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.194" } ok: [10.100.235.194 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.194" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
从上面输出可以看出每个web组内的任务都被委派给两台lb上处理,总共8次(web组节点数*lb组节点数)
第二种情况 如果给这个任务加上run_once: True呢,会是什么情况?
此时剧本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@manager project-backup]# cat test-bk.yaml --- - name: backup web project hosts: web tasks: - name: debug 1 debug: msg: "{{ inventory_hostname }}" - name: debug 2 debug: msg: "{{ inventory_hostname }}" delegate_facts: True delegate_to: "{{ item }}" with_items: "{{ groups['lb'] }}" run_once: True
任务运行输出如下
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 [root@manager project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.194] ok: [10.100.235.245] ok: [10.100.235.224] ok: [10.100.235.199] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.224" } ok: [10.100.235.224 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.224" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
从上面输出可以看到该任务有两次输出,该任务只被一个web组节点同时委派给lb组中的两个节点中运行
第三种情况 此时再试想一下,可不可以委派给一个组的同时,限制只需要委派组中的任意一个运行即可?其实这种方式直接委托给组中的一个主机即可,但是博主的这个委托组地址会变,不想写死也不想总是修改。。。。最后博主在官方文档上看到了一个with_random_choice功能,该功能返回列表中的随机一个
此时剧本任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@manager project-backup]# cat test-bk.yaml --- - name: backup web project hosts: web tasks: - name: debug 1 debug: msg: "{{ inventory_hostname }}" - name: debug 2 debug: msg: "{{ inventory_hostname }}" delegate_facts: True delegate_to: "{{ item }}" with_random_choice: "{{ groups['lb'] }}"
任务运行输出如下
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [root@manager project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.245] ok: [10.100.235.194] ok: [10.100.235.199] ok: [10.100.235.224] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.224" } ok: [10.100.235.245 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.245" } ok: [10.100.235.199 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.199" } ok: [10.100.235.194 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.194" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@k8s-master project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.194] ok: [10.100.235.199] ok: [10.100.235.224] ok: [10.100.235.245] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.224" } ok: [10.100.235.245 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.245" } ok: [10.100.235.199 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.199" } ok: [10.100.235.194 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.194" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
从上面输出可以看到web组中的4个节点任务被委派给lb组任意一个处理,总共就4次
第四种情况 此时加上run_once: True呢?结论就是只有一个web组节点任务执行,且被委派给任意一个lb组节点,最终输出一条执行记录
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [root@manager project-backup]# cat test-bk.yaml --- - name: backup web project hosts: web tasks: - name: debug 1 debug: msg: "{{ inventory_hostname }}" - name: debug 2 debug: msg: "{{ inventory_hostname }}" delegate_facts: True delegate_to: "{{ item }}" with_random_choice: "{{ groups['lb'] }}" run_once: True [root@manager project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.224] ok: [10.100.235.245] ok: [10.100.235.199] ok: [10.100.235.194] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.202] => (item=10.100.235.202) => { "msg": "10.100.235.224" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@k8s-master project-backup]# [root@k8s-master project-backup]# ansible-playbook -i hosts test-bk.yaml PLAY [backup web project] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [10.100.235.199] ok: [10.100.235.194] ok: [10.100.235.224] ok: [10.100.235.245] TASK [debug 1] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224] => { "msg": "10.100.235.224" } ok: [10.100.235.245] => { "msg": "10.100.235.245" } ok: [10.100.235.199] => { "msg": "10.100.235.199" } ok: [10.100.235.194] => { "msg": "10.100.235.194" } TASK [debug 2] ******************************************************************************************************************************************************************************************************* ok: [10.100.235.224 -> 10.100.235.195] => (item=10.100.235.195) => { "msg": "10.100.235.224" } PLAY RECAP *********************************************************************************************************************************************************************************************************** 10.100.235.194 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.199 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.224 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 10.100.235.245 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
k8s批量扩容节点数量 目前k8s集群的部署有很多工具,此处博主曾尝试使用ansible和kubeadm写了一个集群增加node的操作
在master组任意一个节点获取node join命令
在node中执行上面获取的命令
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 # 主机清单 [root@manager k8s-ms]# cat hosts [master] 192.168.44.151 192.168.44.161 192.168.44.162 [node] 192.168.44.152 192.168.44.153 # playbook [root@manager k8s-ms]# cat test-node-join.yaml --- - name: test join node for k8s hosts: node tasks: - name: get join command shell: kubeadm token create --print-join-command register: join_command delegate_to: "{{ item }}" run_once: true with_random_choice: "{{ groups['master'] }}" - name: out put join_command debug: msg: "{{ join_command.results.0.stdout }}" run_once: true - name: node output join_command debug: msg: "{{ join_command.results.0.stdout }}" - name: node exec join_command shell: "{{ join_command.results.0.stdout }}"
任务运行输出
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 [root@manager k8s-ms]# ansible-playbook -i hosts test-node-join.yaml PLAY [test join node for k8s] **************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************** ok: [192.168.44.153] ok: [192.168.44.152] TASK [get join command] ********************************************************************************************************************************************************************************************** changed: [192.168.44.152 -> 192.168.44.151] => (item=192.168.44.151) TASK [out put join_command] ****************************************************************************************************************************************************************************************** ok: [192.168.44.152] => { "msg": "kubeadm join apiserver.demo:6443 --token q6m90h.bciz8cfqpp6ppzu2 --discovery-token-ca-cert-hash sha256:94d16a5811ec81c8bf3c74d1afabfac2400d6b9ea653f9e5aad7a451a0de675c " } TASK [node output join_command] ************************************************************************************************************************************************************************************** ok: [192.168.44.152] => { "msg": "kubeadm join apiserver.demo:6443 --token q6m90h.bciz8cfqpp6ppzu2 --discovery-token-ca-cert-hash sha256:94d16a5811ec81c8bf3c74d1afabfac2400d6b9ea653f9e5aad7a451a0de675c " } ok: [192.168.44.153] => { "msg": "kubeadm join apiserver.demo:6443 --token q6m90h.bciz8cfqpp6ppzu2 --discovery-token-ca-cert-hash sha256:94d16a5811ec81c8bf3c74d1afabfac2400d6b9ea653f9e5aad7a451a0de675c " } TASK [node exec join_command] **************************************************************************************************************************************************************************************** changed: [192.168.44.152] changed: [192.168.44.153] PLAY RECAP *********************************************************************************************************************************************************************************************************** 192.168.44.152 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.44.153 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
此时查看集群节点
1 2 3 4 5 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready compute,master 50d v1.16.0 k8s-node-01 Ready <none> 32s v1.16.0 k8s-node-02 Ready <none> 31s v1.16.0
最后优化下shell任务的幂等性
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 [root@manager k8s-ms]# cat test-node-join.yaml --- - name: test join node for k8s hosts: node tasks: - name: get join command shell: kubeadm token create --print-join-command register: join_command delegate_to: "{{ item }}" run_once: true with_random_choice: "{{ groups['master'] }}" - name: out put join_command debug: msg: "{{ join_command.results.0.stdout }}" run_once: true - name: node output join_command debug: msg: "{{ join_command.results.0.stdout }}" - name: node exec join_command shell: "{{ join_command.results.0.stdout }}" && touch /tmp/node-joinlog.txt args: creates: /tmp/node-joinlog.txt
参考文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/random_choice_lookup.html#ansible-collections-ansible-builtin-random-choice-lookup