ceph ansible simple installation
                    
                    
            
                        ceph-ansible
                    
                    
                    
                개요
- 회사에서 Ceph 를 계속 스터디를 하고 있었으나. K8s Cluster 에 올려놓고 사용만 하고있었지 Baremetal 에 올려 사용하지는 않고있었다.
 - 자세하게 사용하기도 해야할 뿐더러 여러가지 옵션을 테스트 및 운용하기 위한 클러스터 구축을 정리하기 위하여 본 포스팅을 정리한다.
 - Ceph 설치방법은 Ceph-ansible 이며 stable-3.2 버전을 이용하여 설치 하였다.
 - 설치 노드는
- mon 1, osd 3, mgr 1 이며 mon1 과 mgr1, osd1 이 같은 호스트에 배포가 되었다.
 - ceph0 10.0.3.2 8cpu 16gb ram, /dev/sdb 300gb
 - ceph1 10.0.3.3 8cpu 16gb ram, /dev/sdb 300gb
 - ceph2 10.0.3.4 8cpu 16gb ram, /dev/sdb 300gb
 
 
ceph prerequirements
- 3node 부팅 Vagrant 로 부팅하면서 /dev/sdb/ 를 생성하도록 하였으며 lvm, fs 생성은 하지 않았다.
 - ssh fingerprint 설정
 
# 이방법으로 패스워드 yes, 패스워드 일일이 쳤음 
ssh-keygen 
ssh-copy-id ceph0
ssh-copy-id ceph1
ssh-copy-id ceph2
# 핑거프린트 검증용 각 호스트 접속 조회 확인  
ssh root@ceph0 hostname
ssh root@ceph1 hostname
ssh root@ceph2 hostname
# 다른방법으로는 sshpass 가 있다고 한다. 아래와 같이 사용하면 된다. 
yum install -y sshpass
echo "passwd-content" ~/passwd
sshpass -f ~/passwd ssh-copy-id root@ceph0
ssh root@ceph0 hostname 
- ceph 설치 전 사전 준비
- Pip, git Clone, 의존성 파일을 받아준다.
 
 
yum install -y git python-pip sshpass && 
git clone https://github.com/ceph/ceph-ansible.git && \
cd ceph-ansible && \
git checkout  stable-3.2 && \
pip install -r requirements.txt 
- /etc/hosts 설정
 
cat <<EOF>> /etc/hosts
10.0.3.2 ceph0
10.0.3.3 ceph1
10.0.3.4 ceph2
EOF
# 검증하기위한 조회 
cat /etc/hosts
# ceph 
firewall-cmd --permanent --new-service 3300 && \
  firewall-cmd --permanent --new-service 6789 && \
  firewall-cmd --reload
ceph ansible install
- inventory 작성
 
cat << EOF | tee inventory.ini
[mons]
ceph0
[mgrs]
ceph0
[osds]
ceph0
ceph1
ceph2
[grafana-server]
ceph0
[all:children]
mons
osds
mgrs
EOF
- extra-vars.yml 파일 작성
 
cat <<EOF | tee extra.yaml
# ceph
monitor_interface: eth1
monitor_address: 10.0.3.2
public_network: 10.0.3.0/24
cluster_network: 10.0.3.0/24
ceph_origin: repository
ceph_repository: community
ceph_stable_release: luminous
ceph_conf_overrides:
  global:
    mon_allow_pool_delete: true
    osd_pool_default_size: 1
    osd_pool_default_min_size: 1
    osd_pg_stat_report_internal_max: 1
  osd:
    osd_min_pg_log_entries: 10
    osd_max_pg_log_entries: 10
    osd_pg_log_dups_tracked: 10
    osd_pg_log_trim_min: 10
osd_objectstore: bluestore
#lvm_volumes:
#  - data: /dev/sda
#  - data: /dev/sdb
osd_scenario: collocated
dmcrypt: true
devices:
  - /dev/sdb
openstack_config: true
kube_pool:
  name: "kube"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
  application: "rbd"
openstack_glance_pool:
  name: "images"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_cinder_pool:
  name: "volumes"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_cinder_backup_pool:
  name: "backups"
  pg_num: 2
  pgp_num: 2
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
openstack_nova_vms_pool:
  name: "vms"
  pg_num: 64
  pgp_num: 64
  rule_name: "replicated_rule"
  type: 1
  erasure_profile: ""
  expected_num_objects: ""
  application: "rbd"
openstack_pools:
  - "{{ kube_pool }}"
  - "{{ openstack_glance_pool }}"
  - "{{ openstack_cinder_pool }}"
  - "{{ openstack_cinder_backup_pool }}"
  - "{{ openstack_nova_vms_pool }}"
EOF
- ping 체크
 
ansible -b -i inventory.ini -m ping all
- ansible playbook site 스크립트를 실행하여 설치
 
 cp site.yml.sample site.yml
INVENTORY="-i inventory.ini"
EXTRA="-e @extra.yaml"
OPTION="-b -vvvv"
PLAY="site.yml"
ansible-playbook $INVENTORY $EXTRA $PLAY $OPTION 
# ansible-playbook -b -vvvv -i inventory.ini -e @extra.yaml site.yaml
ceph ansible remove
cat << EOF | tee purge=cluster.sh 
#!/bin/bash 
set -ex 
INVENTORY="-i inventory.ini"
EXTRA="-e @extra.yaml"
PLAY="infrastructure-playbooks/purge-cluster.yml"
OPTION="-b -vvv"
ansible-playbook $INVENTORY $EXTRA $PLAY $OPTION 
EOF
chmod +x purge=cluster.sh  && purge=cluster.sh
주로 발생한 Error
- /etc/ceph.conf 의 mon host 값 문제
- ceph-ansible 4.0 버전의 Source 는 task 파일의 Jinja template 를 확인해보면
 - mon 호스트를 루프 돌면서 호스트 정보를 찍어주는데
 - mon v2, v1 버전을 마이그래이션 하는 소스가 들어가있다.
 - 그렇기때문에 git 다운받고 checkout stable-3.2 버전으로 실행시키며
 - extra.yaml 에 monitor_address 값을 넣어준다.
 
 - 에러내용
 
fatal: [mon1]: FAILED! => 
  msg: |-
    The conditional check '(ceph_health_raw.stdout != "") and (ceph_health_raw.stdout | default('{}') | from_json)['state'] in ['leader', 'peon']
    ' failed. The error was: No JSON object could be decoded
- 조치사항
 
#조치 1 branch checkout 
$ git checkout stable-3.2
$ vi extre.yaml
---
# extra.yaml 
monitor_interface: eth1
#monitor_address: 10.0.3.2 ## 조치 2 여기부분
public_network: 10.0.3.0/24
cluster_network: 10.0.3.0/24
---
* 참고  : https://github.com/ceph/ceph-ansible/issues/3948
* 참고2 : http://lists.ceph.com/pipermail/ceph-users-ceph.com/2019-February/032801.html
Last modified on 2020-06-01