之前写过一篇手动搭建etcd 3.1集群的文章《etcd 3.1 高可用集群搭建》,最近要初始化一套新的环境,考虑用ansible自动化部署整套环境, 先从部署etcd 3.2集群开始。

需要部署etcd的主机信息如下:

  1. node1 192.168.61.11
  2. node2 192.168.61.12
  3. node3 192.168.61.13

配置管理项目目录结构

  1. ├── inventories
  2.    ├── staging
  3.       ├── group_vars
  4.          ├── all.yml
  5.          └── etcd-nodes.yml
  6.       ├── host_vars
  7.          ├── node1.yml
  8.          ├── node2.yml
  9.          └── node3.yml
  10.       └── hosts
  11.    └── production
  12. ├── roles
  13.    ├── common
  14.       ├── defaults
  15.          └── main.yml
  16.       └── tasks
  17.       └── main.yml
  18.    ├── etcd3
  19.       ├── defaults
  20.          └── main.yml
  21.       ├── files
  22.          └── make-ca-cert.sh
  23.       ├── meta
  24.          └── main.yml
  25.       ├── tasks
  26.          ├── create_etcd_user.yml
  27.          ├── etcd-restart.yml
  28.          ├── etcd-start.yml
  29.          ├── etcd-stop.yml
  30.          ├── gen-etcd-certs.yml
  31.          ├── gen-etcd-systemd.yml
  32.          ├── install_etcd_bin.yml
  33.          └── main.yml
  34.       └── templates
  35.       ├── etcd.conf.j2
  36.       └── etcd.service.j2
  37. ├── deploy-etcd3.yml

roles/etcd3/defaults/main.yml:

  1. ---
  2. etcd_version: 3.2.0
  3. etcd_download_url_base: "https://github.com/coreos/etcd/releases/download/v{{ etcd_version }}"
  4. etcd_release: "etcd-v{{ etcd_version }}-linux-amd64"
  5. etcd_download_url: "{{ etcd_download_url_base }}/{{ etcd_release}}.tar.gz"
  6. etcd_bin_path: /usr/bin
  7. etcd_data_dir: /var/lib/etcd
  8. etcd_conf_dir: /etc/etcd
  9. etcd_certs_dir: "{{ etcd_conf_dir }}/ssl"
  10. etcd_cert_group: root
  11. etcd_ca_file: "{{ etcd_certs_dir }}/ca.crt"
  12. etcd_cert_file: "{{ etcd_certs_dir }}/server.crt"
  13. etcd_key_file: "{{ etcd_certs_dir }}/server.key"
  14. etcd_peer_ca_file: "{{ etcd_certs_dir }}/ca.crt"
  15. etcd_peer_cert_file: "{{ etcd_certs_dir }}/peer.crt"
  16. etcd_peer_key_file: "{{ etcd_certs_dir }}/peer.key"
  17. etcd_client_cert_file: "{{ etcd_certs_dir }}/client.crt"
  18. etcd_client_key_file: "{{ etcd_certs_dir }}/client.key"
  19. etcd_client_cert_auth: true
  20. etcd_peer_client_cert_auth: true
  21. etcd_client_port: 2379
  22. etcd_peer_port: 2380
  23. etcd_initial_cluster_state: new
  24. etcd_initial_cluster_token: etcd-k8s-cluster
  25. etcd_initial_advertise_peer_urls: "https://{{ etcd_machine_address }}:{{ etcd_peer_port }}"
  26. etcd_listen_peer_urls: "https://{{ etcd_machine_address }}:{{ etcd_peer_port }}"
  27. etcd_advertise_client_urls: "https://{{ etcd_machine_address }}:{{ etcd_client_port }}"
  28. etcd_listen_client_urls: "https://{{ etcd_machine_address }}:2379,https://127.0.0.1:2379"

创建etcd用户和数据目录

创建etcd用户、用户组和数据目录。

  1. - name: create system etcd group
  2. group:
  3. name: etcd
  4. state: present
  5. - name: create system etcd user
  6. user:
  7. name: etcd
  8. comment: "etcd user"
  9. shell: /sbin/nologin
  10. state: present
  11. system: yes
  12. home: "{{ etcd_data_dir }}"
  13. groups: etcd
  14. - name: ensure etcd_data_dir exists
  15. file:
  16. path: "{{ etcd_data_dir }}"
  17. recurse: yes
  18. state: directory
  19. owner: etcd
  20. group: etcd

下载和解压etcd

