#ssh #amazon-ec2 #ansible
#ssh #amazon-ec2 #ansible
Вопрос:
У меня есть playbook, который создает экземпляр ec2, копирует несколько файлов в экземпляр, а затем запускает некоторые команды оболочки для экземпляра.
Проблема в том, что я хочу иметь возможность указать, какой ssh-ключ ansible использует для задач копирования и оболочки, которые я запускаю, и убедиться, что он не пытается использовать этот ключ для других задач, которые выполняются на локальном хосте. Вот моя пьеса:
---
- hosts: localhost
connection: local
gather_facts: false
vars:
# CentOS 7 x86_64 Devel AtomicHost EBS HVM 20150306_01 (ami-07e6c437)
# for us-west-2
- ami: 'ami-07e6c437'
- key_pair: 'my-key'
tasks:
- name: Create a centos server
ec2:
region: 'us-west-2'
key_name: '{{ key_pair }}'
group: default
instance_type: t2.micro
image: '{{ ami }}'
wait: true
exact_count: 1
count_tag:
Name: my-instance
instance_tags:
Name: my-instance
register: ec2
# shows the json data for the instances created
- name: Show ec2 instance json data
debug:
msg: "{{ ec2['tagged_instances'] }}"
- name: Wait for SSH to come up
wait_for: host={{ ec2['tagged_instances'][0]['public_ip'] }} port=22 delay=1 timeout=480 state=started
- name: Accept new ssh fingerprints
shell: ssh-keyscan -H "{{ ec2['tagged_instances'][0]['public_ip'] }}" >> ~/.ssh/known_hosts
# THE TASKS I NEED HELP ON
- name: Copy files over to ec2 instance
remote_user: centos
copy: src={{ item }} dest=/home/centos/ mode=600
with_fileglob:
- my-files/*
delegate_to: "{{ ec2['tagged_instances'][0]['public_ip'] }}"
# THE TASKS I NEED HELP ON
- name: run commands
remote_user: centos
shell: "{{ item }}"
delegate_to: "{{ ec2['tagged_instances'][0]['public_ip'] }}"
with_items:
- "sudo yum update -y"
- "sudo yum install nmap ruby"
ignore_errors: true
Комментарии:
1. Почему вы используете
delegate_to
? Я предполагаю, что вы хотите запускать задачи на недавно запущенном компьютере.2. Да, я хочу скопировать файлы и запустить команды оболочки в моем недавно созданном экземпляре
3. Почему вам нужно использовать другой SSH-ключ?
4. Извините, » хочу » было бы лучшим словом, чем «нужно». Еще одна важная причина заключается в том, что среда, в которой я работаю, имеет очень сложную систему управления ssh-ключами, и было бы полезно знать гибкость выбора ssh-ключа, который я использую в определенных задачах.
Ответ №1:
Да, я согласен с @techraf. Но ответ на вопрос, который вы опубликовали, заключается в том, что вам нужно динамически изменять свой инвентарь для нового экземпляра, который вы подготовили, а затем запускать удаленные игры ansible на этом новом хосте. Итак, вы бы добавили это в конец своей первой игры:
- local_action:
module: add_host
hostname: newhost
ansible_host: "{{ ec2['tagged_instances'][0]['public_ip'] }}"
ansible_user: centos
ansible_ssh_private_key_file: /path/to/keyfile
###### New play
- name: Configure my new instance!
hosts: newhost
tasks:
# THE TASKS I NEED HELP ON
- name: Copy files over to ec2 instance
copy: src={{ item }} dest=/home/centos/ mode=600
with_fileglob:
- my-files/*
# Use the yum module here instead, much easier
- name: run commands
shell: "{{ item }}"
with_items:
- "sudo yum update -y"
- "sudo yum install nmap ruby"
ignore_errors: true
Редактировать: добавление, что вы всегда можете просто установить ssh-ключ хоста, используя:
- set_fact: ansible_ssh_private_key_file=/path/to/keyfile
с оговоркой, что приведенный выше set_fact изменит только файл закрытого ключа ssh для текущего хоста (например, для localhost в вашем примере выше).