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

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

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

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

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



답변

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 문서 를 참조하세요.


답변

제안 된대로 이러한 요구에 대해 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


답변

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에 의해 무시되어 실수로 역할을 확인하지 않도록하는 것입니다. 또한 매번 폴더를 지우므로 오류를 강제하거나 무시할 필요가 없습니다.


답변

또 다른 해결책은 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자신의 코드를 저장소에 커밋하는 것을 방지하기 위해 갤럭시 역할을 블랙리스트에 추가로 처리 할 필요가 없습니다 .


답변

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이 참조하는 플레이 북을 실행하기 전에 모든 역할을 사용할 수 있는지 확인하기 때문입니다.


답변

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


답변

여기에서 내 요구 사항은 역할에 있으며 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