下载和解压缩etcd release tar包,并将可执行文件etcd, etcdctl拷贝到/usr/bin。

  1. ---
  2. - name: set github s3 host on the first etcd server
  3. lineinfile:
  4. dest: /etc/hosts
  5. regexp: '.*github-production-release-asset-2e65be\.s3\.amazonaws\.com$'
  6. line: "219.76.4.4 github-production-release-asset-2e65be.s3.amazonaws.com"
  7. state: present
  8. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  9. run_once: true
  10. - name: check whether etcd release tar extracted on the first etcd server
  11. stat:
  12. path: "{{ ansible_temp_dir }}/{{ etcd_release }}"
  13. register: etcd_release_tar_check
  14. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  15. run_once: true
  16. - name: download etcd release tar file on first the etcd server
  17. get_url:
  18. url: "{{ etcd_download_url }}"
  19. dest: "{{ ansible_temp_dir }}"
  20. validate_certs: no
  21. timeout: 20
  22. register: download_etcd
  23. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  24. run_once: true
  25. when: not etcd_release_tar_check.stat.exists
  26. - name: extract etcd tar file
  27. unarchive:
  28. src: "{{ download_etcd.dest }}"
  29. dest: "{{ ansible_temp_dir }}"
  30. remote_src: yes
  31. run_once: true
  32. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  33. when: not etcd_release_tar_check.stat.exists
  34. - name: fetch etcd bins from the first etcd server
  35. fetch:
  36. src: "{{ ansible_temp_dir }}/{{ etcd_release }}/{{ item }}"
  37. dest: "tmp/etcd3/{{ item }}"
  38. flat: yes
  39. register: fetch_etcd
  40. run_once: true
  41. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  42. with_items:
  43. - etcd
  44. - etcdctl
  45. - name: copy etcd binary
  46. copy:
  47. src: "tmp/etcd3/{{ item }}"
  48. dest: "{{ etcd_bin_path }}"
  49. owner: etcd
  50. group: etcd
  51. mode: 0750
  52. with_items:
  53. - etcd
  54. - etcdctl

生成并分发etcd TLS证书

  1. ---
  2. - name: ensure etcd certs directory
  3. file:
  4. path: "{{ etcd_certs_dir }}"
  5. state: directory
  6. owner: etcd
  7. group: etcd
  8. mode: 0750
  9. recurse: yes
  10. - name: copy make-ca-cert.sh
  11. copy:
  12. src: make-ca-cert.sh
  13. dest: "{{ etcd_certs_dir }}"
  14. owner: root
  15. group: root
  16. mode: "0500"
  17. run_once: true
  18. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  19. - name: gen certs on the first etcd server
  20. command:
  21. "{{ etcd_certs_dir }}/make-ca-cert.sh"
  22. args:
  23. creates: "{{ etcd_certs_dir }}/server.crt"
  24. run_once: true
  25. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  26. environment:
  27. NODE_IPS: "{% for host in groups['etcd-nodes'] %}{{ hostvars[host]['etcd_machine_address'] }}{% if not loop.last %},{% endif %}{% endfor %}"
  28. NODE_DNS: "{{ groups['etcd-nodes']|join(',') }}"
  29. CERT_DIR: "{{ etcd_certs_dir }}"
  30. CERT_GROUP: "{{ etcd_cert_group }}"
  31. - name: slurp etcd certs
  32. slurp:
  33. src: "{{ item }}"
  34. register: pki_certs
  35. run_once: true
  36. delegate_to: "{{ groups['etcd-nodes'][0] }}"
  37. with_items:
  38. - "{{ etcd_ca_file }}"
  39. - "{{ etcd_cert_file }}"
  40. - "{{ etcd_key_file }}"
  41. - "{{ etcd_peer_ca_file }}"
  42. - "{{ etcd_peer_cert_file }}"
  43. - "{{ etcd_peer_key_file }}"
  44. - "{{ etcd_client_cert_file }}"
  45. - "{{ etcd_client_key_file }}"
  46. - name: copy etcd certs to other etcd servers
  47. copy:
  48. dest: "{{ item.item }}"
  49. content: "{{ item.content | b64decode }}"
  50. owner: etcd
  51. group: "{{ etcd_cert_group }}"
  52. mode: 0400
  53. with_items: "{{ pki_certs.results }}"
  54. when: inventory_hostname != groups['etcd-nodes'][0]

systemd和配置

  1. ---
  2. - name: create etcd systemd unit file
  3. template:
  4. src: etcd.service.j2
  5. dest: /etc/systemd/system/etcd.service
  6. - name: create etcd env conf
  7. template:
  8. src: etcd.conf.j2
  9. dest: /etc/etcd/etcd.conf
  10. owner: etcd
  11. group: etcd
  12. mode: 0540

启动etcd

  1. ---
  2. - name: start etcd
  3. systemd:
  4. name: etcd
  5. daemon_reload: yes
  6. state: started
  7. enabled: yes
  8. - name: restart etcd
  9. systemd:
  10. name: etcd
  11. state: restarted

查看集群状态

