Ansible을 사용하여 여러 OS에 여러 패키지 설치

Ansible을 사용하여 여러 OS에 여러 패키지 설치

2개의 서버가 있는 호스트가 있습니다. 하나에는 CentOS가 있고 다른 하나에는 Ubuntu가 설치되어 있습니다.

나는 두 서버 모두에 apache, nginx 및 php-fpm을 설치하기로 결정하고 3개의 플레이북을 작성했습니다.

  1. ubuntu.yml (/home/ansible/playbook):
---
- name: Ubuntu Playbook
  hosts: ubun
  become: true
  vars:
   - packages:
     - nginx
     - apache2
     - php-fpm 
  tasks:
   - name: Update apt package
   apt:
   name: "*"
   state: latest
   update_cache: yes
   - name: Install Packages
     apt:
       pkg: "{{ packages }}"
       state: latest
       update_cache: yes
   - name: Apache Service Start
     service:
       name: nginx
       state: restarted
       enabled: yes
  1. centos.yml(/home/ansible/playbook):
---
- name: CentOS Playbook
  hosts: cent
  become: true
  vars:
   packages:
   - epel-release
   - httpd
   - nginx
   - php-fpm
  tasks:
   - name: Update yum package
     yum:
       name: "*"
       state: latest
       update_cache: yes
   - name: Install Packages
     yum:
       name: "{{ packages }}"
       state: latest
       update_cache: yes
   - name: Apache Service Start
     service:
       name: nginx
       state: restarted
       enabled: yes
  1. base.yml(/home/ansible/playbook):
---
- name: Base Playbook
  hosts: aws
  become: true
  tasks:
    - name: Performing Tasks for CentOS
      when: ansible_facts['distribution'] == 'CentOS'
      include_tasks: centos.yml
    - name: Performing Tasks for Ubuntu
      when: ansible_facts['distribution'] == 'Ubuntu'
      include_tasks: ubuntu.yml

내 3개의 Ansible 그룹은 다음과 같습니다.

  • [aws] 두 서버 모두 포함

  • CentOS 서버를 포함하는 [cent]

  • Ubuntu 서버가 포함된 [ubun]

centos.yml건식 실행 과 별도로 시도했는데 ubuntu.yml작동했지만 건식 실행을 시도하면 base.yml다음 오류가 발생합니다.

    FAILED! => {"reason": "unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>\n\nThe error appears to be in '/home/ansible/playbook/centos.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: CentOS Playbook\n  ^ here\n"}

    FAILED! => {"reason": "unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>\n\nThe error appears to be in '/home/ansible/playbook/ubuntu.yml': line 2, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n---\n- name: Ubuntu Playbook\n  ^ here\n"}

import_tasks이미 교체 를 시도했지만 include_tasks동일한 오류가 발생합니다.

답변1

내 해결책은 동일한 작업을 수행하므로 이들을 하나의 연극으로 병합하는 것입니다.

---
- name: php-fpm play
  hosts: aws
  become: true
  vars:
  - repo:
      Debian:
      - apt # already installed, but need something here
      RedHat:
      - epel-release
  - packages:
      Debian:
      - apache2
      #- nginx # cannot have 2 listening on port 80
      - php-fpm
      RedHat:
      - httpd
      #- nginx
      - php-fpm
  - services:
      Debian: apache2
      RedHat: httpd

  tasks:
     # TODO move update * task to different play

   - name: Install repo
     # Seperate package transaction for EPEL
     # so it is available in the next task
     package:
       name: "{{ repo[ansible_os_family] }}"

   - name: Install Web Server Packages
     # Keyed by OS family fact to also support RHEL and Debian
     package:
       name: "{{ packages[ansible_os_family] }}"
       state: latest

   - name: Web Service Start
     service:
       name: "{{ services[ansible_os_family] }}"
       state: restarted
       enabled: yes

포트 80 및 443에서 수신 대기하는 여러 서버를 가질 수 없습니다. 작업에 "Apache Service Start"라는 레이블이 잘못 지정되었으므로 nginx를 주석 처리했습니다. 이러한 프록시 중 하나를 다른 것 또는 다른 것에 대해 프록시하려면 구성 파일을 배포하여 포트를 변경해야 합니다.

package:실제 패키지 관리자에게 위임하는 작업을 사용했습니다 . 다양한 OS에서 패키지 설치 작업을 실행할 수 있도록 합니다. 그렇게 할 수는 없지만 update_cacheapt처럼 저장소를 추가할 때는 yum이 필요하지 않습니다.

Vars 구조는 OS 제품군별 값을 나타냅니다. 이를 통해 팩트별로 패키지 및 서비스 이름을 색인화할 수 있습니다. OS 제품군이므로 CentOS 및 Ubuntu 외에도 RHEL 및 Debian에서도 작동합니다.

들여쓰기가 잘못되었습니다. 모듈 매개변수는 name:.

include_tasks에서만 작동하는 전체 플레이는 불가능합니다 import_playbook. include_tasks해당 파일에 대한 작업 디렉터리가 있는 역할이 있으면 더 쉽습니다. (플레이 수준의 작업도 중요하지만 저는 모든 것을 수행하는 역할을 선호합니다.)


이것을 유용하게 만들기 위해서는 아직 더 많은 작업이 필요합니다.

template구성을 설치하는 데 사용해야 하는 경우 EL은 구성을 에 /etc/httpd/두고 Debian은 에 있습니다 /etc/apache2/.

아이디어를 원하는 경우 확인할 수 있도록 많은 웹 서버 역할이 오픈 소스로 제공됩니다. 확인하다은하.

작업을 역할로 이동하여 재사용을 가능하게 하는 것을 고려하세요.

답변2

역할을 예로 들면 더 좋습니다. 여기에 고정 코드가 있습니다.

---

- hosts: aws
  remote_user: myuser
  become: true
  tasks:
  - name: Performing Tasks for CentOS
    include_tasks: centos.yml
    when: ansible_facts['distribution'] == 'CentOS'
  - name: Performing Tasks for Ubuntu
    include_tasks: ubuntu.yml
    when: ansible_facts['distribution'] == 'Ubuntu'

centos.yml 작업:

---

- name: installing httpd
  yum: pkg=httpd state=present

ubuntu.yml 작업:


- name: installing apache2
  apt: pkg=apache2 state=present

작업 파일에는 호스트, 작업 등이 없이 작업만 필요합니다.

관련 정보