RH358提供基于文件的网络存储--自动化调配基于文件的存储

简介: RH358提供基于文件的网络存储--自动化调配基于文件的存储

RH358提供基于文件的网络存储–自动化调配基于文件的存储

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

RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html

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客户端。
  • 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。

目录
相关文章
|
1月前
|
网络协议 Ubuntu Linux
linux网络配置文件
Linux网络配置文件因发行版不同而异:Ubuntu使用`/etc/network/interfaces`,Red Hat系列采用`/etc/sysconfig/network-scripts/ifcfg-ethX`,CentOS用`/etc/sysconfig/network`设置主机名和网关,`/etc/resolv.conf`配置DNS。其他文件如`/etc/hostname`和`/etc/nsswitch.conf`也影响网络设置。编辑这些文件时,记得先备份,并可能需重启网络服务以应用更改。具体操作应参考相应Linux发行版的文档。
11 1
|
2月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
35 0
|
1月前
|
存储 分布式计算 Hadoop
Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 01】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)
45 3
|
4天前
|
JavaScript 前端开发 UED
在 JavaScript 中,异步编程和回调函数是处理非阻塞操作(如网络请求、文件读写等)的重要工具
【5月更文挑战第10天】JavaScript中的异步编程和回调函数用于处理非阻塞操作,提高应用响应性和吞吐量。异步编程通过回调函数、Promises和async/await等方式实现,避免程序因等待操作完成而阻塞。回调函数是异步操作完成后调用的函数,常用于处理网络请求等。然而,回调函数存在嵌套问题和错误处理困难,因此出现了Promises和async/await等更优解决方案。
10 3
|
1月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
77 2
|
3月前
|
存储 自然语言处理 数据可视化
【办公自动化】用Python按时间分割txt文件中的数据
【办公自动化】用Python按时间分割txt文件中的数据
59 1
|
23小时前
|
JavaScript 前端开发 网络安全
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
【网络安全 | 信息收集】JS文件信息收集工具LinkFinder安装使用教程
10 4
|
29天前
|
SQL 存储 分布式计算
Hive【基础 01】核心概念+体系架构+数据类型+内容格式+存储格式+内外部表(部分图片来源于网络)
【4月更文挑战第6天】Hive【基础 01】核心概念+体系架构+数据类型+内容格式+存储格式+内外部表(部分图片来源于网络)
35 1
|
29天前
|
存储 负载均衡 监控

热门文章

最新文章