上一篇進行了手動安裝etcd集羣,此篇利用自動化工具ansible爲三個節點構建etcd集羣node
環境:ide
master:192.168.101.14,node1:192.168.101.15,node2:192.168.101.19工具
一、首先查看該role(etcd集羣)的目錄樹結構:url
[root@master ansible]# tree
.
├── ansible.cfg
├── hosts
├── roles
│ └── etcd
│ ├── files
│ │ ├── etcd
│ │ └── etcdctl
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ │ └── etcd.service.j2
│ └── vars
└── work_dir
├── install_etcd_cluster.retry
└── install_etcd_cluster.yaml
首先在hosts文件中定義節點:spa
[root@master ansible]# egrep -v "^#|^$" hosts [etcd_cluster] 192.168.101.14 192.168.101.15 192.168.101.19
在roles目錄下面建立了etcd這個角色,角色目錄下面爲個節點提供了命令文件etcd、etcdctl,而後查看tasks下面的main.yaml:rest
[root@master ansible]# cat roles/etcd/tasks/main.yaml - name: copy etcd to nodes copy: src: ../files/etcd dest: /usr/local/bin/etcd mode: 0750 - name: copy etcdctl to nodes copy: src: ../files/etcdctl dest: /usr/local/bin/etcdctl mode: 0750 - name: create data directory for etcd file: path: /var/lib/etcd state: directory - name: provide etcd.service to nodes template: src: etcd.service.j2 dest: /usr/lib/systemd/system/etcd.service register: result - name: start etcd service systemd: daemon_reload: true name: etcd state: started enabled: true when: result|success
前面三個任務是copy命令文件到各節點,和在各節點上建立數據目錄,在下面的任務中定義了template,首先查看template下面的j2文件:code
[root@master ansible]# cat roles/etcd/templates/etcd.service.j2 [Unit] Description=etcd server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/local/bin/etcd --name {{ ansible_hostname }} --initial-advertise-peer-urls http://{{ ansible_ens33.ipv4.address }}:2380 --listen-peer-urls http://{{ ansible_ens33.ipv4.address }}:2380 --listen-client-urls http://{{ ansible_ens33.ipv4.address }}:2379,http://127.0.0.1:2379 --advertise-client-urls http://{{ ansible_ens33.ipv4.address }}:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster master=http://192.168.101.14:2380,node1=http://192.168.101.15:2380,node2=http://192.168.101.19:2380 --initial-cluster-state new --data-dir=/var/lib/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
能夠看見上面的j2文件裏面運用了變量{{ ansible_hostname }}和{{ ansible_ens33.ipv4.address }},這兩個變量能夠根據模塊setup進行得到(獲取各節點的hostname和ip地址)server
在運用了template模板下面,在j2文件中定義了變量,因而ansible將該j2文件分發給各節點上,而後各節點根據本身的hostname和ip進行相應修改,因而建立的配置文件與本身的hostname和ip是一一對應的blog
在配置文件中使用變量能夠使用template模塊,建立對應的j2文件token
[root@master ansible]# cat work_dir/install_etcd_cluster.yaml - hosts: etcd_cluster remote_user: root roles: - etcd
[root@master ansible]# ansible-playbook work_dir/install_etcd_cluster.yaml PLAY [etcd_cluster] *********************************************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************************************************** ok: [192.168.101.19] ok: [192.168.101.14] ok: [192.168.101.15] TASK [etcd : copy etcd to nodes] ********************************************************************************************************************* ok: [192.168.101.15] ok: [192.168.101.19] ok: [192.168.101.14] TASK [etcd : copy etcdctl to nodes] ******************************************************************************************************************* ok: [192.168.101.15] ok: [192.168.101.19] ok: [192.168.101.14] TASK [etcd : create data directory for etcd] ********************************************************************************************************** ok: [192.168.101.15] ok: [192.168.101.19] ok: [192.168.101.14] TASK [etcd : provide etcd.service to nodes] *********************************************************************************************************** ok: [192.168.101.19] ok: [192.168.101.15] ok: [192.168.101.14] TASK [etcd : start etcd service] ********************************************************************************************************************** changed: [192.168.101.15] changed: [192.168.101.19] changed: [192.168.101.14] PLAY RECAP ******************************************************************************************************************************************** 192.168.101.14 : ok=6 changed=1 unreachable=0 failed=0 192.168.101.15 : ok=6 changed=1 unreachable=0 failed=0 192.168.101.19 : ok=6 changed=1 unreachable=0 failed=0
執行完成後,在任意節點上查看member列表:
[root@master ~]# etcdctl member list 192d36c71643c39d: name=node2 peerURLs=http://192.168.101.19:2380 clientURLs=http://192.168.101.19:2379 isLeader=false 5f3835545a5f41e4: name=master peerURLs=http://192.168.101.14:2380 clientURLs=http://192.168.101.14:2379 isLeader=false 77c1ac60c5100363: name=node1 peerURLs=http://192.168.101.15:2380 clientURLs=http://192.168.101.15:2379 isLeader=true
驗證集羣的監控狀態:
[root@master ~]# etcdctl cluster-health member 192d36c71643c39d is healthy: got healthy result from http://192.168.101.19:2379 member 5f3835545a5f41e4 is healthy: got healthy result from http://192.168.101.14:2379 member 77c1ac60c5100363 is healthy: got healthy result from http://192.168.101.15:2379 cluster is healthy
因而etcd集羣基於ansible的無TSL認證的搭建成功完成
附上當配置文件change以後觸發handler:
[root@master ansible]# cat roles/etcd/handlers/main.yaml - name: restart etcd systemd: name: etcd state: restarted
[root@master ansible]# cat roles/etcd/tasks/main.yaml - name: copy etcd to nodes copy: src: ../files/etcd dest: /usr/local/bin/etcd mode: 0750 - name: copy etcdctl to nodes copy: src: ../files/etcdctl dest: /usr/local/bin/etcdctl mode: 0750 - name: create data directory for etcd file: path: /var/lib/etcd state: directory - name: provide etcd.service to nodes template: src: etcd.service.j2 dest: /usr/lib/systemd/system/etcd.service register: result - name: start etcd service systemd: daemon_reload: true name: etcd state: started enabled: true when: result|success - name: provide configfile changed to etcd template: src: etcd.service_https_auto.j2 dest: /usr/lib/systemd/system/etcd.service notify: restart etcd
改變後的配置文件:
[root@master ansible]# cat roles/etcd/templates/etcd.service_https_auto.j2 [Unit] Description=etcd server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/local/bin/etcd --name {{ ansible_hostname }} --auto-tls --peer-auto-tls --initial-advertise-peer-urls https://{{ ansible_ens33.ipv4.address }}:2380 --listen-peer-urls https://{{ ansible_ens33.ipv4.address }}:2380 --listen-client-urls https://{{ ansible_ens33.ipv4.address }}:2379,https://127.0.0.1:2379 --advertise-client-urls https://{{ ansible_ens33.ipv4.address }}:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster master=https://192.168.101.14:2380,node1=https://192.168.101.15:2380,node2=https://192.168.101.19:2380 --initial-cluster-state new --data-dir=/var/lib/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target