entercloudsuite.consul

Rola Ansible dla wdrażania Consul

Consul

Consul

Status budowy Galaxy

Funkcje

Konfiguracja Consul za pomocą YAML

Konfiguracja usługi Consul jest realizowana poprzez konwersję YAML do JSON, co pozwala wyrazić konfiguracje Consul w następujący sposób:

consul_master_token: myToken
consul_server: true
consul_configs:
  main:
    acl_datacenter: pantheon
    acl_master_token: "{{ consul_master_token | to_uuid }}"
    bootstrap: true
    bind_addr: 0.0.0.0
    client_addr: 0.0.0.0
    datacenter: pantheon
    data_dir: "{{ consul_data_dir }}"
    log_level: INFO
    node_name: master
    server: "{{ consul_server }}"
    ui: true

Jest to realizowane za pomocą filtrów Jinja2. Ta rola nie implementuje wstępnie skonfigurowanych wpisów dla konfiguracji, więc zamiast pisać konfigurację Consul w JSON; po prostu wyrażasz ją w równoważnej składni YAML, co oznacza, że może być wszędzie w twojej konfiguracji Ansible.
Jak pokazano w powyższym przykładzie, jest to bardzo potężne, ponieważ pozwala wykorzystać inne filtry dostępne w Ansible do konstruowania dowolnych danych i ich użycia w konfiguracji. Cokolwiek możesz wyrazić za pomocą szablonów Ansible (w tym pobieranie danych/informacji o hostach z inwentarza itp.) może być użyte w konfiguracji.

Powyższy przykład konfiguracji pokazuje proste pary klucz/wartość, ale oczywiście możesz zdefiniować dowolny prawidłowy typ w YAML, taki jak słowniki i listy.
Jeśli nie wiesz, jak wyrazić konfigurację JSON dla Consul jako YAML, zobacz tutaj przydatny konwerter.

Wymagania

Ta rola była testowana tylko na Ubuntu 16.04, ale powinna działać na każdej dystrybucji Linuksa. Wymaga:

  • systemd
  • unzip

Domyślne zmienne roli

---
consul_packer_provision: false
consul_group_name: consul
consul_group_gid: 3000
consul_user_name: consul
consul_user_uid: 3000
consul_user_home: /opt/consul
consul_config_dir: "{{ consul_user_home }}/conf.d"
consul_data_dir: "{{ consul_user_home }}/data"
consul_version: 1.6.3
# JeśliConsul jest skonfigurowany jako serwer, systemd ustawia cap_net_bind_service dla portu 53
consul_cap_net_bind_service: "{{ consul_configs.main.server | default('false') }}"
consul_server: false
consul_uri: "https://releases.hashicorp.com/consul/{{ consul_version }}/consul_{{ consul_version }}_linux_amd64.zip"
consul_config_src: main.json.j2
consul_config_validate: "{{ consul_user_home }}/bin/consul validate -config-format=json %s"
consul_extra_args: []
consul_service_file:
  src: consul.service.j2
  dest: /etc/systemd/system/consul.service
consul_service_status: started
# załadowano
# zrestartowane
# uruchomione
# zatrzymane

enable_on_boot: yes
# tak
# nie

# skonfiguruj tę zmienną, aby nie uruchamiać kroku konfiguracji
# no_configure

# skonfiguruj tę zmienną, aby nie uruchamiać kroku instalacji
# no_install

consul_config:
  datacenter: dc-1
  data_dir: "{{ consul_data_dir }}"
  log_level: INFO
  node_name: node-1
  server: "{{ consul_server }}"

Przykład playbooka

Podstawowa konfiguracja roli

- hosts: consul_servers
  vars:
    consul_master_token: myToken
    consul_server: true
    consul_config:
      acl_datacenter: pantheon
      acl_master_token: "{{ consul_master_token | to_uuid }}"
      bootstrap: true
      bind_addr: 0.0.0.0
      client_addr: 0.0.0.0
      datacenter: pantheon
      data_dir: "{{ consul_data_dir }}"
      log_level: INFO
      node_name: master
      server: "{{ consul_server }}"
      ui: true
  roles:
      - entercloudsuite.consul

Nie konfiguruj, tylko zainstaluj

