Ansible详解(十一)——Ansible Template高级控制

今天继续给大家介绍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

猜你喜欢

转载自blog.csdn.net/weixin_40228200/article/details/123538727