Вы можете пометить свой экземпляр (ы), а затем вызвать свой экземпляр с помощью тега, используя ansible.
Сначала создайте директорию filter_plugins
, где ваш сборник пьес существуют, а затем скопировать этот код в файл с именем get_ec2_info.py
:
from jinja2.utils import soft_unicode
'''
USAGE:
- debug:
msg: "{{ ec2.results | get_ec2_info('id') }}"
Some useful ec2 keys:
id
dns_name
public_ip
private_ip
'''
class FilterModule(object):
def filters(self):
return {
'get_ec2_info': get_ec2_info,
}
def get_ec2_info(list, ec2_key):
ec2_info = []
for item in list:
for ec2 in item['instances']:
ec2_info.append(ec2[ec2_key])
return ec2_info
здесь является модифицированный код вашего примера:
- name: Launch Instance
ec2:
group_id: "{{ item.group_id }}"
count: 1
instance_type: 't2.micro'
image: '{{ item.image }}'
wait: true
region: 'us-east-1'
aws_access_key: ''
aws_secret_key: ''
key_name: "{{ pem }}"
instance_profile: "{{ profile }}"
instance_tags:
Name: "myserver"
Environment: "staging"
Server_Role: "webserver"
register: ec2
with_items: ec2_instances
- name: Create SSH Group to login dynamically to EC2 Instance(s)
add_host:
hostname: "{{ item }}"
groupname: webserver
with_items: "{{ ec2.results | get_ec2_info('public_ip') }}"
- name: Add the newly created EC2 instance(s) to the local host group (located at ./inventory/hosts)
lineinfile:
dest: "./inventory/hosts"
regexp: "{{ item }}"
insertafter: "[webserver]"
line: "{{ item }}"
with_items: "{{ ec2.results | get_ec2_info('public_ip') }}"
- name: Wait for SSH to come up on EC2 Instance(s)
wait_for:
host: "{{ item }}"
port: 22
state: started
with_items: "{{ ec2.results | get_ec2_info('public_ip') }}"
Set ec2.py
в качестве переменных среды в системе (или вы можете вызвать инвентарь по параметру -i
):
export ANSIBLE_HOSTS=/your-inventory-path/ec2.py
export EC2_INI_PATH=/your-inventory-path/ec2.ini
После этого настроить ваш SSH ключ:
cp /tmp/mykey.pem ~/.ssh/
chmod 600 ~/.ssh/mykey.pem
ssh-agent bash
ssh-add ~/.ssh/mykey.pem
Теперь вы также можете использовать тег для вызова экземпляра (я предположу, что вы используете экземпляр Ubuntu, пожалуйста, изменить пользователь, соответственно):
ansible -m ping tag_Name_myserver -u ubuntu
или
ansible -m ping tag_Environment_staging -u ubuntu
или
ansible -m ping tag_Server_Role_webserver -u ubuntu
ИЛИ вы можете использовать это в вашем PlayBook, как это:
- hosts: tag_Name_myserver
become: yes
remote_user: ubuntu
roles:
- your-role-here
Надеется, что это поможет. Для получения полной справки, пожалуйста, проверьте эти места:
Я получаю следующее сообщение об ошибке на Забегая – Merv
ЗАДАЧИ [Добавить вновь созданный экземпляр EC2 (ы) для локального хоста group (находится в ./inventory/hosts)] *** [ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ]: пропуская задачу из-за неопределенной ошибки, в будущем это будет фатальной ошибкой: «dict object» не имеет атрибутов «экземпляры». Эта функция будет удалена в будущем выпуске. Предупреждения об устаревании можно отключить, установив параметр deprecation_warnings = False в ansible.cfg. – Merv
Я обновил ответ, пожалуйста, проверьте его сейчас. но убедитесь, что каталог инвентаря существует в том месте, где вы выполняете воспроизведение, и файл хоста также существует внутри этого каталога инвентаря, чтобы он мог записать ip в него. –