前言:ansible中的playbook是一个优秀的功能,能够实现不同的批量管理需求,刚完成了一个剧本搭建k8s集群的任务,记录下注意点与小技巧。
使用模块:
yum、lineinlife、shell、service,yum完成服务组件的安装,lineinlife完成配置文件的修改,shell完成集群搭建的配置,service对服务实现有序管理。
其中需要注意的要点:
shell模块同样可以实现配置文件的修改,不过需要注意的是,lineinlife能够更智能的实现,如使用不同的字段在修改之前备份或者在文件不存在时创建等,还可以在不符合查询条件的情况下终止操作,避免配置文件的出错。
内容如下:
- hosts: master
remote_user: root
tasks:
- name: install k8s master
yum: name=etcd,kubernetes-master state=latest
- name: update conf file
lineinfile:
dest: /etc/etcd/etcd.conf
regexp: '^ETCD_LISTEN_CLIENT_URLS='
line: 'ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/apiserver
regexp: '^KUBE_API_ADDRESS='
line: 'KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/apiserver
regexp: '^# KUBE_API_PORT='
line: 'KUBE_API_PORT="--port=8080"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/apiserver
regexp: '^# KUBELET_PORT='
line: 'KUBELET_PORT="--kubelet-port=10250"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/apiserver
regexp: '^KUBE_ADMISSION_CONTROL='
line: 'KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"'
- name: enable and start etcd
service: name=etcd state=started enabled=yes
- name: enable and start kube-apiserver
service: name=kube-apiserver state=started enabled=yes
- name: enable and start kube-controller-manager
service: name=kube-controller-manager state=started enabled=yes
- name: enable and start kube-scheduler
service: name=kube-scheduler state=started enabled=yes
- name: create etcd network
shell: etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
- hosts: node
vars:
IP: "{{ ansible_ens33['ipv4']['address'] }}"
remote_user: root
tasks:
- name: install k8s node
yum: name=flannel,kubernetes-node state=latest
- name: update conf file
lineinfile:
dest: /etc/sysconfig/flanneld
regexp: '^FLANNEL_ETCD_ENDPOINTS='
line: 'FLANNEL_ETCD_ENDPOINTS="http://192.168.92.145:2379"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/config
regexp: '^KUBE_MASTER='
line: 'KUBE_MASTER="--master=http://192.168.92.145:8080"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/kubelet
regexp: '^KUBELET_ADDRESS='
line: 'KUBELET_ADDRESS="--address=0.0.0.0"'
- name: update conf file
lineinfile:
- name: update conf file
lineinfile:
dest: /etc/kubernetes/kubelet
regexp: '^# KUBELET_PORT='
line: 'KUBELET_PORT="--port=10250"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/kubelet
regexp: '^KUBELET_API_SERVER='
line: 'KUBELET_API_SERVER="--api-servers=http://{{IP}}:8080"'
- name: update conf file
lineinfile:
dest: /etc/kubernetes/kubelet
regexp: '^KUBELET_API_SERVER='
line: 'KUBELET_API_SERVER="--api-servers=http://192.168.92.145:8080"'
- name: enable and start kube-proxy
service: name=kube-proxy state=started enabled=yes
- name: enable and start kubelet
service: name=kubelet state=started enabled=yes
- name: enable and start docker
service: name=docker state=started enabled=yes
- name: enable and start flanneld
service: name=flanneld state=started enabled=yes
值得再学习的一个小技巧就是,playbook功能中变量的定义及引用:如上文代码中所示的红色部分就是变量的定义,只不过"{{ ansible_ens33['ipv4']['address'] }}"是代表本地IP的特殊代码而已。
在playbook完成之后,首先需要做的就是
(1)检查语法:
ansible-playbook --syntax-check /path/to/playbook.yaml
这一步会检测你的yaml文件的定义是否有问题,当然,只代表yaml文件的格式是否正确。
(2)测试运行:
ansible-playbook -C /path/to/playbook.yaml
这一步会在主机上测试执行playbook,如果有问题,说明playbook的逻辑,或者主机上的条件不足以执行playbook中的tasks。
(3) 运行
ansible-playbook /path/to/playbook.yaml
这一步才是真正在主机上执行playbook,不过需要注意的是,有的时候测试运行时没有报错,而正式运行时却发生了问题,这就要根据报错信息来处理了。
结语:
总的来说playbook还是非常的方便的,在运维工作日趋自动化的今天,是一个很方便的工具。