ansible——在受管节点上创建文件或目录

文章目录

  • 一、修改文件并将其复制到主机
    • 1. 常用文件模块
    • 2. 示例:file模块处理文件
    • 3. 检测受管主机上的文件状态
  • 二、使用 jinja2 模板部署自定义文件
    • 1. 构建jinja2模板
    • 2. 部署jinja2模板
    • 3. 模板控制结构
    • 4. 变量过滤器
    • 5. 模板应用示例
  • 三、总结

一、修改文件并将其复制到主机

1. 常用文件模块

模块 作用
blockinfile 将文本块添加到现有文件
copy 将文件复制到受管主机
fetch 从受管主机拷贝文件到控制节点
file 设置文件属性
lineinfile 确保特定行位于某个文件
stat 检索文件状态信息
synchronize rsync 命令的一个打包程序

2. 示例:file模块处理文件

(1)在受管主机中新建文件,修改文件属性

---
- name: Test
  hosts: web
  tasks:
    - name: Touch a file
      file:
        path: /root/file	#指定文件路径
        owner: student
        group: student
        mode: 0640		#指定文件权限
        state: touch
...

ansible——在受管节点上创建文件或目录_第1张图片
ansible——在受管节点上创建文件或目录_第2张图片


在上述示playbook基础上修改文件属性: 使用setype: samba_share_t,设定selinux类型,此时为临时更改。
ansible——在受管节点上创建文件或目录_第3张图片
ansible——在受管节点上创建文件或目录_第4张图片
在这里插入图片描述


上述修改类型为临时修改,刷新selinux授权表后,设定消失。
ansible——在受管节点上创建文件或目录_第5张图片
永久更改文件属性:

---
- name: Test
  hosts: web
  tasks:
    - name: Touch a file
      file:
        path: /root/file
        owner: student
        group: student
        mode: 0640
        state: touch
    - name: Set SElinux
      file:
        path: /root/file
        setype: samba_share_t
    - name: Set SELinux
      sefcontext:			#使用此模块永久更改
        target: /root/file		#指定目标文件
        setype: samba_share_t		#指定selinux类型
        state: present
...

ansible——在受管节点上创建文件或目录_第6张图片
ansible——在受管节点上创建文件或目录_第7张图片


(2)在受管主机上复制和编辑文件:blockinfile copy fetch lineinfile
(3) 从受管主机中删除文件:

- name: Delete file
  file:
    dest: /root/file
    state: absent 	#absent 即删除

3. 检测受管主机上的文件状态

(1)检测文件的 MD5 校验:(在上面代码的最后添加)
使用stat模块,使用模块参数checksum_algorithm: md5检测
ansible——在受管节点上创建文件或目录_第8张图片
ansible——在受管节点上创建文件或目录_第9张图片


(2)同步控制节点和受管主机之间的文件

- name: synchronize file
  synchronize:
    src: file
    dest: /root/file

二、使用 jinja2 模板部署自定义文件

  1. 什么是jinja2模板:简单理解就是把所有固定的值都写成变量的配置文件
  2. 为什么使用jinja2模板:构建出模板可以更方便的管理文件
  3. jinja2模板的关键字:
    (1){% EXPR %} :表达式或者逻辑
    (2){{ EXPR }} :最终向用户输出表达式或结果
    (3){# COMMENT #} :注释

1. 构建jinja2模板

  1. jinja2 模板由多个元素组成:数据、变量、表达式
  2. 模板中使用的变量可以在 playbook 的 vars 中指定
  3. 模板中所有的值都使用变量方式,将来会被受管主机对应的值替代
  4. 例如:将ssh的配置文件/etc/ssh/sshd_config
    Port 22 可以更改为 Port {{ ssh_por t }}
    PermitRootLogin yes 可以更改为 {{ root_allowed }}

2. 部署jinja2模板

tasks:
  - name: template
    template:				#
      src: /root/j2-template.j2		#为了便于标识,一般以.j2结尾
      dest: /root/dest-config-file.txt

3. 模板控制结构

(1)使用循环:inja2 使用 for 语句提供循环

###########第一种#########
{% for user in users %}
	{{ user }}			 #user 变量将遍历 users
{% endfor %}
###########第二种###########
{% for myhost in groups['myhosts'] %}	 #列出 myhosts 组中所有主机
	{{ myhosts }}
{% endfor %}

(2)使用条件句

{% if finished %} #只有此条件为真,才会将 result 变量的值放入文件
	{{ result }}
{% endif %}

注意:jinja2 的循环和条件只能在模板中使用,不能在 playbook 中使用

4. 变量过滤器

变量过滤器:把输出结果改写为指定格式

{{ output | to_json }} 		#以 json 格式输出
{{ output | to_yaml }}		#以 yaml 格式输出
{{ output | from_json }}	#对 json 格式字符串进行解析
{{ output | from_yaml }}	#对 yaml 格式字符串进行解析

5. 模板应用示例

(1)编写jinja2模板:vim motd.j2
在这里插入图片描述
(2)编写playbook:

---
- name: configure SOE
  hosts: all
  remote_user: student
  become: true
  vars:
    - system_owner: [email protected]
  tasks:
    - name: configure /etc/motd
      template:
        src: motd.j2			#jinja2模板源文件路径
        dest: /etc/motd			#受管主机中的目的地文件
        owner: root
        group: root
        mode: 0644
...

(3)运行:
ansible——在受管节点上创建文件或目录_第10张图片
在这里插入图片描述

三、总结

  1. file 模块库包含创建、复制、编辑、修改等权限和其他属性;
  2. 使用 jinja2 模板动态构建文件来部署;
  3. jinja2 模板由两个元素构成:变量和表达式,在使用 jinja2 模板时,他们被替换为值;
  4. 通过 jinja2 过滤器,模板表达式可以从一种数据格式转换为另一种。

你可能感兴趣的:(ansible)