今天继续给大家介绍Linux运维相关知识,本文主要内容是Ansible的Template模板的高级控制。
在上文Ansible详解(十)——Ansible Template模板基础中,我们讲到了Ansible的一些基础使用。实际上,Ansible的Template可以进行更加复杂的控制。今天,我们就来学习以下Ansible Template的高级控制。
一、Ansible Template 之when语句
Ansible Template的when语句可以用于条件测试,when的引入可以使得Ansible的Playbook根据不同的条件执行不同的命令。一个典型的Ansible Playbook中when语句示例如下:
---
- hosts: exp
remote_user: root
tasks:
- name: Install Apache
yum: name=httpd state=installed
- name: Config CentOS6 Apache
copy: src=/etc/ansible/centos6_httpd.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"
- name: Config CentOS7 Apache
copy: src=/etc/ansible/centos7_httpd.conf dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "7"
- name: Start Apache
service: name=httpd state=started
上述Ansible Playbook,可以给客户端安装Apache服务,并且根据客户端系统版本不同安装不同的Apache配置文件。
上述命令执行结果如下:
二、Ansible Template 之for语句
Ansible的Template还支持使用for,表示对Template中的部分内容进行迭代。一个典型的Ansible Template中使用for的示例如下:
---
- hosts: exp
remote_user: root
vars:
nginx_vhosts:
- vhost1:
port: 81
server_name: "web1.pzz.com"
root: "/var/www/nginx/web1"
- vhost2:
port: 82
server_name: "web2.pzz.com"
root: "/var/www/nginx/web2"
- vhost3:
port: 83
server_name: "web3.pzz.com"
root: "/var/www/nginx/web3"
tasks:
- name: install Nginx
yum: name=nginx state=installed
- name: config nginx
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: Start Nginx
service: name=nginx state=started
模板文件关键部分如下:
{
% for vhost in nginx_vhosts %}
server{
listen {
{
vhost.port }};
server_name {
{
vhost.server_name }};
root {
{
vhost.root }};
}
{
% endfor %}
在上例中,我们实现的作用是配置Nginx的虚拟主机,上述Playbook执行过程如下:
上例执行完毕后,在客户端生成的配置文件如下所示:
客户端在打开Nginx服务后,结果如下:
三、Ansible Template 之for if语句
Ansible的Template在for语句的基础上,还可以引入if,可以使得根据条件进行判断,灵活的生成配置文件,进行更加复杂的服务器配置。一个典型的Ansible Template中for if语句示例如下:
---
- hosts: exp
remote_user: root
vars:
nginx_vhosts:
- vhost1:
port: 81
server_name: "web1.pzz.com"
root: "/var/www/nginx/web1"
- vhost2:
port: 82
server_name: "web2.pzz.com"
root: "/var/www/nginx/web2"
- vhost3:
server_name: "web3.pzz.com"
root: "/var/www/nginx/web3"
tasks:
- name: install Nginx
yum: name=nginx state=installed
- name: config nginx
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
nginx.conf.j2模板文件部分如下:
{
% for vhost in nginx_vhosts %}
server{
{
% if vhost.port is defined%}
listen {
{
vhost.port }};
{
% else %}
listen 88;
{
% endif %}
server_name {
{
vhost.server_name }};
root {
{
vhost.root }};
}
{
% endfor %}
在上述配置中,vhost为自定义变量,该变量的值由调用该模板的Playbook时不断迭代传入。vhost.port、vhost.server_name和vhost.root为Playbook在定义nginx_vhosts时传入的变量。单大括号为for或者是if语句的标识,双大括号为变量标识。
完成上述定义后,Ansible执行如下所示:
执行完毕后,在被控端上生成的/etc/nginx/nginx.conf文件如下:
可以看出,在该配置文件中,server部分为Ansible的Playbook和Template中变量的不断迭代。
这样,我们在开启Nginx服务后,结果如下:
因此,可以看出,我们的Ansible Template的for配合if语句配置成功!
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200