我有一个使用Ansible内置核心模块在DigitalOcean上创建新Droplet的剧本:
- name: Provision droplet on DigitalOcean
local_action: digital_ocean
state=present
ssh_key_ids=1234
name=mydroplet
client_id=ABC
api_key=ABC
size_id=1
region_id=2
image_id=3
wait_timeout=500
register: my_droplet
- debug: msg="ID is {{ my_droplet.droplet.id }}"
- debug: msg="Your droplet has the IP address of {{ my_droplet.droplet.ip_address }}"
我使用(注意本地参数)运行它:
ansible-playbook playbooks/create_droplet.yml -c local -i playbooks/hosts
我的主机文件最初看起来像这样:
[production]
TBA
[localhost]
localhost
当上面的剧本完成后,我可以在STDOUT中看到调试信息:
ok: [localhost] => {
"msg": "Your droplet has the IP address of 255.255.255.255"
}
这个剧本是否有任何方法可以保留my_droplet.ip_address
变量并将TBA保存在hosts文件中,而不必手动将其复制到那里?我问,因为我想将这个配置手册添加到ruby脚本中,随后用另一个剧本引导VPS。
答案 0 :(得分:6)
我正在做同样的事情,写了一个从dict创建服务器的游戏(一次约53台服务器,动态创建一个完整的测试环境)。要使用静态主机文件,我添加以下内容:
- name: Create in-memory inventory
add_host:
name: "{{ item.value.ServerName }}"
groups: "{{ item.value.RoleTag }},tag_Environment_{{ env_name }}"
when: item.value.template is defined
with_dict: server_details
- name: create file
become: yes
template:
src: ansible-hosts.j2
dest: "{{ wm_inventory_file }}"
ansible-hosts.j2模板只是:
{% for item in groups %}
[{{item}}]
{% for entry in groups[item] %}
{{ entry }}
{% endfor %}
{% endfor %}
答案 1 :(得分:4)
我正在使用ec2启动实例,我本来想做同样的事情。我找到了一些使用lineinfile并按摩它的例子:#/ p>
- name: Launching new instances for {{ application }}
local_action: ec2 group={{ security_group }} instance_type={{ instance_type}} image={{ image }} wait=true region={{ region }} keypair={{ keypair }} vpc_subnet_id={{ subnet }} count={{ instance_count }}
register: ec2
- name: Add instance to local host group
local_action: lineinfile dest=ansible_hosts regexp="{{ item.public_ip }}" insertafter="\[{{ application }}\]" line="{{ item.public_ip }} ansible_ssh_private_key_file=~/ec2-keys/{{ keypair }}.pem" state=present
with_items: ec2.instances
但是,我必须同意,这通常不是你想要做的事情。我觉得这很痛苦。我已经切换到使用add_host,生活要好得多。 BTW,应用程序将是我用于组名的值......
答案 2 :(得分:1)
这个剧本有没有办法保留my_droplet.ip_address 变量并将TBA保存在hosts文件中而不是必须 手动复制意大利面吧?
您可以使用add_host模块保留新主机的IP地址,该模块允许您在ansible-playbook运行期间动态更改内存中的库存。当您想要配置新主机然后在单个剧本中配置它时,这非常有用。
例如
local_action: >
add_host
hostname={{ my_droplet.droplet.id }}
groupname=launched
然后在你的剧本中:
- name: Configure instance(s)
hosts: launched
tasks:
...
问题的第二部分:
...并将TBA保存在hosts文件中而不是必须 手动复制意大利面吧?
没有内置的ansible方法可以将添加内容写入磁盘上的清单文件。这通常不是你想要做的事情。在这种情况下,您需要添加它或使用dynamic inventory script来发现主机以供将来配置运行。
答案 3 :(得分:0)
您应该为此使用动态库存脚本。使用name
来区分实例,您可以随后参考您的飞沫。
检查https://github.com/ansible/ansible/blob/devel/contrib/inventory/digital_ocean.py以获取示例脚本。