【ansible】5.在受管主机部署文件和Jinja2模板
1.Ansible 中,如何用模块创建一个文件并设置权限644并设置SELinux类型,如何从受管主机中删除文件?
使用ansible.builtin集合中的 file 模块,添加state:touch 创建文件,mode:‘0644’ 设置权限,setype设置SELinux类型,state:absent参数删除文件。
2.想把本地文件app.conf复制到远程/etc/app/,用哪个模块?
copy模块。
3.copy和fetch模块核心区别是什么?
copy是控制节点 → 受管主机传文件;fetch是受管主机 → 控制节点拉文件。
4.要修改远程文件某一行内容(比如替换old_text为new_text),用什么模块?
lineinfile模块
- lineinfile:path: /etc/configregexp: '^old_text'line: 'new_text
5.想修改文件某几行(比如添加一段配置),用哪个模块最方便?
blockinfile模块,可批量插入 / 修改带标记的文本块,比lineinfile更适合多行场景。
6.如何检索受管主机上的文件状态?
使用stat模块检索文件事实,提供检索文件属性等功能。
7.如何递归同步本地目录./dist/到远程/app/,且删除远程多余文件?
使用synchronize模块(基于rsync),加delete:yes实现删除远程不存在的文件:
- synchronize:src: ./dist/dest: /app/delete: yes # 删除远程不存在的文件rsync_opts:- "--exclude=.git" # 可选:排除不需要的文件
8.Jinja2 模板里,{{ var }}和{% code %}有什么区别?
{{ var }}是变量渲染,把变量值替换到模板。{% code %}用于特殊的控制结构或逻辑(如if/for),用来写循环或条件判断。
9.Ansible 中,Jinja2 模板文件一般放哪?默认扩展名是啥?
通常放在playbook项目的templates目录中,.j2为其文件扩展名。
10.模板里想遍历users列表(如users: [alice, bob]),怎么写循环?
{% for user in users %}
{{ user }}
{% endfor %}
11. 模板里判断env变量是否为prod,怎么写条件?
{% if env == ‘prod’ %}
生产环境配置
{% endif %}
12.怎么用 Ansible 部署 Jinja2 模板到目标主机?
使用 ansible.builtin.template 模块,如:
tasks:- name: template renderansible.builtin.template:src: /tmp/j2-template.j2dest: /tmp/dest-config-file.txt
13.怎么避免模板文件被手动修改?
为避免其他系统管理员修改ansible管理的文件,应该在ansible.cfg文件中设置ansible_managed=Ansible managed,然后将模板顶部加注释 {{ ansible_managed }}
14. 模板渲染后内容不对,怎么调试?
用debug模块输出生成的内容;检查变量是否正确传递(-vvv看详细日志)。
15.Jinja2模块的作用?
Jinja2 模板可以将配置文件的结构和逻辑分离,使得开发人员和运维人员能够更清晰地理解配置的生成方式。同时,模板可以被多个 Playbook 复用,减少重复代码的编写。
例如:团队中可能存在多个项目都需要部署 Nginx 服务,通过共享 Nginx 配置的 Jinja2 模板,不同的项目只需要根据自身需求定义不同的变量,就可以快速生成符合项目要求的 Nginx 配置文件,提高了开发和运维的效率。
创建一个 Nginx 配置模板(nginx.conf.j2):jinja2
server {listen {{ nginx_port }};server_name {{ server_name }};location / {root /usr/share/nginx/html;index index.html;}
}在 Ansible 的 Playbook 中,通过定义变量 nginx_port 和 server_name ,
就可以为不同的 Nginx 服务器生成定制化的配置文件。yaml
- name: 部署 Nginx 配置hosts: web_serversvars:nginx_port: 8080server_name: "example.com"tasks:- name: 生成 Nginx 配置ansible.builtin.template:src: nginx.conf.j2dest: /etc/nginx/nginx.conf