如何使用 Ansible 应用模板文件。

ansible.builtin.template 将模板文件渲染到目标主机。 模板通过 Jinja2 模板语言处理。 此外,你还可以在模板中使用一些特殊变量:ansible_managed、template_host、template_uid、template_path、template_fullpath、template_destpath 和 template_run_date。 今天我们将讨论 Ansible 的模板模块。它的全名是 ansible.builtin.template,属于 ansible-core,包含在所有 Ansible 安装中。 它支持多种操作系统。 对于简单的文本格式化,可以使用 Ansible 的 ansible.builtin.copy 模块;对于创建空文件,可以使用 ansible.builtin.file 模块。 对于 Windows 系统,建议使用 ansible.windows.win_template 模块。

参数

  • src(路径):模板文件路径(通常位于“templates/”目录)
  • dest(路径):目标路径
  • validate(字符串):在复制到目标路径之前运行的验证命令(使用“%s”占位符)
  • backup(布尔值):是否创建备份文件
  • mode/owner/group:文件权限
  • setype/seuser/selevel:SELinux 属性

让我重点介绍模板模块中最常用的参数。 唯一必需的参数是“src”和“dest”。 “src”参数指定模板文件的名称。模板通常存储在“templates”目录下,文件扩展名为“.j2”。 “dest”参数指定在远程机器上渲染模板的路径。 “validate”参数允许你指定在将文件复制到目标位置之前运行的验证命令,这对于服务配置文件非常有用。 请注意,特殊转义序列“%s”将被 Ansible 替换为目标路径。 如果启用“backup”参数,Ansible 会在将文件复制到目标位置之前创建一个包含时间戳信息的备份文件。 我们还可以指定文件权限和 SELinux 属性。

示例:使用 Ansible Playbook 应用文件模板

代码文件: template.yml

---
- name: template module demo
  hosts: all
  become: true
  vars:
    page_title: "Placeholder"
    page_description: |
      This is my placeholder page example.
      Multiline is possible ;-)
  tasks:
    - name: install Nginx
      ansible.builtin.apt:
        name: nginx
        state: latest
    - name: apply page template
      ansible.builtin.template:
        src: templates/placeholder.html.j2
        dest: /var/www/html/index.html

模板文件: templates/placeholder.html.j2

<html>
<head>
  <title>{{ page_title }}</title>
</head>
<body>
  <h1>{{ page_title }}</h1>
  <p>{{ page_description }}</p>
</body>
</html>

执行命令:

$ ansible-playbook -i virtualmachines/ubuntu/inventory apply_template/template.yml

执行结果:

PLAY [template module demo] ******************************************

TASK [Gathering Facts] ***********************************************
ok: [ubuntu.example.com]

TASK [install Nginx] *************************************************
changed: [ubuntu.example.com]

TASK [apply page template] *******************************************
changed: [ubuntu.example.com]

PLAY RECAP ************************************************************
ubuntu.example.com         : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

执行前的状态

$ ssh devops@ubuntu.example.com
devops@ubuntu:~ $ sudo su
root@ubuntu:/home/devops# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
root@ubuntu:/home/devops# apt list installed nginx -a
Listing... Done
nginx/focal-updates,focal-updates,focal-security,focal-security 1.18.0-0ubuntu1.2 all
nginx/focal,focal 1.17.10-0ubuntu1 all

root@ubuntu:/home/devops# ls -al /var/
total 52
drwxr-xr-x 13 root root   4096 Oct 27 15:38 .
drwxr-xr-x 19 root root   4096 Oct 27 16:05 ..
drwxr-xr-x  2 root root   4096 Apr 15  2020 backups
drwxr-xr-x 12 root root   4096 Oct 27 15:43 cache
drwxrwxrwt  2 root root   4096 Oct 27 15:38 crash
drwxr-xr-x 41 root root   4096 Oct 27 15:49 lib
drwxrwsr-x  2 root staff  4096 Apr 15  2020 local
lrwxrwxrwx  1 root root      9 Oct 27 15:35 lock -> /run/lock
drwxrwxr-x 10 root syslog 4096 Nov 22 11:56 log
drwxrwsr-x  2 root mail   4096 Jul 31  2020 mail
drwxr-xr-x  2 root root   4096 Jul 31  2020 opt
lrwxrwxrwx  1 root root      4 Oct 27 15:35 run -> /run
drwxr-xr-x  2 root root   4096 Jul 10  2020 snap
drwxr-xr-x  4 root root   4096 Oct 27 15:35 spool
drwxrwxrwt  5 root root   4096 Nov 22 11:56 tmp
root@ubuntu:/home/devops# ls -al /var/www
ls: cannot access '/var/www': No such file or directory

执行后的状态

$ ssh devops@ubuntu.example.com
devops@ubuntu:~ $ sudo su
root@ubuntu:/home/devops# apt list installed nginx -a
Listing... Done
nginx/focal-updates,focal-updates,focal-security,focal-security,now 1.18.0-0ubuntu1.2 all [installed]
nginx/focal,focal 1.17.10-0ubuntu1 all

root@ubuntu:/home/devops# ls -al /var/www/
total 12
drwxr-xr-x  3 root root 4096 Nov 22 12:06 .
drwxr-xr-x 14 root root 4096 Nov 22 12:06 ..
drwxr-xr-x  2 root root 4096 Nov 22 12:06 html
root@ubuntu:/home/devops# ls -al /var/www/html/
total 16
drwxr-xr-x 2 root root 4096 Nov 22 12:06 .
drwxr-xr-x 3 root root 4096 Nov 22 12:06 ..
-rw-r--r-- 1 root root  173 Nov 22 12:06 index.html
-rw-r--r-- 1 root root  612 Nov 22 12:06 index.nginx-debian.html
root@ubuntu:/home/devops# cat /var/www/html/index.html
<html>
<head>
<title>Placeholder</title>
</head>
<body>
<h1>Placeholder</h1>
<p>This is my placeholder page example.
Multiline is possible ;-)
</p>
</body>
</html>