automium.consul

Rola Ansible do wdrożenia Consul

Consul

Consul

Status budowy Galaxy

Cechy

Konfiguracja Consul przy użyciu YAML

Konfiguracja usługi Consul odbywa się poprzez konwersję YAML na JSON, więc możesz wyrazić swoje konfiguracje Consul w ten 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

To odbywa się przy użyciu filtrów Jinja2. Ta rola nie implementuje żadnych wstępnie skonfigurowanych wpisów do 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 znajdować się w dowolnym miejscu w twojej konfiguracji Ansible.
Jak widać w powyższym przykładzie, to może być bardzo potężne, ponieważ pozwala ci wykorzystać inne filtry dostępne w Ansible do konstruowania dowolnych danych i używania ich w konfiguracji. Wszystko, co 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 możesz oczywiście zdefiniować dowolny ważny typ w YAML, na przykład 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 w systemie Ubuntu 16.04, ale powinna działać na dowolnej dystrybucji Linuxa. 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śli consul 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
# przeładowane
# ponownie uruchomione
# uruchomione
# zatrzymane

enable_on_boot: yes
# tak
# nie

# skonfiguruj tę zmienną, aby nie wykonywać kroku konfiguracyjnego
# no_configure

# skonfiguruj tę zmienną, aby nie wykonywać 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 konfigurować, tylko instalować

---
- 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 instalować, tylko konfigurować

---
- 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, łączy się z serwerem 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 konfiguracji serwera

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ą wykonywane przy użyciu Molecule.

Zainstaluj Molecule lub użyj docker-compose run --rm molecule, aby uruchomić lokalny kontener Docker, bazując na projekcie enterclousuite/molecule, z którego możesz korzystać z molecule.

  1. Uruchom molecule create, aby uruchomić docelowy kontener Docker na twoim 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, używając weryfikatora goos.
  7. Gdy będziesz gotowy, użyj molecule converge, aby uruchomić Playbook Ansible, a molecule verify, aby wykonać zestaw testów. Zauważ, że proces konwergencji zaczyna się od sprawdzenia składni roli. Zniszcz kontener Docker poleceniem molecule destroy.

Aby wykonać wszystkie kroki za pomocą jednego polecenia, uruchom molecule test.

Aby uruchomić rolę celującą w VM, użyj pliku playbook_deploy.yml, na przykład z następującym poleceniem: 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 automium.consul
Licencja
mit
Pobrania
1.4k
Właściciel
Portable services for scalable and resilient infrastructures