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