first commit
This commit is contained in:
commit
c32a303998
17
README.md
Normal file
17
README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Ansible HashiStack
|
||||||
|
|
||||||
|
Instalación del stack de Hashicorp usando Ansible:
|
||||||
|
- Consul
|
||||||
|
|
||||||
|
Por hacer:
|
||||||
|
- Nomad
|
||||||
|
- Vault
|
||||||
|
|
||||||
|
## Configuración
|
||||||
|
Comprueba el contenido del archivo **proxmox-inv/hosts**.
|
||||||
|
|
||||||
|
## Ejecución
|
||||||
|
Aplica el rol consul:
|
||||||
|
```bash
|
||||||
|
ansible-playbook consul.yml
|
||||||
|
```
|
2
ansible.cfg
Normal file
2
ansible.cfg
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[defaults]
|
||||||
|
inventory = proxmox-inv
|
7
consul.yml
Normal file
7
consul.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
- name: Instala Consul
|
||||||
|
hosts: consul_node
|
||||||
|
any_errors_fatal: true
|
||||||
|
become: true
|
||||||
|
become_user: root
|
||||||
|
roles:
|
||||||
|
- consul
|
11
proxmox-inv/hosts
Normal file
11
proxmox-inv/hosts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[all:vars]
|
||||||
|
ansible_connection=ssh
|
||||||
|
ansible_user=alpine
|
||||||
|
ansible_ssh_private_key_file=~/.ssh/alpine-cloud
|
||||||
|
|
||||||
|
[consul_node]
|
||||||
|
192.168.1.71 consul_iface=eth0 consul_node_role=server vm_name=hashi-1 vm_ip=192.168.1.71
|
||||||
|
192.168.1.72 consul_iface=eth0 consul_node_role=client vm_name=hashi-2 vm_ip=192.168.1.72
|
||||||
|
|
||||||
|
[consul_node:vars]
|
||||||
|
consul_dc_name=tr4ck
|
4
roles/consul/defaults/main.yml
Normal file
4
roles/consul/defaults/main.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
consul_version: v1.16.1
|
||||||
|
consul_install_path: /opt/consul
|
||||||
|
consul_data_path: "{{ consul_install_path }}/data"
|
6
roles/consul/handlers/main.yml
Normal file
6
roles/consul/handlers/main.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
- name: restart consul
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: consul
|
||||||
|
state: restarted
|
||||||
|
become: true
|
7
roles/consul/tasks/install_alpine_binary.yml
Normal file
7
roles/consul/tasks/install_alpine_binary.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
- name: install consul apk package
|
||||||
|
community.general.apk:
|
||||||
|
name: consul
|
||||||
|
state: present
|
||||||
|
update_cache: yes
|
||||||
|
become: true
|
70
roles/consul/tasks/main.yml
Normal file
70
roles/consul/tasks/main.yml
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
---
|
||||||
|
- name: setup prerequisites
|
||||||
|
ansible.builtin.include_tasks: "prereq_{{ ansible_distribution|lower }}.yml"
|
||||||
|
|
||||||
|
- name: setup python-consul
|
||||||
|
ansible.builtin.pip:
|
||||||
|
name: python-consul
|
||||||
|
state: latest
|
||||||
|
executable: /usr/bin/pip3
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: check if consul is the correct version
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: "/usr/bin/consul"
|
||||||
|
register: consul_installed_version
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: Include base install
|
||||||
|
include_tasks: "install_{{ ansible_distribution|lower }}_binary.yml"
|
||||||
|
when: consul_installed_version is not defined or consul_version not in consul_installed_version.stdout
|
||||||
|
|
||||||
|
- name: ensure the consul folders exist
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
mode: 0755
|
||||||
|
with_items:
|
||||||
|
- "{{ consul_install_path }}"
|
||||||
|
- "{{ consul_data_path }}"
|
||||||
|
- "/etc/consul/"
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: touch env file
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "/etc/consul/consul.env"
|
||||||
|
state: touch
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
mode: 0770
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: setup key for encryption
|
||||||
|
include_tasks: "setup_encrypt_key.yml"
|
||||||
|
run_once: true
|
||||||
|
|
||||||
|
- name: setup consul ca
|
||||||
|
include_tasks: "setup_ca.yml"
|
||||||
|
run_once: true
|
||||||
|
|
||||||
|
- name: setup server cert
|
||||||
|
include_tasks: "setup_server_cert.yml"
|
||||||
|
|
||||||
|
- name: setup client cert
|
||||||
|
include_tasks: "setup_client_cert.yml"
|
||||||
|
|
||||||
|
- name: setup consul config
|
||||||
|
include_tasks: "setup_consul_config.yml"
|
||||||
|
|
||||||
|
- name: enable and start consul
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: consul
|
||||||
|
enabled: true
|
||||||
|
state: restarted
|
||||||
|
async: 600
|
||||||
|
poll: 5
|
||||||
|
become: true
|
7
roles/consul/tasks/prereq_alpine.yml
Normal file
7
roles/consul/tasks/prereq_alpine.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
- name: setup pip3
|
||||||
|
community.general.apk:
|
||||||
|
name: py3-pip
|
||||||
|
state: present
|
||||||
|
update_cache: yes
|
||||||
|
become: true
|
46
roles/consul/tasks/setup_ca.yml
Normal file
46
roles/consul/tasks/setup_ca.yml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
- name: generate the consul CA
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: consul tls ca create
|
||||||
|
args:
|
||||||
|
chdir: /etc/consul
|
||||||
|
creates: /etc/consul/consul-agent-ca.pem
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: set the key as fact
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: cat /etc/consul/consul-agent-ca-key.pem
|
||||||
|
changed_when: false
|
||||||
|
register: ca_key
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: set the pem as fact
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: cat /etc/consul/consul-agent-ca.pem
|
||||||
|
changed_when: false
|
||||||
|
register: ca_pem
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: store key onto other systems
|
||||||
|
ansible.builtin.copy:
|
||||||
|
content: "{{ ca_key.stdout }}"
|
||||||
|
mode: 0640
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
dest: /etc/consul/consul-agent-ca-key.pem
|
||||||
|
delegate_to: "{{ item }}"
|
||||||
|
become: true
|
||||||
|
loop: "{{ groups['consul_node'] }}"
|
||||||
|
when: ansible_fqdn != item
|
||||||
|
|
||||||
|
- name: store ca cert onto other systems
|
||||||
|
ansible.builtin.copy:
|
||||||
|
content: "{{ ca_pem.stdout }}"
|
||||||
|
mode: 0640
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
dest: /etc/consul/consul-agent-ca.pem
|
||||||
|
delegate_to: "{{ item }}"
|
||||||
|
become: true
|
||||||
|
loop: "{{ groups['consul_node'] }}"
|
||||||
|
when: ansible_fqdn != item
|
19
roles/consul/tasks/setup_client_cert.yml
Normal file
19
roles/consul/tasks/setup_client_cert.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
- name: generate the client dc cert
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: consul tls cert create -client -dc {{ consul_dc_name }} -ca /etc/consul/consul-agent-ca.pem
|
||||||
|
args:
|
||||||
|
chdir: /etc/consul
|
||||||
|
creates: "/etc/consul/{{consul_dc_name}}-client-consul-0.pem"
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: set permissions on generated files
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
mode: 0640
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
become: true
|
||||||
|
loop:
|
||||||
|
- "/etc/consul/{{ consul_dc_name }}-client-consul-0.pem"
|
||||||
|
- "/etc/consul/{{ consul_dc_name }}-client-consul-0-key.pem"
|
15
roles/consul/tasks/setup_consul_config.yml
Normal file
15
roles/consul/tasks/setup_consul_config.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
- name: get the encrypt_key
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: cat /etc/consul/gossip.key
|
||||||
|
register: gossip
|
||||||
|
become: true
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: set the consul.json config file
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: consul.json.j2
|
||||||
|
dest: /etc/consul/consul.json
|
||||||
|
mode: 0600
|
||||||
|
owner: consul
|
||||||
|
become: true
|
39
roles/consul/tasks/setup_encrypt_key.yml
Normal file
39
roles/consul/tasks/setup_encrypt_key.yml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
- name: debug
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "{{ groups['consul_node'] }}"
|
||||||
|
|
||||||
|
- name: check whether keygen has already ran
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /etc/consul/gossip.key
|
||||||
|
become: true
|
||||||
|
register: keygen_stat
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: ensure /etc/consul is exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/consul
|
||||||
|
state: directory
|
||||||
|
mode: 0755
|
||||||
|
delegate_to: "{{ item }}"
|
||||||
|
become: true
|
||||||
|
loop: "{{ groups['consul_node'] }}"
|
||||||
|
when: ansible_fqdn != item
|
||||||
|
|
||||||
|
- name: setup the key for encryption
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: consul keygen
|
||||||
|
register: consul_keygen
|
||||||
|
run_once: true
|
||||||
|
|
||||||
|
- name: store key onto system
|
||||||
|
ansible.builtin.copy:
|
||||||
|
content: "{{ consul_keygen.stdout }}"
|
||||||
|
mode: 0600
|
||||||
|
dest: /etc/consul/gossip.key
|
||||||
|
owner: consul
|
||||||
|
delegate_to: "{{ item }}"
|
||||||
|
loop: "{{ groups['consul_node'] }}"
|
||||||
|
run_once: true
|
||||||
|
when: keygen_stat.stat.exists == false
|
||||||
|
become: true
|
19
roles/consul/tasks/setup_server_cert.yml
Normal file
19
roles/consul/tasks/setup_server_cert.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
- name: generate the server dc cert
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: consul tls cert create -server -dc {{ consul_dc_name }} -ca /etc/consul/consul-agent-ca.pem
|
||||||
|
args:
|
||||||
|
chdir: /etc/consul
|
||||||
|
creates: "/etc/consul/{{ consul_dc_name }}-server-consul-0.pem"
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: set permissions on generated files
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
mode: 0640
|
||||||
|
owner: consul
|
||||||
|
group: consul
|
||||||
|
become: true
|
||||||
|
loop:
|
||||||
|
- "/etc/consul/{{ consul_dc_name }}-server-consul-0.pem"
|
||||||
|
- "/etc/consul/{{ consul_dc_name }}-server-consul-0-key.pem"
|
35
roles/consul/templates/consul.json.j2
Normal file
35
roles/consul/templates/consul.json.j2
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"datacenter": "{{ consul_dc_name }}",
|
||||||
|
"node_name": "{{ vm_name }}",
|
||||||
|
"data_dir": "/opt/consul",
|
||||||
|
"encrypt": "{{ gossip.stdout }}",
|
||||||
|
"ca_file": "/etc/consul/consul-agent-ca.pem",
|
||||||
|
"cert_file": "/etc/consul/{{ consul_dc_name }}-server-consul-0.pem",
|
||||||
|
"key_file": "/etc/consul/{{ consul_dc_name }}-server-consul-0-key.pem",
|
||||||
|
"verify_incoming": false,
|
||||||
|
"verify_outgoing": true,
|
||||||
|
"verify_server_hostname": false,
|
||||||
|
"bind_addr": "{{ vm_ip }}",
|
||||||
|
"addresses": {
|
||||||
|
"https": "{{ vm_ip }}",
|
||||||
|
"http": "{{ vm_ip }}",
|
||||||
|
"dns": "{{ vm_ip }}",
|
||||||
|
"grpc": "{{ vm_ip }}"
|
||||||
|
},
|
||||||
|
"ports": {
|
||||||
|
"grpc_tls": 8502
|
||||||
|
},
|
||||||
|
{% if 'server' in consul_node_role %}
|
||||||
|
"server": true,
|
||||||
|
{% if consul_bootstrap_node is defined %}
|
||||||
|
"bootstrap": true,
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
"retry_join": [{% for host in groups['consul_node'] %}"{{ hostvars[host]['vm_ip'] }}"{% if not loop.last %},{% endif %}{% endfor %}],
|
||||||
|
"ui_config": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"connect": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user