也可以看看: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_facts
和filters
- 这一切看起来相当复杂。
澄清一下:感谢您的评论ec2.py
——我已经在我的第一部戏剧中使用它了(当我扮演角色时provision
)。
但出于测试目的,我想跳转到后续播放,而无需重新进行(缓慢的)配置。所以我如何重新填充我的主机数据?是否正确使用?或者我可以用什么方式ec2_remote_facts
使用?add_host
gather_facts: yes
答案1
我可能会改用 EC2 动态库存脚本,您可以通过配置ec2.ini
并传递-i ec2.py
给来使用该脚本ansible-playbook
。
请注意,中有很多选项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
有些人可能会问为什么要这么头疼,想象一下,你不需要一个丑陋的、既能userdata
从git clone
互联网获取 Ansible 又能从互联网获取剧本的程序,而是可以通过设置一个简单的程序从你自己的部署中心触发实例设置社交网络主题将发布到新加坡优质服务队列,由 10 行 Python 代码监视(https://github.com/alexandregama/python-sqs-consumer/blob/master/sqs-message-consumer-polling.py),当有新实例出现时,它将触发 Ansible。
答案3
我发现这比我想象的要容易。以下代码允许您针对现有 AWS 库存运行剧本,这正是我最初想做的。基于 [1] 和 [2]。
(我的解决方案更灵活一些,例如自定义ansible.cfg
&ssh_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