JuiceFS 云服务自动化部署

获取文件系统信息

自动化部署方式通常不具备人机交互的条件,从客户端安装到部署挂载文件系统的整个过程都要自动完成,因此需要提前准备好文件系统的相关信息,以便于执行自动化任务的工具能够读取。

常用的预先提供信息的方式有以下 2 种:

方式一:环境变量

Linux 和 macOS 系统使用 export 命令创建临时的环境变量,例如,创建一个名为 JFS_TOKEN 的环境变量:

  1. $ export JFS_TOKEN=bbab8801xxxxxxxx90ee3435f3095ffbd5

对于在终端或 Shell 脚本中访问,只需在变量名前添加 $ 符号:

  1. $ echo $JFS_TOKEN
  2. bbab8801xxxxxxxx90ee3435f3095ffbd5

有关于如何在你使用的其他自动化部署工具中读取系统的环境变量,请查阅相关文档了解详情。

方式二:配置文件

JuiceFS 云服务客户端内置的 auth 命令主要用作预先创建文件系统的配置文件,该配置文件记录了文件系统的名称、对象存储、Token 等关键信息。

在挂载文件系统时,客户端总是会先查找并从配置文件中读取密钥等信息,只有当配置文件不存在时才会要求用户手动输入。

例如,为名为 jfs8 的文件系统创建配置文件:

  1. $ sudo juicefs auth jfs8 --token bbab8801xxxxxxxx90ee3435f3095ffbd5 --accesskey LTAI5txxxmxxxxgGDt --secretkey b8Szbxxxxxxxxxxxxxx0oHX1U9

其中,--token 用来指定文件系统的 Token,--accesskey--secretkey 是对象存储的 API 访问密钥。

创建好的配置文件位于 $HOME/.juicefs 目录中,但需要注意,因为这个命令中使用了 sudo 即以超级管理员身份执行的命令,因此配置文件会创建在 root 用户的家目录,即 /root/.juicefs/jfs8.conf

以下是一份配置文件示例:

  1. {
  2. "rootname": "jfs8",
  3. "storage": "oss",
  4. "region": "cn-shanghai",
  5. "bucket": "jfs8.oss-cn-shanghai.aliyuncs.com",
  6. "partitions": 0,
  7. "replicated": false,
  8. "compatible": false,
  9. "public": false,
  10. "blockSize": 4096,
  11. "master": "aliyun-shanghai-1.meta.juicefs.com:9408",
  12. "master_ip": [
  13. "106.4.4.94",
  14. "47.100.10.252",
  15. "47.123.123.227"
  16. ],
  17. "password": "216eea4xxxxxxxxxxx08e5e0cd2cab",
  18. "compress": "lz4",
  19. "accesskey": "LTAI5txxxmxxxxgGDt",
  20. "secretkey": "b8Szbxxxxxxxxxxxxxx0oHX1U9",
  21. "tested": 1,
  22. "token": "bbab8801xxxxxxxx90ee3435f3095ffbd5"
  23. }

Shell 脚本

  1. #!/bin/sh
  2. cd /tmp
  3. curl -L juicefs.com/static/juicefs -o juicefs && chmod +x juicefs
  4. sudo ./juicefs auth "$1" --token "$2" --accesskey "$3" --secretkey "$4"
  5. sudo ./juicefs mount "$1" "$5"

将上述内容保存到 shell 脚本中,如 setup-juicefs.sh,然后使用下面的命令一次性完成挂载:

  1. ./setup-juicefs.sh $JFS_NAME $JFS_TOKEN $ACCESSKEY $SECRETKEY $JFS_MOUNTPONT
提示

--accesskey--secretkey 在某些环境中不是必需的,例如在 AWS 中可以采用 IAM Role 来完成认证。在这种情况下,需要给命令行提供占位符 '' 作为参数。

SaltStack

下面是使用 SaltStack 部署 JuiceFS 的代码样例:

  1. /root/juicefs:
  2. file.managed:
  3. - source: https://juicefs.com/static/juicefs
  4. - mode: 0755
  5. - skip_verify: True
  6. juicefs auth:
  7. cmd.run:
  8. - name: /root/juicefs auth {{jfs_name}} --token {{jfs_token}} --accesskey={{accesskey}} --secretkey={{secretkey}}
  9. - creates: /root/.juicefs/{{jfs_name}}.conf
  10. require:
  11. - file: /root/juicefs
  12. /jfs:
  13. mount.mounted:
  14. - device: {{jfs_name}}
  15. - fstype: juicefs
  16. - mkmnt: True
  17. - opts: _netdev
  18. - device_name_regex:
  19. - JuiceFS:{{jfs_name}}
  20. require:
  21. - cmd: juicefs auth
提示

使用 JuiceFS 命令行工具挂载文件系统时,设备名称会自动添加 JuiceFS: 前缀。因此,需要使用正则表达式进行匹配。

Ansible

使用 Ansible 在本机挂载 JuiceFS 文件系统的 playbook 样例如下:

  1. - hosts: localhost
  2. tasks:
  3. - set_fact:
  4. jfs_bin: /usr/local/bin/juicefs
  5. - get_url:
  6. url: https://juicefs.com/static/juicefs
  7. mode: 0755
  8. dest: "{{jfs_bin}}"
  9. - command: {{jfs_bin}} auth {{jfs_name}} --token {{jfs_token}} --accesskey={{accesskey}} --secretkey={{secretkey}}
  10. args:
  11. creates: /root/.juicefs/{{jfs_name}}.conf
  12. - mount:
  13. path: "{{jfs_path}}"
  14. src: "{{jfs_name}}"
  15. fstype: juicefs
  16. opts: _netdev
  17. state: mounted
提示

如果文件系统绑定的是腾讯云 COS 对象存储,--bucketjuicefs auth 的必要参数,请使用带有 APPID 的完整 endpoint。参见 如何获取对象存储的 API 密钥