MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

Ansible-playbook学习之template模块

2024-12-22 18:30 huorong 精选文章 3 ℃ 0 评论

template模块

为什么使用template?

在实际的工作中由于每台服务器的环境配置都可能不同,

但是往往很多服务的配置文件都需要根据服务器环境进行不同的配置,比如Nginx最大进程数、Redis最大内存等。

为了解决这个问题可以使用Ansible的template模块,该模块和copy模块作用基本一样,都是把管理端的文件复制到客户端主机上,但是区别在于template模块可以通过变量来获取配置值,支持多种判断、循环、逻辑运算等,而copy只能原封不动的把文件内容复制过去

直接来个示例吧,本地创建模板文件template.j2(因为ansible用的jinja2引擎,所以用j2后缀)

发行版: {{ distribution }}
系统版本: {{ distribution_version }}
主机名: {{ hostname }}
内核版本: {{ kernel }}
IP地址: {{ ip }}

写个playbook调用该模板

---
- hosts: 192.168.233.167
  remote_user: root
  vars:
    - distribution: "{{ ansible_distribution }}"
    - distribution_version: "{{ ansible_distribution_version }}"
    - hostname: "{{ ansible_hostname }}"
    - kernel: "{{ ansible_kernel }}"
    - ip: "{{ ansible_default_ipv4['address'] }}"
  tasks:
  - name: use template module
    template:
      src: /root/template.j2
      dest: /tmp/hostinfo

说明:playbook中"{{ }}"中是ansible gather_facter获取到的变量值。

template.j2文件中"{{ }}"中的变量是playbook中定义的,不要搞混淆了

jinja2 模板中的变量是调用playbook中定义的变量。

查看一下远程机器的hostinfo文件

[root@localhost ~]# ansible 192.168.233.167 -m shell -a "cat /tmp/hostinfo"
192.168.233.167 | CHANGED | rc=0 >>
发行版: Ubuntu
系统版本: 16.04
主机名: ubuntu
内核版本: 4.4.0-87-generic
IP地址: 192.168.233.167

贴士: Jinja是一种现代且设计友好的Python模板语言而ansible 是使用python开发的,所以在ansible中无论是正常使用变量,还是template模块使用变量都是使用jinja模板。

学过flask的应该很熟悉,jinja的使用也非常灵活,可以做逻辑运算,做for循环,做if判断。在这里就不做多讲解有兴趣的同学可以网上查找资料

再写个使用template模块使用的例子。也是简单的例子。但是会加上简单的运算、循环和逻辑判断

现在,我们需要部署一台nginx服务器,部署需求是

1、nginx的worker_processes个数是cpu核数 x 2

2、部署2个vhosts,一个监听80端口,另一个监听8080端口

3、一个server_name是web1.test.com 另一个server_name是web2.test.com

4、2个vhosts的root路径分别是/var/www/web1和/var/www/web2

整个可能有点复杂,但是也不难。先写playbook

---
- hosts: 192.168.233.167
  remote_user: root
  vars:
    cpu_cores: "{{ ansible_processor_cores }}"
    nginx_vhosts:
      - web1:
        listen_port: 80
        server_name: "web1.test.com"
        root: "/var/www/web1"
      - web2:
        listen_port: 8080
        server_name: "web2.test.com"
        root: "/var/www.web2"
  tasks:
    - name: set nginx config from template
      template: 
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes

再写nginx.conf.j2

worker_processes {{ cpu_cores * 2}} #cpu核心数x2
{% for vhost in nginx_vhosts %}  #循环playbook中nginx_vhosts中的变量
  server {
      listen {{ vhost.listen_port }}
      {% if vhost.server_name is defined %} #判断playbook中是否定义server_name变量
      server_name {{ vhost.server_name }}
      {% endif %}  #if语句结束
      root {{ vhost.root }}
  }
{% endfor %}  #for语句结束

说明:上面模板是nginx配置文件的部分内容,测试使用。正确的做法是把原来的nginx.conf文件修改成nginx.conf.j2文件

看一下结果

[root@localhost ~]# ansible 192.168.233.167 -m shell -a "cat /etc/nginx/nginx.conf"
192.168.233.167 | CHANGED | rc=0 >>
worker_processes 2  #用的是虚拟机只给一个核这里x2,所以值为2
  server {
      listen 80
            server_name web1.test.com
            root /var/www/web1
  }
  server {
      listen 8080
            server_name web2.test.com
            root /var/www.web2
  }

template就说这么多吧

Tags:nginx worker_processes

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言