Ansible Template高级控制

本文详细介绍了AnsibleTemplate中when、for和forif语句的使用,展示了如何根据条件执行不同任务,如安装Apache服务并配置不同版本的配置文件,以及配置Nginx的虚拟主机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、Ansible Template 之when语句

二、Ansible Template 之for语句

三、Ansible Template 之for if语句


一、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语句配置成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值