在离线实际环境中构建机器学习执行环境的场景和使用Ansible进行构建自动化的方法(后篇)
第一版:2020年12月5日
作者:日立解决方案株式会社的堤友希。
监修:日立制作株式会社
首先
本文将展示如何使用基础架构自动化工具Ansible,将前一篇中繁琐的在验证服务器上进行的离线环境安装的步骤自动化。
通过自动化,可以减少工作量,在定期更新生产环境的任何软件包等情况下。
*前一个部分我们正在访问Anaconda仓库,但如果要在商业环境中使用Anaconda仓库,则需要购买Anaconda商业版等许可证。详情请查阅下方链接:
https://www.anaconda.com/terms-of-service
稿件列表
1. 在离线生产环境中构建机器学习执行环境的场景以及使用Ansible进行自动化构建(前篇)
2. 在离线实际环境中构建机器学习执行环境的场景和使用Ansible进行自动化构建(下篇)… 本文投稿
Ansible的概述
首先,我們將解釋一下Ansible的概述。
以下是各基礎設施建構自動化工具的特點比較(Table 1)。
与其他基础设施自动化工具如Puppet和Chef相比,Ansible以无需Ruby等编程知识和无需代理的特点著称。
目标服务器会收到一个已经安装了Ansible的控制器服务器发送来的构建脚本执行请求。
图1:Ansible的使用场景
在Dockerfile中可以实现自动化吗?
如果要利用容器,可以通过Dockerfile自动化。
祇須,我們將介紹一種使用Ansible的方法,即使在不使用容器的情況下也可以應對。
Ansible使用于环境的建立。
为了在验证环境中使用Ansible,需要将Ansible安装到控制器服务器上,并对目标服务器进行连通性检查。
以下图片显示了连通性确认的范围和服务器之间的关系。
图2 描述了连接确认范围(红框)以及服务器之间的关系。
#controllerサーバにAnsibleをインストールします。
[root@localhost ~]# yum install epel-release –y
[root@localhost ~]# yum install ansible -y
#続いてtargetサーバにpingモジュールで疎通確認します。
#鍵チェックする設定の場合、controller-target間で通信に鍵が必要なので、鍵生成/受け渡しをしておきます。
[root@localhost ~]# ssh-keygen -t rsa #鍵の生成
[root@localhost ~]# ssh-copy-id <targetのIPaddress>@<targetのホスト名> #鍵を渡す
[root@localhost ~]# ssh <targetのIP address> #ssh接続確認
#Ansibleが利用するtargetの情報を記載したinventoryファイルを作成しておきます。
[root@localhost ~]# cat inventory.txt
ansible_host=<targetのIPaddress> ansible_ssh_pass=<targetへのssh接続時パスワード>
#疎通が成功すると、以下のように返答されます。
#これで、自動化スクリプト実行スクリプト実行リクエストがtargetサーバに通信可と確認できました。
[root@localhost ~]# ansible <targetのホスト名> -m ping -i inventory.txt
<targetのホスト名> | SUCCESS => {
"changed": false,
"ping": "pong"
}
图3 是 Ansible 使用环境建设的示例。
角色和自动化范围。
在Ansible中,我们执行以yaml格式编写的自动化脚本称为playbook。
另外,在“角色”功能中,可以将自动化内容进行分割和整理。
我们建立了以下这样的角色结构,并展示了各自的自动化范围。
图4 中的角色和自动化范围
表2 各角色及其自动化内容
proenv_auto.yml是一个主要的playbook,按照conda-install→env-setting→dev-channel的顺序执行各个角色任务main.yml(即子playbook)的顶层。
Ansible能够识别存在于执行playbook的目录中的roles目录层次结构。
执行顺序在主playbook中定义,叫做子playbook。
各个角色中存在的文件和变量在子Playbook执行时用于脚本和变量定义。
自动化模板用于安装Miniconda。
由于在生产环境中如果不需要在许多服务器上执行相同的操作,无法准备用于Ansible的控制服务器,因此不将包安装自动化包括在内。
作为替代,将记述创建安装软件包的Shell脚本的方法。
在proenv_auto目录的主要playbook中,我们记录了所有roles的共同变量定义,roles执行顺序以及目标服务器的信息。
这里展示了这次主要的playbook,名为proenv_auto.yml的内容。
图5 proenv_auto.yml
下面展示了inventory.txt文件中记录的从controller服务器到target服务器所需的通信信息。
第六张图库清单文件。
根据proenv_auto.yml中的说明,roles将从conda-install中执行。
我展示conda-install任务文件夹中main.yml的内容。
图7 conda-install中的tasks主目录下的main.yml
我会展示conda-install vars下的main.yml文件的内容。
在这里定义了conda-install特定的变量名,
当Miniconda安装程序发生变化时,
可以对安装程序名称的变更进行相应调整。
请将conda-install下的vars文件夹中的main.yml参考图8进行释义。
接下来将执行env-setting。以下是env-setting文件夹中tasks文件夹下的main.yml的内容。
在`env-setting`的`tasks`文件夹下的`main.yml`中的图9
当安装Miniconda时,将进行Miniconda的初始化处理,并对CentOS或RHEL的根目录下的.bashrc文件进行修改。
在接下来的部分中,我们将使用Ansible来利用通过初始化处理所进行的.bashrc的修改。
使用Ansible自动化安装的Miniconda将通过批处理选项进行安装,但在此情况下将不会执行Miniconda的初始化过程。
因此,首先需要手动安装Miniconda,并利用安装过程中初始化处理所更改的.bachrc文件。
图10. .bashrc
任何软件包的下载和自定义渠道自动化模板。
继conda-install之后,将运行dev-channel。
以下是dev-channel的任务下的main.yml文件的内容。
在这个main.yml文件中,我们将进行任意软件包的安装和下载信息的获取,以及实施自定义渠道化。
请给我提供一个选项。 (Please provide me with one option.)
以下是在main.yml中执行的两个shell脚本dev_channel.sh和dev_channel2.sh的内容。
每个dev_channel.sh都负责安装任意软件包并获取下载信息,而dev_channel2.sh负责将任意软件包进行自定义通道化操作。
如果在Shell脚本中没有将初始化Miniconda添加到.bashrc文件中所示的位置,将会在执行playbook时发生错误,因此需要将其添加进去。
第12个图表的dev_channel.sh
第13图:dev_channel2.sh
将软件包安装自动化模板应用于生产环境。
在正式环境中,您可以使用以下的Shell脚本来安装任意软件包。
#!/bin/sh
初期化が反映された部分。
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init’ !!
__conda_setup="$('/root/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)“
if [ $? -eq 0 ]; then
eval "$__conda_setup“
else
if [ -f "/root/miniconda3/etc/profile.d/conda.sh" ]; then
. "/root/miniconda3/etc/profile.d/conda.sh“
else
export PATH="/root/miniconda3/bin:$PATH“
fi
fi
unset __conda_setup
# <<< conda initialize <<<
#前提条件
#①Minicondaのインストールは手動で実施
#②/rootにカスタムチャネルが存在すること
#③UnsatisfiableErrorのデバッグが完了していること
conda create -n proenv -y --offline && \
conda config --add channels /root/proenv-custom-channel && \
conda config --remove channels defaults && \
conda activate proenv && \
conda install --quiet --yes 'python=3.7.6' && \
conda install --quiet --yes 'notebook=6.0.3' && \
conda install --quiet --yes 'tensorflow=2.1.0'
图14的proenv_build.sh
概括
在这篇投稿中,我们展示了使用Ansible自动化来进行环境搭建的技巧。
希望您可以利用自動化來提高效率,例如在更新生產環境中的任意套件時,可以簡化繁瑣的步驟。