使用动态库存功能将Ansible应用于EC2动态主机

版本和源代码仓库

versionansible 1.9.2boto 2.38.0

只包含重要源代码。如需查看所有源代码,请参考以下存储库。

    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(角色)。

キー値envproductionrolerails

安装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 实例的自动扩展功能。

广告
将在 10 秒后关闭
bannerAds