4.4. 使用 ceph_orch_host 模块添加或删除主机

作为存储管理员,您可以使用 Ansible playbook 中的 ceph_orch_host 模块添加和删除存储集群中的主机。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 将节点注册到 CDN 并附加订阅。
  • 具有 sudo 的 Ansible 用户,对存储集群中的所有节点进行免密码 SSH 访问。
  • 在 Ansible 管理节点上安装 cephadm-ansible 软件包。
  • 新主机具有存储集群的公共 SSH 密钥。有关将存储集群的公共 SSH 密钥复制到新主机的更多信息,请参阅 Red Hat Ceph Storage 安装指南中的添加主机

流程

  1. 使用以下步骤在集群中添加新主机:

    1. 登录 Ansible 管理节点。
    2. 进入 Ansible 管理节点上的 /usr/share/cephadm-ansible 目录:

      示例

      [ceph-admin@admin ~]$ cd /usr/share/cephadm-ansible

    3. 将新主机和标签添加到 Ansible 清单文件。

      语法

      sudo vi INVENTORY_FILE
      
      NEW_HOST1 labels="['LABEL1', 'LABEL2']"
      NEW_HOST2 labels="['LABEL1', 'LABEL2']"
      NEW_HOST3 labels="['LABEL1']"
      
      [admin]
      ADMIN_HOST monitor_address=MONITOR_IP_ADDRESS labels="['ADMIN_LABEL', 'LABEL1', 'LABEL2']"

      示例

      [ceph-admin@admin cephadm-ansible]$ sudo vi hosts
      
      host02 labels="['mon', 'mgr']"
      host03 labels="['mon', 'mgr']"
      host04 labels="['osd']"
      host05 labels="['osd']"
      host06 labels="['osd']"
      
      [admin]
      host01 monitor_address= 10.10.128.68 labels="['_admin', 'mon', 'mgr']"

      注意

      如果您之前已将新主机添加到 Ansible 清单文件,并在主机上运行 preflight playbook,请跳至第 3 步。

    4. 使用 --limit 选项运行 preflight playbook:

      语法

      ansible-playbook -i INVENTORY_FILE cephadm-preflight.yml --extra-vars "ceph_origin=rhcs" --limit NEWHOST

      示例

      [ceph-admin@admin cephadm-ansible]$ ansible-playbook -i hosts cephadm-preflight.yml --extra-vars "ceph_origin=rhcs" --limit host02

      preflight playbook 在新主机上安装 podmanlvm2chronydcephadm。安装完成后,cephadm 驻留在 /usr/sbin/ 目录中。

    5. 创建 playbook 以将新主机添加到集群中:

      语法

      sudo vi PLAYBOOK_FILENAME.yml
      
      ---
      - name: PLAY_NAME
        hosts: HOSTS_OR_HOST_GROUPS
        become: USE_ELEVATED_PRIVILEGES
        gather_facts: GATHER_FACTS_ABOUT_REMOTE_HOSTS
        tasks:
          - name: NAME_OF_TASK
            ceph_orch_host:
              name: "{{ ansible_facts['hostname'] }}"
              address: "{{ ansible_facts['default_ipv4']['address'] }}"
              labels: "{{ labels }}"
            delegate_to: HOST_TO_DELEGATE_TASK_TO
      
          - name: NAME_OF_TASK
            when: inventory_hostname in groups['admin']
            ansible.builtin.shell:
              cmd: CEPH_COMMAND_TO_RUN
            register: REGISTER_NAME
      
          - name: NAME_OF_TASK
            when: inventory_hostname in groups['admin']
            debug:
              msg: "{{ REGISTER_NAME.stdout }}"

      注意

      默认情况下,Ansible 在与 playbook 的 hosts 行匹配的主机上执行所有任务。ceph orch 命令必须在包含管理员密钥环和 Ceph 配置文件的主机上运行。使用 delegate_to 关键字指定集群中的 admin 主机。

      示例

      [ceph-admin@admin cephadm-ansible]$ sudo vi add-hosts.yml
      
      ---
      - name: add additional hosts to the cluster
        hosts: all
        become: true
        gather_facts: true
        tasks:
          - name: add hosts to the cluster
            ceph_orch_host:
              name: "{{ ansible_facts['hostname'] }}"
              address: "{{ ansible_facts['default_ipv4']['address'] }}"
              labels: "{{ labels }}"
            delegate_to: host01
      
          - name: list hosts in the cluster
            when: inventory_hostname in groups['admin']
            ansible.builtin.shell:
              cmd: ceph orch host ls
            register: host_list
      
          - name: print current list of hosts
            when: inventory_hostname in groups['admin']
            debug:
              msg: "{{ host_list.stdout }}"

      在本例中,playbook 将新主机添加到集群中,并显示当前的主机列表。

    6. 运行 playbook 以将其他主机添加到集群中:

      语法

      ansible-playbook -i INVENTORY_FILE PLAYBOOK_FILENAME.yml

      示例

      [ceph-admin@admin cephadm-ansible]$ ansible-playbook -i hosts add-hosts.yml

  2. 使用以下步骤从集群中删除主机:

    1. 登录 Ansible 管理节点。
    2. 进入 Ansible 管理节点上的 /usr/share/cephadm-ansible 目录:

      示例

      [ceph-admin@admin ~]$ cd /usr/share/cephadm-ansible

    3. 创建 playbook 以从集群中删除主机或主机:

      语法

      sudo vi PLAYBOOK_FILENAME.yml
      
      ---
      - name: NAME_OF_PLAY
        hosts: ADMIN_HOST
        become: USE_ELEVATED_PRIVILEGES
        gather_facts: GATHER_FACTS_ABOUT_REMOTE_HOSTS
        tasks:
          - name: NAME_OF_TASK
            ceph_orch_host:
              name: HOST_TO_REMOVE
              state: STATE
      
          - name: NAME_OF_TASK
            ceph_orch_host:
              name: HOST_TO_REMOVE
              state: STATE
            retries: NUMBER_OF_RETRIES
            delay: DELAY
            until: CONTINUE_UNTIL
            register: REGISTER_NAME
      
          - name: NAME_OF_TASK
            ansible.builtin.shell:
              cmd: ceph orch host ls
            register: REGISTER_NAME
      
          - name: NAME_OF_TASK
              debug:
                msg: "{{ REGISTER_NAME.stdout }}"

      示例

      [ceph-admin@admin cephadm-ansible]$ sudo vi remove-hosts.yml
      
      ---
      - name: remove host
        hosts: host01
        become: true
        gather_facts: true
        tasks:
          - name: drain host07
            ceph_orch_host:
              name: host07
              state: drain
      
          - name: remove host from the cluster
            ceph_orch_host:
              name: host07
              state: absent
            retries: 20
            delay: 1
            until: result is succeeded
            register: result
      
           - name: list hosts in the cluster
             ansible.builtin.shell:
               cmd: ceph orch host ls
             register: host_list
      
           - name: print current list of hosts
             debug:
               msg: "{{ host_list.stdout }}"

      在本例中,playbook 任务排空 host07 上的所有守护进程,从集群中删除主机,并显示当前主机列表。

    4. 运行 playbook 以从集群中删除主机:

      语法

      ansible-playbook -i INVENTORY_FILE PLAYBOOK_FILENAME.yml

      示例

      [ceph-admin@admin cephadm-ansible]$ ansible-playbook -i hosts remove-hosts.yml

验证

  • 查看 Ansible 任务输出显示集群中主机的当前列表:

    示例

    TASK [print current hosts] ******************************************************************************************************
    Friday 24 June 2022  14:52:40 -0400 (0:00:03.365)       0:02:31.702 ***********
    ok: [host01] =>
      msg: |-
        HOST    ADDR           LABELS          STATUS
        host01  10.10.128.68   _admin mon mgr
        host02  10.10.128.69   mon mgr
        host03  10.10.128.70   mon mgr
        host04  10.10.128.71   osd
        host05  10.10.128.72   osd
        host06  10.10.128.73   osd