ansible 并重新加载AWS动态库存

ansible 并重新加载AWS动态库存

也可以看看:https://stackoverflow.com/questions/29003420/reload-ansibles-dynamic-inventory

我的问题:有没有更好的方法来完成下面的操作?

我有一个 ansible 角色,可以配置 AWS 机器并正确运行(注意provision标签):

- name: AWS provision
  hosts: localhost
  gather_facts: no
  vars_files:
    - vars/dev.yml
  user: ec2-user
  roles:
    - provision
  tags:
    - provision

然后我有一个base角色,我希望能够独立运行(例如在开发期间,所以我不必等待重新配置(注意标签base)。我运行一个剧本find running instances来过滤和存储组中的主机started

- name: find running instances
  hosts: localhost
  vars_files:
    - vars/dev.yml
  gather_facts: no
  tags:
    - base
  tasks:
    - name: gather remote facts
      ec2_remote_facts:
        region: "{{ target_aws_region }}"
        filters:
          instance-state-name: running
          "tag:Name": "{{ instance_name }}"
      register: ec2_facts

    - debug: var=ec2_facts

    - name: add hosts to groups
      add_host:
        name: "{{ item.id }}"
        ansible_ssh_host: "{{ item.public_dns_name }}"
        groups: started
      changed_when: false
      with_items: ec2_facts.instances

- name: base setup
  hosts: started
  gather_facts: no
  vars_files:
    - vars/dev.yml
  user: ec2-user
  roles:
    - base
  tags:
    - base

我的问题:这些剧本都很好,但是有没有更好的方法呢?例如,我得到了gather_facts: no后面的ec2_remote_factsfilters- 这一切看起来相当复杂。

澄清一下:感谢您的评论ec2.py——我已经在我的第一部戏剧中使用它了(当我扮演角色时provision)。

但出于测试目的,我想跳转到后续播放,而无需重新进行(缓慢的)配置。所以我如何重新填充我的主机数据?是否正确使用?或者我可以用什么方式ec2_remote_facts使用?add_hostgather_facts: yes

答案1

我可能会改用 EC2 动态库存脚本,您可以通过配置ec2.ini并传递-i ec2.py给来使用该脚本ansible-playbook

http://docs.ansible.com/ansible/intro_dynamic_inventory.html#example-aws-ec2-external-inventory-script了解更多信息。

请注意,中有很多选项ec2.ini。请务必查看这些选项,例如cache_max_age。您还可以通过过滤不必要的资源来加快库存生成速度(例如,rds = False如果您只对 EC2 实例感兴趣,请设置)。

更新:使用 Ansible 2.x+ 您还可以使用- meta: refresh_inventory中间播放。

答案2

虽然meta: refresh_inventory是“首选方法”,但我倾向于喜欢 OP 提出的ec2_remote_facts与 结合使用的建议add_host。我已经设置了这样一个剧本,它具有 100% 动态的强度,没有缓存故障。

假设你的助理秘书长使用标签启动实例env: cool_asg_instance,只需在剧本调用下添加以下内容ec2_asg

-ec2_远程_事实:
    过滤器:
      “标签:env”:“cool_asg_instance”
  注册:instance_facts

然后你将收集完整的JSON数据集包含所有需要的信息,从中您可以使用Jinja2剧本中的功能来提取新创建的 IP 地址,即:

- 名称:群组主持人
  add_host:主机名={{ item }} 组=已启动
  with_items:“{{instance_facts.instances|selectattr('state','equalto','running')|map(attribute='private_ip_address')|list}}”

过滤器由这篇精彩的博客文章提供:https://bonovoxly.github.io/2016-02-11-ansible-stuffs-ec2_remote_facts_instead_of_ec2_py

从现在开始,您可以launched在父部署中使用组YAML文件如下:

- 主办方:已启动
  gather_facts:否

  任务:
    - 名称:等待 SSH
      wait_for:端口=22 主机=“{{ inventory_hostname }}”search_regex=OpenSSH 延迟=5

有些人可能会问为什么要这么头疼,想象一下,你不需要一个丑陋的、既能userdatagit clone互联网获取 Ansible 又能从互联网获取剧本的程序,而是可以通过设置一个简单的程序从你自己的部署中心触发实例设置社交网络主题将发布到新加坡优质服务队列,由 10 行 Python 代码监视(https://github.com/alexandregama/python-sqs-consumer/blob/master/sqs-message-consumer-polling.py),当有新实例出现时,它将触发 Ansible。

答案3

我发现这比我想象的要容易。以下代码允许您针对现有 AWS 库存运行剧本,这正是我最初想做的。基于 [1] 和 [2]。

(我的解决方案更灵活一些,例如自定义ansible.cfgssh_config

设置 ansible 配置文件并使用它:

% cat ./ansible.cfg.foo
[defaults]
hostfile = inventory
host_key_checking = false
private_key_file = bar.pem
remote_user = ec2-user
ssh_args = -F ./ssh_config

export ANSIBLE_CONFIG=ansible.cfg.foo

可选择设置自定义 ssh 配置,这样您的笔记本电脑的设置就不会干扰。ssh 配置也可以在 中完成ansible.cfg.foo,但我喜欢将其分开,以便~/.ssh/config第三方可以使用现有的配置。

% cat ./ssh_config
StrictHostKeyChecking no
...

运行你的剧本:

ansible-playbook config.yml --tags base

其中剧本可能如下所示。aws 标签(例如tag_env_test)用于选择主机。

% cat config.yml
- name: base setup
  hosts:
    - tag_env_test
  become: true
  vars_files:
    - vars/qux.yml
  roles:
    - base
  tags:
    - base

- name:  java setup
  hosts:
  ...

我用来./ec2.py --list > ../ec2_output.txt调查我感兴趣的主机。

我已将 Jukka 的回答标记为解决方案,以感谢他的帮助:-)

[1]http://www.slideshare.net/bfschott/using-ansible-dynamic-inventory-with-amazon-ec2

[2]https://aws.amazon.com/blogs/apn/getting-started-with-ansible-and-dynamic-amazon-ec2-inventory-management/

相关内容