ansible
Amazon Web Services와 함께 사용하기
수색…
비고
example-2 : 이것은 예제로 제공되므로 복사 / 지나치지 마십시오. 대신 사용자의 필요에 맞게 변수를 사용자 정의해야합니다. ansible_key, 보안 그룹 규칙 등.
example-1 : ssh strict 호스트 키 검사를 사용하지 않으려면 작업을 자동화 할 때 원하지 않는 동작을 우리는 ansible.cfg
파일에서 no
로 ansible.cfg
합니다. 예 : StrictHostKeyChecking=no
ec2.py
파일은 특정 영역, 특정 태그 등으로 프로젝트의 범위를 제한하려는 경우 사용자 정의해야하는 구성 파일 인 ec2.ini
를 기반으로 AWS 자원을 실행하고 반환하는 python 스크립트입니다 ...
공식 Amazon AMI에서 EC2 인스턴스를 시작하여 수정하고 새로운 AMI로 저장하는 방법
AWS EC2 인스턴스를 프로비저닝 할 때 Anatile를 사용할 때 매우 일반적인 워크 플로입니다. 이 게시물은 Anabilities에 대한 기본적인 이해를 전제로하며 가장 중요한 것은 AWS에 연결하도록 올바르게 구성했다고 가정합니다.
Anipal 공식 문서에서 주장하는 것처럼 우리는 다음 네 가지 역할을 수행 할 것입니다.
1- ami_find 를 사용하여 EC2 인스턴스를 시작할 AMID 를 얻습니다.
2- ec2_ami_creation 을 사용하면 EC2 인스턴스를 효과적으로 시작할 수 있습니다.
인스턴스를 수정하기위한 3 - code_deploy ; 이것은 아무것도 될 수 없으므로 파일을 대상 시스템으로 간단히 전송합니다.
4 build_ami 를 사용하여 실행중인 ec2 인스턴스를 기반으로 새 이미지를 빌드하십시오. 이 게시물은 귀하가 Ansible 프로젝트의 최상위 레벨에 있다고 가정합니다 : my_ansible_project
첫 번째 역할 : ami_find
cd my_ansible_project/roles && ansible-galaxy init ami_find
이 역할에서 우리는 ec2_ami_find 모듈을 사용하려고합니다. 예를 들어, 우분투 시스템을 검색하여 ami_id (ami-xxxxxxxx)를 얻습니다. 이제 my_ansible_project/roles/ami_find/tasks/main.yml
파일을 my_ansible_project/roles/ami_find/tasks/main.yml
하십시오.
---
- ec2_ami_find:
name: "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
sort: name
sort_order: descending
sort_end: 1
region: "{{ aws_region }}"
register: ami_find
- set_fact: ami_ubuntu="{{ ami_find.results[0].ami_id }}"
두 번째 역할 : ec2_ami_creation
여기서는 첫 번째 역할에서 얻은 ami_id
를 사용하고 ami_id
기반으로 새 인스턴스를 시작합니다.
cd my_ansible_project/roles && ansible-galaxy init ec2_ami_creation
이 역할에서 가장 중요한 ec2_module 을 사용하여 인스턴스를 시작합니다. 이제 my_ansible_project/roles/ec2_ami_creation/tasks/main.yml
파일을 my_ansible_project/roles/ec2_ami_creation/tasks/main.yml
하십시오.
---
- ec2_vpc_subnet_facts:
region: "{{aws_region}}"
register: vpc
- name: creation of security group of the ec2 instance
ec2_group:
name: example
description: an example EC2 group
region: "{{ aws_region }}"
rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: 0.0.0.0/0
state: present
register: ec2_sg
- name: create instance using Ansible
ec2:
key_name: "{{ ansible_key }}"
group: example
vpc_subnet_id: "{{vpc.subnets[0].id}}"
instance_type: "{{ instance_type }}"
ec2_region: "{{ aws_region }}"
image: "{{ base_image }}"
assign_public_ip: yes
wait: yes
register: ec2
- set_fact: id={{ec2.instances[0].id}}
- name: adding the newly created instance to a temporary group in order to access it later from another play
add_host: name={{ item.public_ip }} groups=just_created
with_items: ec2.instances
- name: Wait for SSH to come up
wait_for: host={{ item.public_dns_name }} port=22 delay=10 timeout=640 state=started
with_items: ec2.instances
세 번째 역할 : code_deploy
여기서는 just_created
라는 그룹에 추가 된이 인스턴스를 제공합니다.
cd my_ansible_project/roles && ansible-galaxy init code_deploy
이 역할에서는 template_module 을 사용하여 파일 을 전송하고 여기에 시스템 호스트 이름을 씁니다. 이제 my_ansible_project/roles/code_deploy/tasks/main.yml
파일을 my_ansible_project/roles/code_deploy/tasks/main.yml
하십시오.
---
- template: src=my_file.txt.j2 dest=/etc/my_file.txt
당신의 역할 내의 템플릿 폴더로 이동하십시오 :
cd my_ansible_project/roles/templates
다음을 포함하는 my_file.txt.j2
파일을 추가하십시오.
my name is {{ ansible_hostname }}`
네 번째 역할 : build_ami
이제 ec2_ami 모듈을 사용하여 실행중인 인스턴스의 이미지를 만듭니다. 프로젝트 폴더로 이동하여 다음 작업을 수행하십시오.
cd my_ansible_project/roles && ansible-galaxy init build_ami
이제 my_ansible_project/roles/build_ami/tasks/main.yml
파일을 my_ansible_project/roles/build_ami/tasks/main.yml
하십시오.
---
- ec2_ami:
instance_id: "{{ instance_id }}"
wait: yes
name: Base_Image
자, 저는이 모든 역할을 어떻게 조정할 것인지 궁금해하신 것 같아요. 내가 맞습니까? 그렇다면 계속 읽으십시오.
우리는 3 개의 연극으로 구성된 플레이 북을 작성합니다 : localhost
적용 가능한 첫 번째 플레이는 just_created 그룹에 적용되는 두 번째 역할을 처음 두 가지 역할로 호출합니다. 마지막 역할은 localhost
적용됩니다. 왜 localhost
인가? 일부 AWS 자원을 관리 하고자 할 때 우리는 로컬 시스템을 사용합니다. 다음으로 변수를 넣을 vars 파일 인 ansible_key
, aws_region
등을 사용할 것입니다.
프로젝트 상단에 인프라 폴더를 만들고 aws.yml
이라는 파일을 추가하십시오.
---
aws_region: ap-southeast-2
ansible_key: ansible
instance_type: t2.small
그래서 당신의 프로젝트의 맨 위에 build_base_image.yml
을 만들고 이것을 추가하십시오 :
---
- hosts: localhost
connection: local
gather_facts: False
vars_files:
- infrastructure/aws.yml
roles:
- ami_find
- { role: ec2_creation, base_image: "{{ ami_ubuntu }}"}
- hosts: just_created
connection: ssh
gather_facts: True
become: yes
become_method: sudo
roles:
- code_deploy
- hosts: localhost
connection: local
gather_facts: False
vars_files:
- infrastructure/aws.yml
roles:
- { role: new_image, instance_id: "{{ id }}"}
그거야, 이것을 테스트 한 후에 자원을 삭제하는 것을 잊어 버리거나 실행중인 인스턴스를 삭제하는 역할을 생성하지 않는 것이 좋습니다 :-)
Amazon Web Services에 연결할 수 있도록 적절하게 구성하는 방법
위아래로 확장되는 AWS 리소스를 관리하면 정적 인벤토리 호스트 파일의 한계에 도달하므로 동적 인 것이 필요합니다. 이것이 동적 재고 목록 입니다. 시작하자:
ec2.ini 및 ec2.py 파일을 프로젝트 폴더에 다운로드하십시오.
cd my_ansible_project
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
작업이 끝나면 ec2.py
파일을 실행 가능하게 만듭니다.
chmod +x ec2.py
이제 AWS Secret 및 Access 키를 환경 변수로 내 보냅니다.
export AWS_ACCESS_KEY_ID='ABCDEFGHIJKLM'
export AWS_SECRET_ACCESS_KEY='NOPQRSTUVWXYZ'
ec2.py
스크립트를 사용하려면 Python AWS SDK, boto
가 필요하므로 설치해야합니다.
sudo pip install boto
모든 것이 좋은지 테스트하려면 리소스를 나열하여 ec2.py
를 실행 해보십시오.
./ec2.py --list
비슷한 것을 볼 수 있습니다 :
{
"_meta": {
"hostvars": {}
}
}
이제 정적 호스트 파일과 함께 동적 인벤토리를 사용하려고합니다. 먼저 inventory
라는 폴더를 만들고 ec2.py
, ec2.ini
및 hosts
파일을 추가 한 다음 ec2.py
에 해당 폴더를 인벤토리 파일로 사용하도록 지시합니다.
mkdir inventory
mv ec2.py inventory/ec2.py
mv ec2.ini inventory/ec2.ini
mv hosts inventory/hosts
다음으로 우리는 프로젝트 폴더에 ansible.cfg
라고 불리는 Ansible 설정 파일을 만들고 이것을 추가하여 ansible.cfg
대한 프로젝트 레벨 설정을 정의해야합니다 :
[defaults]
hostfile = inventory
[ssh_connection]
pipelining = False
ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o StrictHostKeyChecking=no
다음으로 우리는 EC2 인스턴스에 대한 액세스를 인증하기 위해 SSH 키를 사용하도록 Ansible을 구성해야합니다. SSH 에이전트를 사용하면 키를보다 쉽게 관리 할 수 있으므로 리소스를 인증하는 가장 좋은 방법입니다.
ssh-agent bash
ssh-add ~/.ssh/keypair.pem
그게 다야! 이것을 따라했다면 ping
모듈 을 사용하여 테스트 한 다음 pong으로 응답하는 키를 사용하도록 실행중인 인스턴스를 볼 수 있습니다.
ansible -m ping all
11.22.33.44 | success >> {
"changed": false,
"ping": "pong"
}