使用动态库存功能将Ansible应用于EC2动态主机
版本和源代码仓库
只包含重要源代码。如需查看所有源代码,请参考以下存储库。
- https://github.com/katsuhiko/ec2-playbooks
概括一下
每次创建EC2实例都要检查全局IP并执行playbook非常麻烦。使用ec2.py的动态清单,可以对带有标签的EC2实例执行playbook。
请记录一下先执行所有步骤后的执行方法。
执行方法
- hosts の確認
$ ansible-playbook -i production ec2-rails.example.yml --list-hosts
- ansible の実行
$ ansible-playbook -i production ec2-rails.example.yml
只需要一個選項:做好準備。
对 EC2 实例进行标签化
在执行Ansible的EC2实例上进行标签化处理。
创建两个标签,即env(环境)和role(角色)。
安装Boto
要使用ec2.py,需要boto库。
$ pip install boto
在上述中,可以使用ansible进行安装,但如果要在虚拟环境中创建ansible执行环境,则也可以使用ansible进行boto的安装。
- name: Add repository for ansible
apt_repository: repo='ppa:ansible/ansible' state=present
- name: Install ansible and pip
apt: name={{ item }} state=latest
with_items:
- ansible
- python-pip
- name: Install boto
pip: name={{ item }} state=latest
with_items:
- boto
创建共享凭证
AWS 的連接使用共享憑證。雖然有許多不同的設定方法,但目前來說,我認為使用共享憑證是最好的選擇。
创建 ~/.aws/credentials 文件,并设置密钥信息。
我认为以下网站可以作为创建密钥信息的参考:
http://dev.classmethod.jp/cloud/aws-cli-credential-config/
[default]
aws_access_key_id = XXXXXXXX
aws_secret_access_key = XXXXXXXX
准备 ec2.py 和 ec.ini。
我已参考此处的内容。
将ec2.py和ec2.ini从以下位置获取并放置在production目录下。
ec2.py的下载地址为:https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
ec2.ini的下载地址为:https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
关于目录结构,我们参考了http://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout,并按照其创建了类似https://github.com/katsuhiko/ec2-playbooks的目录结构。
对 ec2.ini 进行自定义设置 1。
只需记录更改部分。
- Tokyo Region を指定します。
regions = ap-northeast-1
- 利用しない AWS のサービスを利用しないようにします。IAM で作成したユーザーに権限がない場合、Forbidden が発生したためです。Forbidden が発生した場合、権限を確認するのが良さそうです。
rds = False
elasticache = False
- 常に最新の情報を取得するようにします。
cache_max_age = 0
ec2.ini的第二次自定义
根据ec2.ini末尾的示例定义instance_filters。
在hosts playbook中也可以通过指定标签来实现AND条件的筛选。
在 ec2.ini 中,我们将 env 和 role 标签中的 env 标签筛选为“production”。
instance_filters = tag:env=production
私钥的指定
为了避免每次都需要指定亚马逊的 pem 文件,我们创建了一个 ansible.cfg 文件,其中指定了 pem 文件。
[defaults]
private_key_file=~/.ssh/xxx.pem
执行
播放谱样本
在剧本的主机部分使用角色标签作为筛选条件,标签名为”rails”。
标签的写法是tag_[标签名]_[标签值]。
这样可以通过env标签和role标签的每个值进行AND条件的筛选。
远程用户也可以在playbook中指定。虽然也可以在ansible.cfg中指定,但是通过playbook指定后可以立即知道使用哪个用户进行ssh连接,所以我认为最好在playbook中指定。
- hosts: tag_role_rails
remote_user: ec2-user
sudo: yes
vars:
rbenv_user: ec2-user
rbenv_ruby_version: 2.2.2
nginx_includes: ["/var/apps/*/shared/config/nginx.conf"]
roles:
- ec2-yum-update
- ec2-rbenv
- ec2-nodejs
- ec2-railsenv
- ec2-nginx
- ec2-appenv
请参考使用Ansible在EC2上部署Rails服务器的操作手册。
主持人的确认
当指定 –list-hosts 选项时,可以查看要执行 ansible 的主机。
$ ansible-playbook -i production ec2-rails.example.yml --list-hosts
使用Ansible进行执行
$ ansible-playbook -i production ec2-rails.example.yml
印象
每次创建 EC2 实例后,不需要每次都确认 IP 地址就可以运行了。
虽然我还没有试过,但我认为它也可以与 Auto Scale 兼容。
我想要另外尝试一下 EC2 实例的自动扩展功能。