2016-06-13 5 views
1

AWCS EC2 이미지 (AMI)를 만들 수있는 Packer를 사용할 수 있습니다. Ansible은 Java 8을 설치하고, 데이터베이스 (Cassandra)를 설치하고, Ansible을 설치하고, Ansible 플레이 북을 업로드하는 데 사용됩니다 (나는 게임 북을 밀고 당겨야한다고 알고 있지만, 제대로 작동하면이 작업을 수행 할 것입니다). 인스턴스를 AMI (예 : Cassandra 옵션에 현재 인스턴스 IP 추가)에서 시작할 때 일부 Cassandra 속성을 변경해야하기 때문에 Ansible을 설치하고 안내서를 업로드합니다. 이것을 달성하기 위해 간단한 bash 스크립트를 작성했습니다.이 스크립트는 user-data-file 속성으로 추가되었습니다. 이 스크립트는 다음과 같습니다.EC2 인스턴스에서 사용자 데이터 스크립트로 실행 가능 플레이 북

#cloud-boothook 
#!/bin/bash 

#cloud-config 
output: {all: '| tee -a /var/log/cloud-init-output.log'} 


ansible-playbook -i "localhost," -c local /usr/local/etc/replace_cassandra.yaml 

본인은 로컬 호스트 모드에서 가동 가능 플레이어를 실행하고 있습니다.

문제는 인스턴스를 시작할 때 /var/log/cloud-init.log 파일에서 오류가 발생한다는 것입니다. 오류 ansible-playbook 찾을 수 없습니다. 그래서 줄을 사용자 데이터 스크립트 안에 추가하여 /usr/bin/ 폴더 (Anecess가 설치된 폴더)의 내용을 확인하고 그 안에 Anagers가 없었지만 ssh를 사용하여 인스턴스에 액세스하면 Ansible이 /usr/bin/ 폴더 안에 있으며 아무런 문제가 없습니다.

누구와 비슷한 문제가 발생 했습니까? 나는 이것이 EC2와 함께 Ansible에게 꽤 인기있는 사용 사례 여야한다고 생각한다.


내가 거기에 사용자 데이터를 실행하는 동안, 더 Ansible 없지만, 데이터베이스뿐만 아니라 행방 불명입니다뿐만 아니라 사실을 발견 된 일부 로그인 한 후 편집

.

Packer의 Anecess 공급자의 일부 코드 (또는 그 전부)가 인스턴스가 시작될 때 실행될 수 있습니까?


EDIT2

여기 무슨 일이 일어나고 있는지 발견했다. 패커를 통해 사용자 데이터를 추가 할 때 user_data_file 속성을 사용하면 패커가 인스턴스를 실행하여 AMI를 빌드 할 때 사용자 데이터가 실행됩니다. Anecess 제공자가 실행되기 전에 스크립트가 시작되어 Anabilities가 누락 된 이유입니다.

사용자 데이터를 AMI에 자동으로 추가하여 AMI에서 인스턴스가 시작될 때 패커가 해당 AMI를 빌드 할 때가 아니라 사용자 데이터가 실행되도록하려는 것입니다.

방법에 대한 아이디어가 있으십니까?

+0

# cloud-config 형식이 잘못되었습니다. 이 [doc] (http://cloudinit.readthedocs.io/en/latest/topics/examples.html#run-commands-on-first-boot)와 같이'bootcmd :'에 anabilities-playbook 명령을 넣으십시오. –

+0

I 이것이 문제라고 생각하지 마십시오. 내 질문에 말했듯이,'/ usr/bin' 폴더에 '책임감있는 플레이 북'이 없기 때문에 코드가 작동하지 않습니다. –

+0

비슷한 문제는 포장 업체가없는 경우에만 표시됩니다. pip install able; 실무 플레이 북 ... 무의식적 인 플레이 북에 대해 foud가 아닌 명령으로 실패 함 –

답변

1

여러 프로비저를 실행하고 cloud-init을 통해 실행하려고하지 마십시오.

귀하의 플레이 북과 역할이 패커를 시작할 지점에서 로컬로 저장된다고 가정합니다. 가능한 데이터를 사용자 데이터에 저장하는 대신 셸 공급자를 실행하여 ansbile을 설치하고 무언가 로컬 공급자를 실행하여 원하는 장/역할을 실행하십시오.

다음은 제가 말하고자하는 단순화 된 예입니다. 빌더 설정에서 더 많은 값을 입력하지 않으면 실행되지 않지만 간략하게하기 위해이 값을 남겨 두었습니다.

예 json에서 install-prereqs.sh는 안전 ppa apt repo를 추가하고 apt-get update -y을 실행 한 다음 가능한 설치합니다.

#!/bin/bash 

sudo apt-get install software-properties-common 
sudo apt-add-repository -y ppa:ansible/ansible 
sudo apt-get update 
sudo apt-get install -y ansible 

그러면 두 번째 공급자가 지정한 재생 목록과 역할을 대상 호스트에 복사 한 다음 실행합니다.

{ 
"builders": [ 
    { 
    "type": "amazon-ebs", 
    "ssh_username": "ubuntu", 
    "image_name": "some-name", 
    "source_image": "some-ami-id", 
    "ssh_pty": true 
    } 
], 
"provisioners": [ 
    { 
    "type": "shell", 
    "script": "scripts/install-prereqs.sh" 
    }, 
    { 
    "type": "ansible-local", 
    "playbook_file": "path/to/playbook.yml", 
    "role_paths": ["path/to/roles"] 
    }, 
] 
} 
0

가능합니다! 다음 사항을 확인하십시오.

  • (AMI에 내장되어 있지 않은 경우 클라우드 구성 사용자 데이터를 통해 설치 가능) 대상에 클라우드 정보로 생성 한 보안 그룹에서 SSH 액세스 권한이 있어야합니다.
  • ansible.cfg 파일을 사용 가능 서버에 설치하면 해당 서버의 개인 키가 가리키는 파일
  • 해당 비공개 키의 일치하는 공개 키가 루트의 서버에있는 authorized_keys 파일에 복사됩니다 사용자에서 playbook을 실행하려는 .ssh 디렉토리 - 서버와 대상 서버간에 root 로의 ssh 액세스를 활성화 한 경우/etc/ssh/sshd_config 파일을 편집하고 아무 것도 없는지 확인하여 수행 할 수 있습니다 대상 서버의 루트 authorized_keys 파일에서 root 사용자의 SSH 액세스를 방지합니다.