检查集群是否健康,在任一节点执行:

  1. etcdctl \
  2. --ca-file=/etc/etcd/ssl/ca.crt \
  3. --cert-file=/etc/etcd/ssl/client.crt \
  4. --key-file=/etc/etcd/ssl/client.key \
  5. --endpoints=https://node1:2379,https://node2:2379,https://node3:2379 \
  6. cluster-health
  7. member 1e3da2bf674fd07 is healthy: got healthy result from https://192.168.61.11:2379
  8. member 88548a72a2e9a749 is healthy: got healthy result from https://192.168.61.13:2379
  9. member c3bda13bf78ed2ab is healthy: got healthy result from https://192.168.61.12:2379
  10. cluster is healthy
  1. etcdctl \
  2. --ca-file=/etc/etcd/ssl/ca.crt \
  3. --cert-file=/etc/etcd/ssl/client.crt \
  4. --key-file=/etc/etcd/ssl/client.key \
  5. --endpoints=https://node1:2379,https://node2:2379,https://node3:2379 \
  6. member list
  7. 1e3da2bf674fd07: name=node1 peerURLs=https://192.168.61.11:2380 clientURLs=https://192.168.61.11:2379 isLeader=false
  8. 88548a72a2e9a749: name=node3 peerURLs=https://192.168.61.13:2380 clientURLs=https://192.168.61.13:2379 isLeader=false
  9. c3bda13bf78ed2ab: name=node2 peerURLs=https://192.168.61.12:2380 clientURLs=https://192.168.61.12:2379 isLeader=true
标题:使用Ansible部署etcd 3.2高可用集群
本文链接:http://blog.frognew.com/2017/06/using-ansible-deploy-etcd-cluster.html
转载请注明出处。
 
©2012-2017, frognew , 总访问量44209次 , 访客15227人

使用Ansible部署etcd 3.2高可用集群的更多相关文章

  1. [转帖]Breeze部署kubernetes1.13.2高可用集群

    Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernet ...

  2. 部署kubernetes1.8.3高可用集群

    Kubernetes作为容器应用的管理平台,通过对pod的运行状态进行监控,并且根据主机或容器失效的状态将新的pod调度到其他node上,实现了应用层的高可用. 针对kubernetes集群,高可用性 ...

  3. 七台机器部署Hadoop2.6.5高可用集群

    1.HA架构注意事项 两个Namenode节点在某个时间只能有一个节点正常响应客户端请求,响应请求的节点状态必须是active standby状态要能够快速无缝切换成active状态,两个NN节点必须 ...

  4. centos7下部署mariadb+galera数据库高可用集群

    [root@node1 ~]# cat /etc/yum.repos.d/mariadb.repo # MariaDB 10.1 CentOS repository list - created 20 ...

  5. kubeadm使用外部etcd部署kubernetes v1.17.3 高可用集群

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483891&idx=1&sn=17dcd7cd ...

  6. kubeadm 使用 Calico CNI 以及外部 etcd 部署 kubernetes v1.23.1 高可用集群

    文章转载自:https://mp.weixin.qq.com/s/2sWHt6SeCf7GGam0LJEkkA 一.环境准备 使用服务器 Centos 8.4 镜像,默认操作系统版本 4.18.0-3 ...

  7. ProxySQL Cluster 高可用集群环境部署记录

    ProxySQL在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并不能共通,在主实例上配置后,仍需要在备用节点上进行配置,对管理来说非常不方便.但是Proxy ...

  8. 使用开源Breeze工具部署Kubernetes 1.12.1高可用集群

    Breeze项目是深圳睿云智合所开源的Kubernetes图形化部署工具,大大简化了Kubernetes部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取Google的相应资源包,尤其适 ...

  9. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

随机推荐

  1. SQL的三种连接方式内连接、左连接、外连接

    1.内连接 select * from table_a x inner join table_b y on x.a_id = y.b_id 返回两个表关键字x.a_id = y.b_id的交集数据集 ...

  2. hive的安装,一般不容易察觉的hdfs的配置问题导致hive安装的失败

    在安装hive的过程中,一般需要的准备环境就是hadoop集群的正常启动,要装有mysql,zookeeper. 具体怎么安装配置我在这里不多说,安装教程网上有挺多的. 我这里说下我遇到的问题,首先从 ...

  3. POI实现EXCEL单元格合并及边框样式

    POI实现EXCEL单元格合并及边框样式     下面例子为创建产生一个excel,合并单元格,然后为合并后的单元格添加边框 package test; import java.io.FileOutp ...

  4. a标签解析url

    var url = 'http://127.0.0.1:8080/index.jsp?username=admin#name'; var aLink = document.createElement( ...

  5. Spring MVC 学习笔记3 - 利用Default Annotation 模式获取请求,使Controller与View对应,并传值。

    1. WEB-INF/web.xml 这里定义了获取请求后,执行的第一步.抓取请求. <servlet> <servlet-name>appServlet</servle ...

  6. 温故而知新-mysql的一些语法show,describe,explain,fulltext

    1 show show tables; 显示数据库的所有表 show databases; 显示所有数据库 show columns from table; 显示表的所有列 show grants f ...

  7. VBA 操作 VBE

    Introduction You can write code in VBA that reads or modifies other VBA projects, modules, or proced ...

  8. 在mfc中picture控件中显示Mat图片<转>

    void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...

  9. ABAP-HTTP发送JSON

    1. HTTP发送JSON格式数据: function zap_01_url_sap_to_c3 . *"------------------------------------------ ...

  10. C# 通用方法

    一. /// <summary> /// 删除字符串中的中文 /// </summary> public static string Delete(string str) { ...