---
- name: uruchom główną rolę
  hosts: all
  roles:
    - role: entercloudsuite.consul
      configure: false
      install: true
      consul_service_status: "stopped"
      consul_master_token: myToken
      consul_server: true
      consul_configs:
        main:
          acl_datacenter: pantheon
          acl_master_token: "{{ consul_master_token | to_uuid }}"
          bootstrap: true
          bind_addr: 0.0.0.0
          client_addr: 0.0.0.0
          datacenter: pantheon
          data_dir: "{{ consul_data_dir }}"
          log_level: INFO
          node_name: master
          server: "{{ consul_server }}"
          ui: true

Nie instaluj, tylko konfiguruj

---
- name: uruchom główną rolę
  hosts: all
  roles:
    - role: entercloudsuite.consul
      configure: true
      install: false
      consul_service_status: "started"
      consul_master_token: myToken
      consul_server: true
      consul_configs:
        main:
          acl_datacenter: pantheon
          acl_master_token: "{{ consul_master_token | to_uuid }}"
          bootstrap: true
          bind_addr: 0.0.0.0
          client_addr: 0.0.0.0
          datacenter: pantheon
          data_dir: "{{ consul_data_dir }}"
          log_level: INFO
          node_name: master
          server: "{{ consul_server }}"
          ui: true

Konfiguracje agenta Consul

Przykładowe konfiguracje agenta, dołącza do serwera w groups['server']

    - role: ansible-consul
      configure: true
      install: true
      consul_service_status: "started"
      consul_version: 1.6.3
      consul_configs:
        main:
          bind_addr: "{{ ansible_default_ipv4['address'] }}"
          client_addr: 0.0.0.0
          node_name: "{{ ansible_hostname }}"
          data_dir: "{{ consul_data_dir }}"
          datacenter: "pantheon"
          enable_syslog: true
          server: false
          ui: true
          enable_script_checks: true
          rejoin_after_leave: true
          retry_join: "{{ groups['server'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"

Przykład serwera Consul

Przykładowe konfiguracje serwera, host w groups['server'] tworzy nowy klaster Consul.

    - role: ansible-consul
      configure: true
      install: true
      consul_service_status: "started"
      consul_version: 1.6.3
      consul_configs:
        main:
          bind_addr: "{{ ansible_default_ipv4['address'] }}"
          client_addr: 0.0.0.0
          node_name: "{{ ansible_hostname }}"
          data_dir: "{{ consul_data_dir }}"
          datacenter: "pantheon"
          enable_syslog: true
          server: true
          ui: true
          enable_script_checks: true
          rejoin_after_leave: true
          retry_join: "{{ groups['server'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"
          ports:
            dns: 53
          dns_config:
            udp_answer_limit: 64
          bootstrap_expect: "{{ groups['server'] | length | int }}"
          recursors:
            - 1.1.1.1
            - 8.8.8.8

Testowanie

Testy są realizowane za pomocą Molecule.

Zainstaluj Molecule lub użyj docker-compose run --rm molecule, aby uruchomić lokalny kontener Docker, oparty na projekcie entercloudsuite/molecule, skąd możesz użyć molecule.

  1. Uruchom molecule create, aby uruchomić docelowy kontener Docker na swoim lokalnym silniku.
  2. Użyj molecule login, aby zalogować się do uruchomionego kontenera.
  3. Edytuj pliki roli.
  4. Dodaj inne wymagane role (zewnętrzne) w pliku molecule/default/requirements.yml.
  5. Edytuj molecule/default/playbook.yml.
  6. Zdefiniuj testy infra w folderze molecule/default/tests przy użyciu weryfikatora goos.
  7. Gdy będziesz gotowy, użyj molecule converge, aby uruchomić playbook Ansible i molecule verify, aby wykonać zestaw testów. Zauważ, że proces konwergencji rozpoczyna się od sprawdzenia składni roli. Zniszcz kontener Docker komendą molecule destroy.

Aby wykonać wszystkie kroki jednym poleceniem, uruchom molecule test.

Aby uruchomić rolę kierując się na VM, użyj pliku playbook_deploy.yml np. z następującą komendą: ansible-playbook ansible-docker/molecule/default/playbook_deploy.yml -i VM_IP_OR_FQDN, -u ubuntu --private-key private.pem

Licencja

MIT

Informacje o autorze

Stworzone przez:

  • Calum MacRae
  • Jacopo Secchiero
  • Attilio Greco
O projekcie

Role for deploying Consul

Zainstaluj
ansible-galaxy install entercloudsuite.consul
Licencja
mit
Pobrania
7.5k
Właściciel