106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			YAML
		
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			YAML
		
	
	
	
---
 | 
						|
# Ansible Playbook: 部署 Consul Client 到所有 Nomad 节点
 | 
						|
- name: Deploy Consul Client to Nomad nodes
 | 
						|
  hosts: nomad_clients:nomad_servers
 | 
						|
  become: yes
 | 
						|
  vars:
 | 
						|
    consul_version: "1.21.5"
 | 
						|
    consul_datacenter: "dc1"
 | 
						|
    consul_servers:
 | 
						|
      - "100.117.106.136:8300"  # master (韩国)
 | 
						|
      - "100.122.197.112:8300"  # warden (北京)
 | 
						|
      - "100.116.80.94:8300"    # ash3c (美国)
 | 
						|
    
 | 
						|
  tasks:
 | 
						|
    - name: Update APT cache (忽略 GPG 错误)
 | 
						|
      apt:
 | 
						|
        update_cache: yes
 | 
						|
        force_apt_get: yes
 | 
						|
      ignore_errors: yes
 | 
						|
 | 
						|
    - name: Install consul via APT (假设源已存在)
 | 
						|
      apt:
 | 
						|
        name: consul={{ consul_version }}-*
 | 
						|
        state: present
 | 
						|
        force_apt_get: yes
 | 
						|
      ignore_errors: yes
 | 
						|
 | 
						|
    - name: Create consul user (if not exists)
 | 
						|
      user:
 | 
						|
        name: consul
 | 
						|
        system: yes
 | 
						|
        shell: /bin/false
 | 
						|
        home: /opt/consul
 | 
						|
        create_home: yes
 | 
						|
 | 
						|
    - name: Create consul directories
 | 
						|
      file:
 | 
						|
        path: "{{ item }}"
 | 
						|
        state: directory
 | 
						|
        owner: consul
 | 
						|
        group: consul
 | 
						|
        mode: '0755'
 | 
						|
      loop:
 | 
						|
        - /opt/consul
 | 
						|
        - /opt/consul/data
 | 
						|
        - /etc/consul.d
 | 
						|
        - /var/log/consul
 | 
						|
 | 
						|
    - name: Get node Tailscale IP
 | 
						|
      shell: ip addr show tailscale0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1
 | 
						|
      register: tailscale_ip
 | 
						|
      failed_when: tailscale_ip.stdout == ""
 | 
						|
 | 
						|
    - name: Create consul client configuration
 | 
						|
      template:
 | 
						|
        src: templates/consul-client.hcl.j2
 | 
						|
        dest: /etc/consul.d/consul.hcl
 | 
						|
        owner: consul
 | 
						|
        group: consul
 | 
						|
        mode: '0644'
 | 
						|
      notify: restart consul
 | 
						|
 | 
						|
    - name: Create consul systemd service
 | 
						|
      template:
 | 
						|
        src: templates/consul.service.j2
 | 
						|
        dest: /etc/systemd/system/consul.service
 | 
						|
        owner: root
 | 
						|
        group: root
 | 
						|
        mode: '0644'
 | 
						|
      notify: reload systemd
 | 
						|
 | 
						|
    - name: Enable and start consul service
 | 
						|
      systemd:
 | 
						|
        name: consul
 | 
						|
        enabled: yes
 | 
						|
        state: started
 | 
						|
      notify: restart consul
 | 
						|
 | 
						|
    - name: Wait for consul to be ready
 | 
						|
      uri:
 | 
						|
        url: "http://{{ tailscale_ip.stdout }}:8500/v1/status/leader"
 | 
						|
        status_code: 200
 | 
						|
        timeout: 5
 | 
						|
      register: consul_leader_status
 | 
						|
      until: consul_leader_status.status == 200
 | 
						|
      retries: 30
 | 
						|
      delay: 5
 | 
						|
 | 
						|
    - name: Verify consul cluster membership
 | 
						|
      shell: consul members -status=alive -format=json | jq -r '.[].Name'
 | 
						|
      register: consul_members
 | 
						|
      changed_when: false
 | 
						|
 | 
						|
    - name: Display cluster status
 | 
						|
      debug:
 | 
						|
        msg: "Node {{ inventory_hostname.split('.')[0] }} joined cluster with {{ consul_members.stdout_lines | length }} members"
 | 
						|
 | 
						|
  handlers:
 | 
						|
    - name: reload systemd
 | 
						|
      systemd:
 | 
						|
        daemon_reload: yes
 | 
						|
 | 
						|
    - name: restart consul
 | 
						|
      systemd:
 | 
						|
        name: consul
 | 
						|
        state: restarted |