在 Ansible/AWS 中本地和远程执行角色
Executing roles locally and remotely in Ansible/AWS
我用Ansible写过两个角色。第一个角色(即提供)在具有配置 EC2 实例所需的 IAM 的实例上本地执行(见下文):
- name: Provison "{{ count }}" ec2 instances in "{{ region }}"
ec2:
key_name: "{{ key_name }}"
instance_type: "{{ instance_type }}"
image: "{{ image }}"
...
exact_count: "{{ count }}"
count_tag: "{{ count_tag }}"
instance_tags:
...
register: ec2
然后我将私有 IP 地址添加到主机。
- name: Add the newly created EC2 instances to the local host file
local_action: lineinfile
dest="./hosts"
regexp={{ item.private_ip }}
insertafter="[sit]" line={{ item.private_ip }}
with_items: "{{ ec2.instances }}"
我等待 SSH 可用。
- name: Wait for SSH process to be available on "{{ sit }}"
wait_for:
host: "{{ item.private_ip }}"
port: 22
delay: 60
timeout: 320
state: started
with_items: "{{ ec2.instances }}"
第二个角色(即 setupEnv)在 'sit' 主机上设置环境变量,例如 users/group 目录。我尝试按顺序 运行 角色(见下文 main.yml
剧本):
- hosts: local
roles:
connection: local
gather_facts: false
user: svc_ansible_lab
roles:
- provision
- hosts: sit
roles:
connection: ssh
gather_facts: true
user: ec2-user
roles:
- setupEnv
但是,只有第一个角色在本地主机上执行。 Ansible 一直等到 SSH 在配置的实例上可用,然后该过程在没有尝试角色 setupEnv 的情况下完成。
有没有办法确保在 SSH 可用后在 sit
主机上执行第二个角色?
库存文件不会在播放之间自动re-sourced。
不修改库存文件,而是使用 add_host
module and in-memory inventory。
- name: Add the newly created EC2 instances to the in-memory inventory
add_host:
hostname: "{{ item.private_ip }}"
groups: sit
with_items: "{{ ec2.instances }}"
或者,您可以使用 meta
module 和 refresh_inventory
参数来强制 Ansible re-read 清单文件:
- meta: refresh_inventory
我用Ansible写过两个角色。第一个角色(即提供)在具有配置 EC2 实例所需的 IAM 的实例上本地执行(见下文):
- name: Provison "{{ count }}" ec2 instances in "{{ region }}"
ec2:
key_name: "{{ key_name }}"
instance_type: "{{ instance_type }}"
image: "{{ image }}"
...
exact_count: "{{ count }}"
count_tag: "{{ count_tag }}"
instance_tags:
...
register: ec2
然后我将私有 IP 地址添加到主机。
- name: Add the newly created EC2 instances to the local host file
local_action: lineinfile
dest="./hosts"
regexp={{ item.private_ip }}
insertafter="[sit]" line={{ item.private_ip }}
with_items: "{{ ec2.instances }}"
我等待 SSH 可用。
- name: Wait for SSH process to be available on "{{ sit }}"
wait_for:
host: "{{ item.private_ip }}"
port: 22
delay: 60
timeout: 320
state: started
with_items: "{{ ec2.instances }}"
第二个角色(即 setupEnv)在 'sit' 主机上设置环境变量,例如 users/group 目录。我尝试按顺序 运行 角色(见下文 main.yml
剧本):
- hosts: local
roles:
connection: local
gather_facts: false
user: svc_ansible_lab
roles:
- provision
- hosts: sit
roles:
connection: ssh
gather_facts: true
user: ec2-user
roles:
- setupEnv
但是,只有第一个角色在本地主机上执行。 Ansible 一直等到 SSH 在配置的实例上可用,然后该过程在没有尝试角色 setupEnv 的情况下完成。
有没有办法确保在 SSH 可用后在 sit
主机上执行第二个角色?
库存文件不会在播放之间自动re-sourced。
不修改库存文件,而是使用 add_host
module and in-memory inventory。
- name: Add the newly created EC2 instances to the in-memory inventory
add_host:
hostname: "{{ item.private_ip }}"
groups: sit
with_items: "{{ ec2.instances }}"
或者,您可以使用 meta
module 和 refresh_inventory
参数来强制 Ansible re-read 清单文件:
- meta: refresh_inventory