金鱼哥RHCA回忆录:RH358提供基于文件的网络存储--自动化调配基于文件的存储
本章节介绍如何使用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 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)