将播放簿信息保存到主机文件

时间:2014-11-15 07:48:01

标签: ansible

我有一个使用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。

4 个答案:

答案 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以获取示例脚本。