mirror of https://github.com/ceph/ceph-ansible.git
393 lines
17 KiB
YAML
393 lines
17 KiB
YAML
---
|
|
- name: Gather facts and prepare system for cephadm
|
|
hosts:
|
|
- "{{ mon_group_name|default('mons') }}"
|
|
- "{{ osd_group_name|default('osds') }}"
|
|
- "{{ mds_group_name|default('mdss') }}"
|
|
- "{{ rgw_group_name|default('rgws') }}"
|
|
- "{{ mgr_group_name|default('mgrs') }}"
|
|
- "{{ rbdmirror_group_name|default('rbdmirrors') }}"
|
|
- "{{ nfs_group_name|default('nfss') }}"
|
|
- "{{ monitoring_group_name|default('monitoring') }}"
|
|
become: true
|
|
gather_facts: false
|
|
vars:
|
|
delegate_facts_host: true
|
|
tasks:
|
|
- name: Import ceph-defaults role
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: Validate if monitor group doesn't exist or empty
|
|
ansible.builtin.fail:
|
|
msg: "you must add a [mons] group and add at least one node."
|
|
run_once: true
|
|
when: groups[mon_group_name] is undefined or groups[mon_group_name] | length == 0
|
|
|
|
- name: Validate if manager group doesn't exist or empty
|
|
ansible.builtin.fail:
|
|
msg: "you must add a [mgrs] group and add at least one node."
|
|
run_once: true
|
|
when: groups[mgr_group_name] is undefined or groups[mgr_group_name] | length == 0
|
|
|
|
- name: Validate monitor network configuration
|
|
ansible.builtin.fail:
|
|
msg: "Either monitor_address, monitor_address_block or monitor_interface must be provided"
|
|
when:
|
|
- mon_group_name in group_names
|
|
- monitor_address == 'x.x.x.x'
|
|
- monitor_address_block == 'subnet'
|
|
- monitor_interface == 'interface'
|
|
|
|
- name: Validate dashboard configuration
|
|
when: dashboard_enabled | bool
|
|
run_once: true
|
|
block:
|
|
- name: Fail if [monitoring] group doesn't exist or empty
|
|
ansible.builtin.fail:
|
|
msg: "you must add a [monitoring] group and add at least one node."
|
|
when: groups[monitoring_group_name] is undefined or groups[monitoring_group_name] | length == 0
|
|
|
|
- name: Fail when dashboard_admin_password is not set
|
|
ansible.builtin.fail:
|
|
msg: "you must set dashboard_admin_password."
|
|
when: dashboard_admin_password is undefined
|
|
|
|
- name: Validate container registry credentials
|
|
ansible.builtin.fail:
|
|
msg: 'ceph_docker_registry_username and/or ceph_docker_registry_password variables need to be set'
|
|
when:
|
|
- ceph_docker_registry_auth | bool
|
|
- (ceph_docker_registry_username is not defined or ceph_docker_registry_password is not defined) or
|
|
(ceph_docker_registry_username | length == 0 or ceph_docker_registry_password | length == 0)
|
|
|
|
- name: Gather facts
|
|
ansible.builtin.setup:
|
|
gather_subset:
|
|
- 'all'
|
|
- '!facter'
|
|
- '!ohai'
|
|
when: not delegate_facts_host | bool
|
|
|
|
- name: Gather and delegate facts
|
|
ansible.builtin.setup:
|
|
gather_subset:
|
|
- 'all'
|
|
- '!facter'
|
|
- '!ohai'
|
|
delegate_to: "{{ item }}"
|
|
delegate_facts: true
|
|
with_items: "{{ groups['all'] }}"
|
|
run_once: true
|
|
when: delegate_facts_host | bool
|
|
|
|
- name: Import ceph-facts role
|
|
ansible.builtin.import_role:
|
|
name: ceph-facts
|
|
tasks_from: container_binary.yml
|
|
|
|
- name: Check if it is atomic host
|
|
ansible.builtin.stat:
|
|
path: /run/ostree-booted
|
|
register: stat_ostree
|
|
|
|
- name: Set_fact is_atomic
|
|
ansible.builtin.set_fact:
|
|
is_atomic: "{{ stat_ostree.stat.exists }}"
|
|
|
|
- name: Import ceph-container-engine role
|
|
ansible.builtin.import_role:
|
|
name: ceph-container-engine
|
|
|
|
- name: Import ceph-container-common role
|
|
ansible.builtin.import_role:
|
|
name: ceph-container-common
|
|
tasks_from: registry.yml
|
|
when: ceph_docker_registry_auth | bool
|
|
|
|
- name: Configure repository for installing cephadm
|
|
vars:
|
|
ceph_origin: repository
|
|
ceph_repository: community
|
|
block:
|
|
- name: Validate repository variables
|
|
ansible.builtin.import_role:
|
|
name: ceph-validate
|
|
tasks_from: check_repository.yml
|
|
|
|
- name: Configure repository
|
|
ansible.builtin.import_role:
|
|
name: ceph-common
|
|
tasks_from: "configure_repository.yml"
|
|
|
|
- name: Install cephadm requirements
|
|
ansible.builtin.package:
|
|
name: ['python3', 'lvm2']
|
|
register: result
|
|
until: result is succeeded
|
|
|
|
- name: Install cephadm
|
|
ansible.builtin.package:
|
|
name: cephadm
|
|
register: result
|
|
until: result is succeeded
|
|
|
|
- name: Set_fact cephadm_cmd
|
|
ansible.builtin.set_fact:
|
|
cephadm_cmd: "cephadm {{ '--docker' if container_binary == 'docker' else '' }}"
|
|
|
|
- name: Bootstrap the cluster
|
|
hosts: "{{ mon_group_name|default('mons') }}[0]"
|
|
become: true
|
|
gather_facts: false
|
|
tasks:
|
|
- name: Import ceph-defaults role
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: Import ceph-facts role
|
|
ansible.builtin.import_role:
|
|
name: ceph-facts
|
|
tasks_from: set_monitor_address.yml
|
|
|
|
- name: Create /etc/ceph directory
|
|
ansible.builtin.file:
|
|
path: /etc/ceph
|
|
state: directory
|
|
mode: "0755"
|
|
|
|
- name: Bootstrap the new cluster
|
|
cephadm_bootstrap:
|
|
mon_ip: "{{ _current_monitor_address }}"
|
|
image: "{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}"
|
|
docker: "{{ true if container_binary == 'docker' else false }}"
|
|
pull: false
|
|
dashboard: "{{ dashboard_enabled }}"
|
|
dashboard_user: "{{ dashboard_admin_user if dashboard_enabled | bool else omit }}"
|
|
dashboard_password: "{{ dashboard_admin_password if dashboard_enabled | bool else omit }}"
|
|
monitoring: false
|
|
firewalld: "{{ configure_firewall }}"
|
|
ssh_user: "{{ cephadm_ssh_user | default('root') }}"
|
|
ssh_config: "{{ cephadm_ssh_config | default(omit) }}"
|
|
|
|
- name: Set default container image in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set global container_image {{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Set container image base in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set mgr mgr/cephadm/container_image_base {{ ceph_docker_registry }}/{{ ceph_docker_image }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Set dashboard container image in ceph mgr configuration
|
|
when: dashboard_enabled | bool
|
|
block:
|
|
- name: Set alertmanager container image in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set mgr mgr/cephadm/container_image_alertmanager {{ alertmanager_container_image }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Set grafana container image in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set mgr mgr/cephadm/container_image_grafana {{ grafana_container_image }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Set node-exporter container image in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set mgr mgr/cephadm/container_image_node_exporter {{ node_exporter_container_image }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Set prometheus container image in ceph configuration
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} config set mgr mgr/cephadm/container_image_prometheus {{ prometheus_container_image }}"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Add the other nodes
|
|
hosts:
|
|
- "{{ mon_group_name|default('mons') }}"
|
|
- "{{ osd_group_name|default('osds') }}"
|
|
- "{{ mds_group_name|default('mdss') }}"
|
|
- "{{ rgw_group_name|default('rgws') }}"
|
|
- "{{ mgr_group_name|default('mgrs') }}"
|
|
- "{{ rbdmirror_group_name|default('rbdmirrors') }}"
|
|
- "{{ nfs_group_name|default('nfss') }}"
|
|
- "{{ monitoring_group_name|default('monitoring') }}"
|
|
become: true
|
|
gather_facts: false
|
|
tasks:
|
|
- name: Import ceph-defaults role
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: Get the cephadm ssh pub key
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} cephadm get-pub-key"
|
|
changed_when: false
|
|
run_once: true
|
|
register: cephadm_pubpkey
|
|
delegate_to: '{{ groups[mon_group_name][0] }}'
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Allow cephadm key
|
|
ansible.posix.authorized_key:
|
|
user: "{{ cephadm_ssh_user | default('root') }}"
|
|
key: '{{ cephadm_pubpkey.stdout }}'
|
|
|
|
- name: Run cephadm prepare-host
|
|
ansible.builtin.command: cephadm prepare-host
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Manage nodes with cephadm - ipv4
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch host add {{ ansible_facts['hostname'] }} {{ ansible_facts['all_ipv4_addresses'] | ips_in_ranges(public_network.split(',')) | first }} {{ group_names | join(' ') }} {{ '_admin' if mon_group_name | default('mons') in group_names else '' }}"
|
|
changed_when: false
|
|
delegate_to: '{{ groups[mon_group_name][0] }}'
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
when: ip_version == 'ipv4'
|
|
|
|
- name: Manage nodes with cephadm - ipv6
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch host add {{ ansible_facts['hostname'] }} {{ ansible_facts['all_ipv6_addresses'] | ips_in_ranges(public_network.split(',')) | last | ansible.utils.ipwrap }} {{ group_names | join(' ') }} {{ '_admin' if mon_group_name | default('mons') in group_names else '' }}"
|
|
changed_when: false
|
|
delegate_to: '{{ groups[mon_group_name][0] }}'
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
when: ip_version == 'ipv6'
|
|
|
|
- name: Add ceph label for core component
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch host label add {{ ansible_facts['hostname'] }} ceph"
|
|
changed_when: false
|
|
delegate_to: '{{ groups[mon_group_name][0] }}'
|
|
when: inventory_hostname in groups.get(mon_group_name, []) or
|
|
inventory_hostname in groups.get(osd_group_name, []) or
|
|
inventory_hostname in groups.get(mds_group_name, []) or
|
|
inventory_hostname in groups.get(rgw_group_name, []) or
|
|
inventory_hostname in groups.get(mgr_group_name, []) or
|
|
inventory_hostname in groups.get(rbdmirror_group_name, [])
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Adjust service placement
|
|
hosts: "{{ mon_group_name|default('mons') }}[0]"
|
|
become: true
|
|
gather_facts: false
|
|
tasks:
|
|
- name: Import ceph-defaults role
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: Update the placement of monitor hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply mon --placement='label:{{ mon_group_name }}'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Waiting for the monitor to join the quorum...
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} quorum_status --format json"
|
|
changed_when: false
|
|
register: ceph_health_raw
|
|
until: (ceph_health_raw.stdout | from_json)["quorum_names"] | length == groups.get(mon_group_name, []) | length
|
|
retries: "{{ health_mon_check_retries }}"
|
|
delay: "{{ health_mon_check_delay }}"
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of manager hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply mgr --placement='label:{{ mgr_group_name }}'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of crash hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply crash --placement='label:ceph'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of ceph-exporter hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply ceph-exporter --placement='label:ceph'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Adjust monitoring service placement
|
|
hosts: "{{ monitoring_group_name|default('monitoring') }}"
|
|
become: true
|
|
gather_facts: false
|
|
tasks:
|
|
- name: Import ceph-defaults
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: With dashboard enabled
|
|
when: dashboard_enabled | bool
|
|
delegate_to: '{{ groups[mon_group_name][0] }}'
|
|
run_once: true
|
|
block:
|
|
- name: Enable the prometheus module
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} mgr module enable prometheus"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of alertmanager hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply alertmanager --placement='label:{{ monitoring_group_name }}'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of grafana hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply grafana --placement='label:{{ monitoring_group_name }}'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of prometheus hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply prometheus --placement='label:{{ monitoring_group_name }}'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Update the placement of node-exporter hosts
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply node-exporter --placement='*'"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Print information
|
|
hosts: "{{ mon_group_name|default('mons') }}[0]"
|
|
become: true
|
|
gather_facts: false
|
|
tasks:
|
|
- name: Import ceph-defaults
|
|
ansible.builtin.import_role:
|
|
name: ceph-defaults
|
|
|
|
- name: Show ceph orchestrator services
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch ls --refresh"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Show ceph orchestrator daemons
|
|
ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch ps --refresh"
|
|
changed_when: false
|
|
environment:
|
|
CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
|
|
|
|
- name: Inform users about cephadm
|
|
ansible.builtin.debug:
|
|
msg: |
|
|
This Ceph cluster is now ready to receive more configuration like
|
|
adding OSD, MDS daemons, create pools or keyring.
|
|
You can do this by using the cephadm CLI and you don't need to use
|
|
ceph-ansible playbooks anymore.
|