金鱼哥RHCA回忆录:RH358提供基于文件的网络存储--自动化调配基于文件的存储

举报
金鱼哥 发表于 2022/05/16 15:38:12 2022/05/16
【摘要】 第十章 提供基于文件的网络存储--自动化调配基于文件的存储

本章节介绍如何使用Ansible提供基于文件的网络存储。这演示也能更好地运用Ansible。

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥


1. 使用Ansible部署NFS服务器

下面是部署NFS服务器和用Ansible配置NFS挂载所需任务的基本概要


安装软件包

使用yum Ansible模块安装nfs-utils包如下:

- name: the package for NFS is installed
  yum:
    name: nfs-utils
    state: present

创建导出目录

可以使用Ansible准备要导出的目录。将state参数设置为directory的file模块在目录不存在时创建该目录。

- name: the directory exists
  file:
    path: /srv/myshare
    owner: root
    group: operators
    mode: '2770'
    state: directory

声明共享

多个文件模块可以部署 /etc/exports 和 /etc/exports.d/*.exports 文件

可以使用copy模块将现有的导出文件部署到NFS服务器。可以使用template模块从jinj2模板创建一个导出文件,Ansible在部署过程中使用Ansible变量和事实自动为托管系统自定义该模板。

以下任务使用 copy 模块创建 /etc/exports.d/share.exports导出文件

- name: the directory is shared
  copy:
    content: "/srv/myshare client1.example.com(rw,no_root_squash)\n"
    dest: /etc/exports.d/share.exports
    owner: root
    group: root
    mode: '0644'
  notify: reload exports

重要:如果Ansible更改了一个导出文件,你应该通知一个重新加载nfs-server服务或运行exportfs -r的处理程序。


启用和启动服务

在您的play任务中,确保nfs-server服务已启用并已启动。

- name: NFS is started and enabled
  service:
    name: nfs-server
    state: started
    enabled: yes

配置防火墙规则

使用Ansible firewalld模块确保对nfs服务的访问是启用的。

- name: the firewall is opened for NFS
  firewalld:
    service: nfs
    state: enabled
    immediate: yes
    permanent: yes

2. 使用Ansible配置NFS客户端

在客户端系统上,使用Ansible yum模块安装nfs-utils包。

要持久地挂载NFS文件系统,请使用Ansible mount模块,将fstype参数设置为NFS。下面的任务使用mount模块从主机上挂载/srv/myshare共享。将从host.example.com放入/data挂载点。如果目录不存在,模块会创建/data目录,并在/etc/fstab中添加一个条目。

- name: the NFS share is mounted and in /etc/fstab
  mount:
    path: /data
    src: host.example.com:/srv/myshare
    state: mounted
    fstype: nfs

3. 使用Ansible部署Samba

使用Ansible部署Samba遵循一个标准流程:

  • 使用yum模块安装samba包。

  • 使用user模块为Samba创建Linux用户。

  • 使用shell或command模块将用户添加到Samba数据库。

  • 使用 file 模块准备要共享的目录。

  • 使用copy或template模块部署/etc/samba/smb.conf配置文件。

  • 使用service模块启动并启用smb服务。

  • 使用firewalld模块打开防火墙端口。


创建仅samba的用户帐户

您添加到Samba数据库的用户帐户需要现有的Linux用户。要创建这些Linux用户,请使用Ansible user模块:

- name: the Linux user for Samba exists
  user:
    name: "{{ item }}"
    shell: /sbin/nologin
    create_home: no
    system: yes
  loop:
    - developer1
    - developer2
    - operator1

当只需要这些帐号进行SMB访问时,请将shell选项设置为/sbin/nologin,以防止用户登录Linux系统。

没有将用户添加到Samba数据库的模块。可以使用command模块调用smbpasswd命令。

如果只是盲目地运行smbpasswd -a,那么用户的密码将在每次运行时重置。如果用户已经存在,并且可能已经从初始设置更改了SMB密码,那么可能不希望这样做。

下面的示例更加复杂,使用pdbedit和regex_search过滤器只在Samba数据库中添加用户并设置用户的密码(如果用户不存在的话):

- name: get the existing Samba users
# 任务执行pdbedit -L命令。该命令列出Samba数据库中的用户及其id,例如operator1:900。该任务在samba db users变量中捕获该输出。
  command: pdbedit -L
  changed_when: False
  register: samba_db_users
  
- name: the users are in the Samba database
  command: smbpasswd -s -a {{ item }}
# 使用-s选项,smbpasswd命令从其输入中读取密码。使用stdin指令为命令提供密码。必须输入两次密码。
  args:
    stdin: "redhat\nredhat"
  loop:
    - developer1
    - developer2
    - operator1
  when: not samba_db_users['stdout'] | regex_search('^' + item + ':.*', multiline=True)
# 该任务使用when条件,并且只对尚未在Samba数据库中运行的用户运行。该条件检查pdbedit -L命令的输出中是否匹配。

为了额外的安全性,与其在任务中公开密码,不如用密码定义一个变量,将该变量存储在一个文件中,然后使用ansible-vault命令加密该文件。


创建共享目录

可以使用Ansible准备要共享的目录。如果目录不存在,则使用state参数设置为directory的file模块创建该目录。记住要在目录上设置SELinux samba_share_t上下文类型

- name: the directory exists
  file:
    path: /srv/smbshare
    owner: root
    group: operators
    mode: '2770'
    state: directory
    setype: samba_share_t

4. 使用Ansible配置SMB客户端

在客户端系统上,使用Ansible yum模块安装cifs-utils包。

可以使用copy或template模块创建和保护凭据文件。下面的示例创建/etc/samba/credentials.txt文件。因为在任务中使用了密码,所以将no_log指令设置为true,这样Ansible就不会在输出中显示它。

- name: the credential file exists
  copy:
    content: "username={{ samba_usermount }}\n\
    password={{ samba_passmount }}\n"
    dest: /etc/samba/credentials.txt
    owner: root
    group: root
    mode: '0600'
    no_log: true

如果要持久地挂载SMB共享,请使用Ansible mount模块,并将fstype参数设置为cifs。使用opts参数声明凭据文件和其他挂载选项。下面的任务使用mount模块从主机上挂载SMB data共享。从host.example.com装入/smbdata挂载点。如果目录不存在,模块会创建/smbdata目录,并在/etc/fstab中添加一个条目。

- name: the SMB share is mounted and in /etc/fstab
  mount:
    path: /smbdata
    src: "//host.example.com/data"
    opts: "credentials=/etc/samba/credentials.txt,multiuser,seal"
    state: mounted
    fstype: cifs

用户登录时必须手动运行cifscreds输入个人SMB凭据,以便当前会话验证到SMB共享。


5. 课本练习

[student@workstation ~]$ lab filestorage-automation start

  • 在练习的第一部分中,将完成并运行Ansible Playbook,它使用NFS在serverd上导出目录。运行一个剧本将NFS导出挂载到servera上。

  • 在练习的第二部分中,将完成并运行一个Ansible Playbook,它在serverd上使用SMB共享一个目录。运行一个剧本将SMB共享挂载到servera上。


1. 熟悉项目。

[student@workstation ~]$ cd /home/student/filestorage-automation
[student@workstation filestorage-automation]$ tree
.
├── ansible.cfg
├── inventory
├── nfs_client.yml
├── nfs_server.yml
├── smb_client.yml
├── smb_server.yml
├── smb_vars.yml
├── solution
│   ├── nfs_server.yml
│   └── smb_server.yml
└── templates
    ├── share.exports.j2
    └── smb.conf.j2

2 directories, 11 files
[student@workstation filestorage-automation]$ cat inventory 
[servers]
serverd.lab.example.com

[clients]
servera.lab.example.com
serverb.lab.example.com
serverc.lab.example.com
[student@workstation filestorage-automation]$ cat ansible.cfg 
[defaults]
inventory=inventory
remote_user=devops

2. 检查并完成nfs-server.yml Ansible剧本。

创建/nfsshare目录并使用NFS导出它。

[student@workstation filestorage-automation]$ cat nfs_server.yml 
---
- name: Export a directory using NFS
  hosts: serverd.lab.example.com
  become: true
  vars:
    shared_dir: /nfsshare

  tasks:
    - name: the nfs-utils package is installed
      yum:
        name: nfs-utils
        state: present

    - name: the directory exists
      file:
        path: "{{ shared_dir }}"
        owner: student
        group: root
        mode: '0755'
        state: directory

    - name: the directory is exported
      template:
        src: templates/share.exports.j2
        dest: /etc/exports.d/share.exports
        owner: root
        group: root
        mode: '0644'
      notify: reload exports

    - name: the nfs-server service is started and enabled
      service:
        name: nfs-server
        state: started
        enabled: yes

    - name: the nfs firewall service is opened
      firewalld:
        service: nfs
        state: enabled
        immediate: yes
        permanent: yes

  handlers:
    - name: reload exports
      service:
        name: nfs-server
        state: reloaded

3. 检查templates/share.exports.j2模板。

# 该模板循环遍历清单中clients组中的主机名。模板为组中的每个客户端授予读写权限(rw)。
[student@workstation filestorage-automation]$ cat templates/share.exports.j2 
{{ shared_dir }}{% for host in groups['clients'] %}
 {{ host }}(rw)
{%- endfor %}

# 运行模板,会输出如下:
/nfsshare servera.lab.example.com(rw) serverb.lab.example.com(rw) serverc.lab.example.com(rw)

# 模板没有设置no_root_squash选项。如果没有这个选项,NFS将客户机上来自root的请求映射到服务器上的nobody用户帐户。nobody用户没有对/nfsshare目录的写权限。因此,在客户机上,root用户将不能写入。

4. 检查nfs_server.yml的语法并运行。

[student@workstation filestorage-automation]$ ansible-playbook nfs_server.yml --syntax-check
[student@workstation filestorage-automation]$ ansible-playbook nfs_server.yml

5. 检查并运行nfs_client.yml Ansible剧本。

[student@workstation filestorage-automation]$ cat nfs_client.yml
---
- name: Access an NFS export
  hosts: servera.lab.example.com
  become: true
  vars:
    shared_dir: /nfsshare
    mount_point: /datanfs

  tasks:
    - name: the nfs-utils package is installed
      yum:
        name: nfs-utils
        state: present

    - name: the NFS export is mounted and in /etc/fstab
      mount:
        path: "{{ mount_point }}"
        src: serverd.lab.example.com:{{ shared_dir }}
        state: mounted
        fstype: nfs

[student@workstation filestorage-automation]$ ansible-playbook nfs_client.yml --syntax-check
[student@workstation filestorage-automation]$ ansible-playbook nfs_client.yml

6. 登录servera并确认NFS是可访问的。

[student@servera ~]$ df /datanfs
Filesystem                        1K-blocks    Used Available Use% Mounted on
serverd.lab.example.com:/nfsshare  10474496 2285056   8189440  22% /datanf
[student@servera ~]$ echo Hello World > /datanfs/test.txt
[student@servera ~]$ ls /datanfs
test.txt
[student@servera ~]$ cat /datanfs/test.txt
Hello World

[student@servera ~]$ sudo -i
[sudo] password for student: student
[root@servera ~]# echo Hello World > /datanfs/root_test.txt
-bash: /datanfs/root_test.txt: Permission denied

7. 检查smb-vars.yml文件。

# 该文件定义变量,smb_server.yml smb_client.yml剧本使用。该文件被加密,因为它包含密码。
# ansible-vault view命令用来显示smb_vars.yml文件的内容。密码为redhat。
[student@workstation filestorage-automation]$ ansible-vault view smb_vars.yml
Vault password: redhat
---
shared_dir: /smbshare
share_name: smbshare
mount_point: /developments

# User account for mounting the share
samba_usermount: sambamount
samba_passmount: redhat

# User accounts with write access to the share
allowed_group: developers
samba_users:
  - name: developer1
    password: redhat
  - name: developer2
    password: redhat

8. 检查并完成smb_server.yml Ansible剧本。

该脚本创建/smbshare目录,创建用户帐户,并使用SMB共享该目录。

[student@workstation filestorage-automation]$ cat smb_server.yml 
---
- name: Share a directory with SMB
  hosts: serverd.lab.example.com
  become: true
  vars_files:
    - smb_vars.yml

  tasks:
    - name: the samba package is installed
      yum:
        name: samba
        state: present

    # Creating the Linux and Samba user for the multiuser mount.
    # That user is only used to mount the share.

    - name: the Linux user for Samba mount exists
      user:
        name: "{{ samba_usermount }}"
        shell: /sbin/nologin
        create_home: no
        system: yes

    - name: the Samba user for Samba mount exists
      command: smbpasswd -s -a {{ samba_usermount }}
      args:
        stdin: "{{ samba_passmount }}\n{{ samba_passmount }}"

    # Group and users with write access to the share

    - name: the Linux group exists
      group:
        name: "{{ allowed_group }}"
        system: yes

    - name: the Linux users exist for Samba users
      user:
        name: "{{ item['name'] }}"
        shell: /sbin/nologin
        groups:
          - "{{ allowed_group }}"
      loop: "{{ samba_users }}"
      no_log: true

    - name: the Samba users exist
      command: smbpasswd -s -a {{ item['name'] }}
      args:
        stdin: "{{ item['password'] }}\n{{ item['password'] }}"
      loop: "{{ samba_users }}"
      no_log: true

    - name: the directory exists
      file:
        path: "{{ shared_dir }}"
        owner: root
        group: "{{ allowed_group }}"
        mode: '2775'
        state: directory
        setype: samba_share_t

    - name: the directory is shared
      template:
        src: templates/smb.conf.j2
        dest: /etc/samba/smb.conf
        owner: root
        group: root
        mode: '0644'
        setype: samba_etc_t
      notify: reload smb

    - name: the smb service is started and enabled
      service:
        name: smb
        state: started
        enabled: yes

    - name: the samba firewall service is opened
      firewalld:
        service: samba
        state: enabled
        immediate: yes
        permanent: yes

  handlers:
    - name: reload smb
      service:
        name: smb
        state: reloaded

9. 检查templates/smb.conf.j2模板。

该模板设置全局SMB参数并创建一个共享。不需要更改该文件中的任何内容。

[student@workstation filestorage-automation]$ cat templates/smb.conf.j2
[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        smb encrypt = required
        server min protocol = SMB3

[{{ share_name }}]
        path = {{ shared_dir }}
        write list = @{{ allowed_group }}
# 对于创建多个共享的剧本,模板可能会使用jinj2循环来创建共享。

10. 验证smb_server.yml剧本的语法并运行。

[student@workstation filestorage-automation]$ ansible-playbook --ask-vault-pass --syntax-check smb_server.yml
Vault password: redhat

playbook: smb_server.yml
[student@workstation filestorage-automation]$ ansible-playbook --ask-vault-pass smb_server.yml
Vault password: redhat
...output omitted...

11. 检查并运行smb_client.yml Ansible剧本。

[student@workstation filestorage-automation]$ cat smb_client.yml
---
- name: Access an SMB share
  hosts: servera.lab.example.com
  become: true
  vars_files:
   - smb_vars.yml

  tasks:
    - name: the cifs-utils package is installed
      yum:
        name: cifs-utils
        state: present

    - name: the credential file exists
      copy:
        content: "username={{ samba_usermount }}\n\
                  password={{ samba_passmount }}\n"
        dest: /etc/samba/creds.txt
        owner: root
        group: root
        mode: '0600'
      no_log: true

    - name: the SMB share is mounted
      mount:
        path: "{{ mount_point }}"
        src: "//serverd.lab.example.com/{{ share_name }}"
        opts: "credentials=/etc/samba/creds.txt,multiuser,seal"
        state: mounted
        fstype: cifs

    - name: the Linux users exist
      user:
        name: "{{ item.name }}"
        shell: /bin/bash
        password: "{{ item.password | \
                   password_hash('sha512', 'redhatsalt') }}"
      loop: "{{ samba_users }}"
      no_log: true

[student@workstation filestorage-automation]$ ansible-playbook --ask-vault-pass smb_client.yml
Vault password: redhat
...output omitted...

12. 登录servera并确认SMB共享可访问。

[student@servera ~]$ df /developments
df: /developments: Permission denied
[student@servera ~]$ mount | grep /developments
//serverd.lab.example.com/smbshare on /developments type cifs(rw,...,multiuser,...,seal,...)

[student@servera ~]$ su - developer1
Password: redhat
[developer1@servera ~]$ cifscreds add serverd.lab.example.com
Password: redhat
[developer1@servera ~]$ echo Hello World > /developments/test.txt
[developer1@servera ~]$ ls /developments
test.txt
[developer1@servera ~]$ cat /developments/test.txt
Hello World

完成实验

[student@workstation ~]$ lab filestorage-automation finish


总结

  • 介绍使用Ansible部署NFS服务器。
  • 介绍使用Ansible部署Samba。
  • 介绍使用Ansible配置NFS客户端和Samba客户端。

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第十章 提供基于文件的网络存储–自动化调配基于文件的存储 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。