Ansible 将playbook信息保存到主机文件

Ansible 将playbook信息保存到主机文件,ansible,Ansible,我有一个剧本,使用Ansible内置的核心模块在DigitalOcean上旋转一个新的液滴: - 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

我有一个剧本,使用Ansible内置的核心模块在DigitalOcean上旋转一个新的液滴:

- 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 }}"
我使用以下命令运行此命令(请注意本地参数):

我的主机文件最初如下所示:

[production]
TBA

[localhost]
localhost
当上述剧本完成后,我可以在STDOUT中看到调试信息:

ok: [localhost] => {
    "msg": "Your droplet has the IP address of 255.255.255.255"
}
这个剧本有没有办法保留
my_droplet.ip_address
变量并将TBA保存在主机文件中,而不必手动复制到那里?我问这个问题是因为我想将这个配置剧本添加到一个ruby脚本中,该脚本随后用另一个剧本引导VPS

这个剧本有没有办法保留my_droplet.ip_地址 变量并将TBA保存在主机文件中,而不必 手动复制到那里

您可以使用模块保留新主机的ip地址,该模块允许您在ansible playbook运行期间动态更改内存资源清册。当您想配置一个新主机,然后在单个剧本中配置它时,这非常有用

比如说

local_action: >
  add_host
    hostname={{ my_droplet.droplet.id }}
    groupname=launched
然后在你的剧本中:

- name: Configure instance(s)
  hosts: launched
  tasks:
    ...
问题的第二部分:

。。。并将TBA保存在hosts文件中,而不必 手动复制到那里


没有内置的ansible方法将添加内容写入磁盘上的清单文件。这通常不是你想做的事情。在这种情况下,您需要添加它或使用查找主机以供将来的配置运行。

您应该为此使用动态资源清册脚本。使用
name
来区分实例,您可以随后引用您的实例


查看示例脚本。

我正在使用ec2启动实例,我最初也希望这样做。我发现了一些使用Lineinfle并按摩它来做同样事情的例子:

  - 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_主机,生活好多了。顺便说一句,应用程序将是我用于组名的值…

我正在做同样的事情,已经编写了一个剧本,从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 %}
{% for item in groups %}

[{{item}}]
{%   for entry in groups[item] %}
{{ entry }}
{%   endfor %}
{% endfor %}