2개의 서버가 있는 호스트가 있습니다. 하나에는 CentOS가 있고 다른 하나에는 Ubuntu가 설치되어 있습니다.
나는 두 서버 모두에 apache, nginx 및 php-fpm을 설치하기로 결정하고 3개의 플레이북을 작성했습니다.
- 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
- 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
- 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_cache
apt처럼 저장소를 추가할 때는 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
작업 파일에는 호스트, 작업 등이 없이 작업만 필요합니다.