使用Ansible 2.x中的expect来安装Anaconda
在中文中用一种方式改写以下句子:
背景:
Anaconda提供的用于Linux的安装程序可以在Bash中执行,并以交互方式指定安装目录和进行路径设置。
在使用Ansible安装Anaconda到多台服务器时,对话式安装方式成为了一个问题。以前我用expect来手动解决这个问题,但是听说在2.x版本中添加了expect的模块,所以我决定试试用Ansible2.x来安装Anaconda,也顺便测试一下这个功能是否可行。
我想做的事情
-
- SSHで接続できる対象サーバにAnacondaをインストールする
- 全部Ansibleで完結させる
确认操作环境
-
- ansibleを実行するサーバ
hostname:ansible-server
OS:Ubuntu14.04
対象サーバ
hostname:test-server
OS:Ubuntu14.04
我使用Vagrant准备了这两个服务器并进行了操作确认。
大致流程
-
- 建立Ansible的执行环境
-
- 确认Anaconda安装时的行为
-
- 根据第2点内容创建ansible-playbook
- 确认执行ansible后的操作
1. 搭建Ansible的执行环境
可以使用apt-get命令安装Ansible,但根据操作系统和版本安装2.x系列的步骤略有不同。
对于Ubuntu14.04,可以使用以下命令进行安装。
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
请参考Ansible的安装页面,以了解在Ubuntu以外的操作系统上的安装方法。
安装完成后,可以使用以下命令来确认版本。如果返回版本信息,则表示安装成功。
$ ansible --version
ansible 2.1.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
确认Anaconda安装过程中的行为
请执行Anaconda的安装程序,并确认如何适应每个问题。在本次操作确认中,我们将使用”Anaconda3-4.1.1-Linux-x86_64.sh”。
bash Anaconda3-4.1.1-Linux-x86_64.sh
执行时,将在以下部分要求输入。
Welcome to Anaconda3 4.1.1 (by Continuum Analytics, Inc.)
In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>
在expect模块中定义行为时,需要重点关注需要输入的部分。
第一个 “>>>” 只需要按下回车即可,记住这一点。
要继续进行处理,请按下回车。接下来,你会被要求输入以下内容。
(略)
Anaconda contains open source software packages from third parties. These
--More--
这部分内容只需通过空格翻页即可。
然而,这一部分也需要在expect的模块中正确编写。
虽然标准输出显示为“–More–”,但实际上“:”已经被替换掉了(※),
所以请将“:”视作空格记住。
※:在Mac上进行实验时会显示“:”。而在Ubuntu上似乎考虑得更周到,已经替换成空格了。
进一步推进,你将被要求同意以下内容。
(略)
Do you approve the license terms? [yes|no]
>>>
在这里当然是“是”,所以第二个“>>>”记为“是”。
接下来会出现安装路径确认的提示。
(略)
Anaconda3 will now be installed into this location:
/home/vagrant/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/home/vagrant/anaconda3] >>>
如果您满意默认设置,请按Enter键,然后记住第三个“>>>”是要按Enter键。
按下Enter键后,安装包将开始安装。
安装包安装完成后,将询问是否要将路径添加到.bashrc文件中。
(略)
installation finished.
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/vagrant/.bashrc ? [yes|no]
[no] >>>
因为个人需要,在.bashrc中添加第四个「>>>」,记住它是yes。
现在确认了安装的过程。
根据第2点的内容创建ansible-playbook。
根据2确认的行为,编写Ansible的expect模块。
如果您还想确认其他部分,请参考我的GitHub上上传的ansible-playbook。
我会将先前确认的动作结果写在responses下面。
- name: install anaconda3
expect:
chdir: "/home/{{ target_user }}"
command: "bash {{ anaconda_script }}"
timeout: 360
responses:
'>>>': '\n'
':': ' '
'>>>': 'yes'
'>>>': '\n'
'>>>': 'yes'
become: true
become_method: su
become_user: "{{ target_user }}"
我希望使用group_vars/all指定的target_user权限来安装Anaconda,因此我按照以下方式进行了描述。
become: true
become_method: su
become_user: "{{ target_user }}"
为了使用expect模块,我们需要在之前通过pip安装pexpect模块,因此还需要以下类似的代码。
- name: install pexpect by anaconda pip
pip: name=pexpect
4. 检查ansible执行后的操作是否成功执行
当所有的Ansible playbook都成功执行时,将输出如下信息。
(略)
PLAY RECAP *********************************************************************
test-server : ok=5 changed=4 unreachable=0 failed=0
最后,为了确认操作,我们将登录到测试服务器并检查Anaconda是否已安装。
vagrant@test-server:~$ python
Python 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
如果路径通行正常,当在目标用户上键入python命令时,会出现上述形式,可以确认先前安装的Anaconda4.1.1 Python正在被使用。
总结
此次以Anaconda的安装方法为基础进行解释,但除了Anaconda之外,还有其他类似的一键安装方式可以使用Bash进行交互式安装,可以按照相似的方法进行处理。
如果需要使用Ansible安装这类软件,可以参考此方法。
如果有任何问题或评论,请随时提出。