Ansible Galaxy 역할을 자동으로 설치하는 방법은 무엇입니까?


129

내 모든 Ansible 플레이 북 / 역할은 내 git repo에 체크인됩니다.

그러나 Ansible Galaxy 역할의 경우 항상 Ansible을 실행하려는 모든 컴퓨터에서 하나씩 명시 적으로 다운로드해야합니다.

Ansible이 런타임에 누락 된 역할에 대해 불평 할 때까지 어떤 Ansible Galaxy 역할이 필요한지 미리 아는 것은 어렵습니다.

Ansible Galaxy 역할 종속성을 어떻게 관리해야합니까? 나머지 ansible 코드와 함께 내 git repo에 체크인하거나 새 머신에서 Ansible을 실행할 때 자동으로 식별 및 다운로드되도록하고 싶습니다.


galaxy.ansible.com/docs/using/index.html 다음은 ansible-galaxy를 사용하는 데 필요한 모든 것입니다. 잘된 문서입니다! 심지어 : 당신이 초보자 경우
Ayra

@pdeva 아래 유효한 답변 중 하나를 수락 할 수 있습니까?
GG.

답변:


149

requirements.yml이 사용 사례 에는 파일을 사용해야합니다 . 다양한 설치 방법을 사용하여 필요한 역할을 설명하십시오.

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

그런 다음 설치하십시오.

ansible-galaxy install -r requirements.yml

다음은 작업 예제입니다 (Ansible을 Vagrant 프로비저닝 도구로 사용하여 OpenDaylight 설치). 자세한 내용은 관련 Ansible 문서 를 참조하세요.


아래 @Kieran Andrews 답변도 참조하십시오. 이것은 이것을 확장합니다.
Marco Ferrari

1
이것은 실제로 플레이 북의 역할 종속성을 자동으로 설치하는 것이 아니라 플레이 북을 만든 사람이 수동으로 나열한 종속성 목록을 명시 적으로 설치하는 것입니다.

53

제안 된대로 이러한 요구에 대해 ansible 은하계를 사용할 수 있습니다.

Ansible requirements.yml에는 모든 역할을 나열 하는 파일을 생성 할 수있는 기능이 있습니다 . http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file 에서 이에 대한 내용을 확인할 수 있습니다.

예 (requirements.yml) :

- src: yatesr.timezone

그런 다음 ansible-galaxy install -r requirements.yml이 파일을 실행 하여 여기에 나열된 모든 역할을 다운로드합니다.

추가로 자동화하려면 두 명령을 실행하는 간단한 셸 스크립트를 만들 수 있습니다.

예 : (ansible.sh) :

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 

1
방금 테스트했습니다. 역할이 이미 다운로드되었으며 오류가 없다는 메시지가 표시됩니다. 버전2.2.1
Igonato

플레이 북이 설치중인 은하 역할을 사용하는 경우 플레이 북이 다운로드되기 전에 존재 여부를 확인하기 때문에 플레이 북이 처음 호출 될 때 실행되지 않습니다. 플레이 북을 다시 호출하면 새로 설치된 역할이 선택됩니다.
Ben

명령을 줄이기 위해 래퍼 스크립트를 사용하여 지금까지 수행 한 방식으로 업데이트했습니다.
Kieran Andrews

19

Java JDK를 설치하는 경우가 많습니다. 역할을 사용하면 터치가 더 쉬워집니다. 나는 몇 가지 다른 방법을 시도했습니다 (많은 .gitmodules 및 하위 모듈 포함 ... 작업을 위해 여러 git 시스템을 사용해야하며 모든 것이 추악합니다). 가장 큰 요구 사항은 역할 코드를 플레이 북 프로젝트에 확인하지 않는 것입니다. 대부분 모든 것을 한 곳에 보관할 수 있습니다.

내 'requirements.yml'파일의 내용 :

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

별도의 플레이 북 install-roles.yml을 실행합니다.

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

이 첫 번째 플레이 북을 실행 한 다음 모든 플레이 북에서 내 역할을 정상적으로 실행합니다. 나에게 비밀은 git에 의해 무시되어 실수로 역할을 확인하지 않도록하는 것입니다. 또한 매번 폴더를 지우므로 오류를 강제하거나 무시할 필요가 없습니다.


