經過ansible-playbook,部署Docker Swarm集羣。html
docker安裝目錄: /var/lib/docker docker命令目錄: /usr/bin/docker compose命令目錄: /usr/local/bin/docker-compose weavescope: docker可視化管理工具 scope命令目錄: /usr/local/bin/scope
role | ip | hostname |
---|---|---|
manager/scope | 192.168.1.51 | manager1 |
manager/scope | 192.168.1.52 | manager2 |
worker/scope | 192.168.1.53 | worker1 |
worker/scope | 192.168.1.54 | worker2 |
worker/scope | 192.168.1.55 | worker3 |
worker/scope | 192.168.1.56 | worker4 |
worker/scope | 192.168.1.57 | worker5 |
# vim /etc/ansible/hosts[manager]192.168.1.51 hostname=manager1[add_manager]192.168.1.52 hostname=manager2[add_worker]192.168.1.53 hostname=worker1 192.168.1.54 hostname=worker2 192.168.1.55 hostname=worker3 192.168.1.56 hostname=worker4 192.168.1.57 hostname=worker5
# mkdir -p swarm/roles/{docker_install,init_install,manager_install,worker_install,scope_install}/{files,handlers,meta,tasks,templates,vars}# cd swarm/
說明:node
files:存放須要同步到異地服務器的源碼文件及配置文件; handlers:當資源發生變化時須要進行的操做,若沒有此目錄能夠不建或爲空; meta:存放說明信息、說明角色依賴等信息,可留空; tasks:Docker Swarm 安裝過程當中須要進行執行的任務; templates:用於執行 Docker Swarm 安裝的模板文件,通常爲腳本; vars:本次安裝定義的變量
# tree ..├── roles │ ├── docker_install │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ ├── install.yml │ │ │ ├── main.yml │ │ │ └── prepare.yml │ │ ├── templates │ │ └── vars │ │ └── main.yml │ ├── init_install │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ ├── install.yml │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ ├── manager_install │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ ├── install.yml │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ ├── scope_install │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ ├── install.yml │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ └── worker_install │ ├── files │ ├── handlers │ ├── meta │ ├── tasks │ │ ├── install.yml │ │ └── main.yml │ ├── templates │ └── vars └── swarm.yml 36 directories, 13 files
# vim swarm.yml--- - hosts: all remote_user: root gather_facts: True roles: - docker_install - hosts: manager remote_user: root gather_facts: True roles: - init_install - hosts: add_manager remote_user: root gather_facts: True roles: - manager_install - hosts: add_worker remote_user: root gather_facts: True roles: - worker_install - hosts: all remote_user: root gather_facts: True roles: - scope_install
# vim docker.yml#用於批量安裝Docker- hosts: all remote_user: root gather_facts: True roles: - docker_install
# vim roles/docker_install/vars/main.yml#定義docker安裝中的變量COMPOSE_VER: 1.24.1
# vim roles/docker_install/tasks/prepare.yml
- name: 關閉firewalld service: name=firewalld state=stopped enabled=no - name: 臨時關閉 selinux shell: "setenforce 0" failed_when: false- name: 永久關閉 selinux lineinfile: dest: /etc/selinux/config regexp: "^SELINUX=" line: "SELINUX=disabled"- name: 添加EPEL倉庫 yum: name=epel-release state=latest- name: 安裝經常使用軟件包 yum: name: - vim - lrzsz - net-tools - wget - curl - bash-completion - rsync - gcc - unzip - git state: latest- name: 更新系統 shell: "yum update -y" ignore_errors: yes args: warn: False
# vim roles/docker_install/tasks/install.yml
- name: 建立software目錄 file: name=/software state=directory- name: 更改hostname raw: "echo {{ hostname }} > /etc/hostname"- name: 更改生效 shell: "hostname {{ hostname }}"- name: 下載repo文件 shell: "if [ ! -f /etc/yum.repos.d/docker.repo ]; then curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo; fi"- name: 生成緩存 shell: "yum makecache fast" args: warn: False- name: 安裝docker-ce yum: name: docker-ce state: present- name: 啓動docker並開機啓動 service: name: docker state: started enabled: yes - name: 下載docker-compose shell: "if [ ! -f /usr/local/bin/docker-compose ]; then curl -L https://github.com/docker/compose/releases/download/{{ COMPOSE_VER }}/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose; fi" - name: 給予執行權限 file: name=/usr/local/bin/docker-compose mode=0755 - name: 提升docker pull速度 shell: "curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io" args: warn: False- name: 重啓docker service: name: docker state: restarted
# vim roles/docker_install/tasks/main.yml#引用prepare、install模塊- include: prepare.yml - include: install.yml
# vim init.yml#用於初始化swarm集羣- hosts: manager remote_user: root gather_facts: True roles: - init_install
# vim roles/init_install/tasks/install.yml
- name: manager離開集羣 shell: "docker swarm leave -f" ignore_errors: yes- name: 初始化swarm集羣 shell: "docker swarm init --advertise-addr {{ ansible_ssh_host }}" - name: 獲取manager的token shell: "echo `docker swarm join-token manager |grep docker` > /software/manager.sh" - name: 獲取worker的token shell: "echo `docker swarm join-token worker |grep docker` > /software/worker.sh"- name: 獲取全部ip shell: "echo `ansible all -m setup -a 'filter='ansible_default_ipv4'' |grep 'address' |grep -v 'macaddress' |awk -F '\"' '{print $4}'` > /software/hosts.txt" - name: 拷貝manager.sh shell: "ansible all -m copy -a 'src=/software/manager.sh dest=/software mode=0755'" args: warn: False - name: 拷貝worker.sh shell: "ansible all -m copy -a 'src=/software/worker.sh dest=/software mode=0755'" args: warn: False- name: 拷貝hosts.txt shell: "ansible all -m copy -a 'src=/software/hosts.txt dest=/software'" args: warn: False
# vim roles/init_install/tasks/main.yml#引用install模塊- include: install.yml
# vim manager.yml#用於集羣增長manager- hosts: add_manager remote_user: root gather_facts: True roles: - manager_install
# vim roles/manager_install/tasks/install.yml
- name: manager離開集羣 shell: "docker swarm leave -f" ignore_errors: yes- name: 集羣增長manager script: /software/manager.sh
# vim roles/manager_install/tasks/main.yml#引用install模塊- include: install.yml
# vim worker.yml#用於集羣增長worker- hosts: add_worker remote_user: root gather_facts: True roles: - worker_install
# vim roles/worker_install/tasks/install.yml
- name: worker離開集羣 shell: "docker swarm leave -f" ignore_errors: yes - name: 集羣增長worker script: /software/worker.sh
# vim roles/worker_install/tasks/main.yml#引用install模塊- include: install.yml
# vim scope.yml#用於安裝weavescope- hosts: all remote_user: root gather_facts: True roles: - scope_install
# vim roles/scope_install/tasks/install.yml
- name: 下載scope shell: "if [ ! -f /usr/local/bin/scope ]; then curl -L git.io/scope -o /usr/local/bin/scope; fi" - name: 給予執行權限 file: name=/usr/local/bin/scope mode=0755- name: 中止scope容器 shell: "docker stop weavescope && docker rm weavescope" ignore_errors: yes- name: 啓動scope容器 shell: "hosts=`cat /software/hosts.txt`; scope launch $hosts" register: scope_url- debug: msg="{{ scope_url.stdout }}"
# vim roles/scope_install/tasks/main.yml#引用install模塊- include: install.yml
# ansible-playbook swarm.yml
# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION o6zkxtp0qmvq6r1dxydmprmi4 * manager1 Ready Active Leader 19.03.4 nv1t4p8axfr1zn8k99tegsdhy manager2 Ready Active Reachable 19.03.4 thpss999qnn3e0gun3pi20oy4 worker1 Ready Active 19.03.4 y26tkhebj6u8b7psjnwghcbex worker2 Ready Active 19.03.4 7ygwplwy06sukkhag3kdu022p worker3 Ready Active 19.03.4 hzyd0fz8gx1pld5agjs9afri2 worker4 Ready Active 19.03.4 j2r873fcjqxtbf6p3xjplybee worker5 Ready Active 19.03.4
打開瀏覽器,訪問任一節點的ip:4040
linux
測試安裝沒有問題。已存放至我的gitgub:ansible-playbookgit