我有一台带有 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] 包含两个服务器
[cent] 包含 CentOS 服务器
[ubun] 包含 Ubuntu 服务器
我尝试了空运行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
但我得到了同样的错误。
如果以角色为例,它会更好,这里有固定代码:
centos.yml 任务:
ubuntu.yml 任务:
在任务文件中,您只需要任务,没有主机、任务等。
我的解决方案是将它们合并到一个游戏中,因为它们做同样的事情。
不能有多个服务器监听端口 80 和 443。我注释掉了 nginx,因为一个任务被错误地标记为“Apache 服务启动”。如果您想要其中一个代理另一个或其他东西,您将需要部署一个配置文件来更改端口。
使用
package:
委托给实际包管理器的操作。使包安装任务能够在不同的操作系统上运行。不能那样做update_cache
,但是 yum 在像 apt 那样添加 repos 时不需要它。Vars 结构是 OS 系列特定值的字典。这使得包和服务名称能够被事实索引。操作系统系列,所以除了 CentOS 和 Ubuntu 之外,这也适用于 RHEL 和 Debian。
缩进是错误的。模块参数需要缩进低于任务级别指令的级别,例如
name:
.不能
include_tasks
一整部戏,那只适用于import_playbook
.include_tasks
当你有角色时会更容易,角色有一个用于此类文件的任务目录。(游戏级别的任务是一回事,但我赞成角色做所有事情。)还有更多的工作要使它有用。
当你需要使用
template
安装配置时,EL 将 configs 放入/etc/httpd/
,而 Debian 放入/etc/apache2/
.大量的 Web 服务器角色是开源的,如果你想要想法,可以看看。检查银河。
考虑将您的任务转移到角色,以实现重用。