로컬 명령을 실행하기 전에 '역할을 찾을 수 없음'으로 실패합니다.
다니엘 안드레이 Mincă

1
@ Mincă Daniel Andrei는 include_role과 같은 동적 방식을 사용해야합니다. 확인
user1686407

4

또 다른 해결책은 git 하위 모듈을 사용하는 것입니다. 결국 Ansible Galaxy는 github 저장소의 디렉토리입니다.

이 명령을 사용하여 Galaxy 역할을 하위 모듈로 자동 추가합니다.

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

변경 사항을 git repo에 커밋하십시오. 나중에 repo를 복제 할 때 하위 모듈로 복제하십시오.git clone ... --recursive

이것의 장점은 git 서브 모듈이 항상 특정 버전 (git commit-hash)을 참조한다는 것입니다. 이렇게하면 생산 환경에서 테스트되지 않은 업데이트를 실행할 수 없습니다. 새로운 버전의 Galaxy 역할은 버그가 있거나 이전과 완전히 다르게 작동 할 수 있습니다. git 하위 모듈을 사용하여 역할을 새 버전으로 업데이트할지 여부와시기를 결정합니다.

또한 .gitignore자신의 코드를 저장소에 커밋하는 것을 방지하기 위해 갤럭시 역할을 블랙리스트에 추가로 처리 할 필요가 없습니다 .


5
제 생각에는 이것은 나쁜 습관입니다. 일반적으로 종속성 관리 도구를 사용한 다음 SCM 저장소를 함께 붙이는 것이 더 간단합니다. 특히 SCM 용 git 하위 모듈에 대해 이야기 할 때 더욱 그렇습니다.
데이비드 레스 닉

1
동의합니다. 사실 저는 이것을 더 이상 사용하지 않습니다. ansible-galaxy는 완벽하지 않기 때문에 여전히 유효한 접근 방식입니다. Galaxy에서는 요구 사항 파일에서 버전이 충돌하더라도 문서화되지 않은 --force플래그로 모든 역할을 다시 다운로드하도록 강제하면 실제로 변경되었는지 여부를 표시하지 않습니다. 다운로드 한 은하계 역할을 SCM에 유지하는 경우에만 제어 할 수있는 블랙 박스입니다. 어쨌든 그것은 좋은 생각입니다. 하위 모듈을 가져올 때 최소한 어떤 역할이 변경되었는지 확인합니다.
udondan

BTW, 하위 모듈의 모든 문제, AFAIK는 콘텐츠 수정과 관련이 있기 때문에이 상황에서 무시할 수 있습니다. .. 내 경험에 의해 완벽하게 잘되어 당기
udondan

4

Ansible 역할을 사용하여 명령 모듈을 사용하여 필요한 역할을 설치할 수 있습니다 .

다음은 실행되는 매우 기본적인 예입니다 ansible-galaxy install.

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

ansible_roles_list변수로서 역할 또는 파라미터로서 공급 될 수있다.

역할에서이 작업을 수행 하는 경우 별도의 플레이 북에서이를 사용하여 설치하려는 다른 역할 보다 먼저 적용 해야 합니다. 이는 Ansible이 참조하는 플레이 북을 실행하기 전에 모든 역할을 사용할 수 있는지 확인하기 때문입니다.


계란과 닭고기 :)
bazeusz

2

이 시점에서 내가 아는 한 런타임에 역할을 자동으로 다운로드하는 방법은 없습니다. 가장 좋은 방법은 자신의 저장소에 커밋하거나 모든 요구 사항을 나열하는 적절한 문서를 보유하는 것입니다. 역할을 설치하는 비행 전 플레이 북을 만들 수도 있습니다. :)


3
이를 위해 requirements.txt 파일을 사용할 수 있습니다. 참조 : docs.ansible.com/...
toast38coza

0

여기에서 내 요구 사항은 역할에 있으며 install.yml에서 사용됩니다.

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml

0

requirements.yml이 프로젝트의 roles 디렉토리에있는 경우 Tower / AWX가 자동으로 역할을 설치합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.