使用Packer和ansible-local的起始步骤
Packer是由Vagrant的作者Mitchell Hashimoto创建的用于创建各种预安装镜像的工具,从版本0.3.10开始,支持作为Ansible的Provisioner。
这个公式文档在这里,但内容过于简洁,所以我会简单地列举一些基本步骤。
首先,这个 Provisioner 是以将 playbook 传输到服务器并在本地执行的方式,而不是使用常规的远程执行方式,因此需要事先在目标服务器上安装 Ansible。无论是在 Vagrant 还是 Amazon AMI 等环境中,似乎很少有已经安装了 Ansible 的情况,所以首先需要先安装 Ansible。
为了实现这一目的,可以使用Shell Provisioner。按照所需平台的要求,以以下方式安装Ansible(请根据环境适当地调整yum软件包安装的命令,以下是在Amazon Linux中的示例)。
{
"type": "shell",
"inline": [
"sudo yum install gcc python-devel python-crypto python-pip -y",
"sudo pip install ansible"
]
}
下一步是传输Ansible playbook,如果遵循推荐的目录结构,还需要传输所需的角色目录,这可以通过在Ansible配置中指定role_paths来完成。
然而,如果还创建了项目特有的模块,或者将默认变量整理到 group_vars 或 host_vars 等目录中,也需要将这些文件传输过去。为此,可以使用 File Provisioner。在开始之前,需要先创建目标目录。整个流程如下所示。
-
- 先の Ansible インストール時に Ansible 用の実行ディレクトリ ( staging_directory ) を作成
-
- File Provisioner で必要なモジュールなどを staging_directory にアップロード
- Ansible Provisioner では staging_directory に最初に指定したディレクトリを指定
供应商的整体设置如下。staging_directory被设置为/tmp/ansible-local。文件供应程序的src指定遵循rsync风格,所以请注意,在指定目录时,末尾是否添加斜杠会影响其行为。
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum install gcc python-devel python-crypto python-pip -y",
"sudo pip install ansible",
"mkdir -p /tmp/ansible-local"
]
},
{
"type": "file",
"source": "ansible/library",
"destination": "/tmp/ansible-local"
},
{
"type": "ansible-local",
"playbook_file": "ansible/playbook.yml",
"role_paths": [
"ansible/roles/app"
],
"staging_directory": "/tmp/ansible-local"
}
]
总而言之,
-
- Shell Provisioner で Ansible をインストール
- File Provisioner で必要なファイルやディレクトリを転送
使用Packer+Ansible的组合是开始的第一步。
我认为这可能取决于工具的基本设计,但我也想直接远程执行Ansible。
Packer 0.8 以下的注意事項
在版本0.8中,SSH连接默认不再使用PTY(CHANGELOG)。因此,shell provisioner中的第一个ansible安装被删除。
sudo:对不起,您必须有一个终端才能运行 sudo。
为了避免发生上述错误,您需要在构建器的设置中将ssh_pty设置为true。(ssh_pty设置)
"builders": [{
"type": "amazon-ebs",
"ssh_pty": true,
: