Ansible基础6——文件模块、jinja2模板

这篇具有很好参考价值的文章主要介绍了Ansible基础6——文件模块、jinja2模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、常用文件模块

模块名称 释义
blockinfile 插入、更新或删除由可自定义标记线包围的多行文本块
copy 将文件从本地或远程计算机复制到受管主机上的某个位置。类似于file模块,copy模块还可以设置文件属性,包括SELinux上下文件。
fetch 此模块的作用和copy模块类似,但以相反方式工作。此模块用于从远程计算机获取文件到控制节点,并将它们存储在按主机名组织的文件树中。
file 设置权限、所有权、SELinux上下文以及常规文件、符号链接、硬链接和目录的时间戳等属性。此模块还可以创建删除常规文件、符号链接、硬链接和目录。其他多个与文件相关的模块支持与file模块相同的属性设置选项,包括copy模块。
lineinfile 确保特定行位于某文件中,或使用反向引用正则表达式来替换现有行。此模块主要在用户想要更改文件的某一行时使用。
stat 检索文件的状态信息,类似于Linux中的stat命令。
synchronize 围绕rsync命令的一个打包程序,可加快和简化常见任务。synchronize模块无法提供对rsync命令的完整功能的访问权限,但确实最常见的调用更容易实施。用户可能仍需通过run command模块直接调用rsync命令。

1.1 blockinfile模块

  • 模块连接
  • 可以判断受控机上的文件内容,前提是受控机上有这个文件。

1.判断受控机上的文件里是否存在某行内容。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 判断文件内容是否存在
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 判断文件内容是否存在
      blockinfile:
        path: /opt/qingjun
        block: |
          Are you  like study            ##判断受控机上的/opt/qingjun文件是否存在此行内容,不存在则添加此行。

Ansible基础6——文件模块、jinja2模板
2.更新ansible追加进去的文本内容。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 判断文件内容是否存在
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 判断文件内容是否存在
      blockinfile:
        path: /opt/qingjun
        block: |
          大好河山     ##将之前添加进去的内容换成此行,代表之前添加内容会被删除,再在文件里添加此行。

Ansible基础6——文件模块、jinja2模板
3.追加新文件内容。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 判断文件内容是否存在
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 判断文件内容是否存在
      blockinfile:
        path: /opt/qingjun
        block: |
          大好河山
          华夏九州     ##追加此行内容。

Ansible基础6——文件模块、jinja2模板

1.2 file模块

  • 模块连接
  • 功能较多,常用模块,可以创建文件,创建目录,创建软连接,并能添加属主属组和相关权限。

1.2.1 创建文件并赋予权限

1.创建文件,属主属组为qingjun,并添加权限。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/qingjun.txt
        owner: qingjun
        group: qingjun
        mode: '644'
        state: touch

Ansible基础6——文件模块、jinja2模板
2.使用符号指定权限创建文件。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/qingjun.txt
        owner: qingjun
        group: qingjun
        mode: u-w,o+w,a+w
        state: touch

Ansible基础6——文件模块、jinja2模板

1.2.2 创建目录并赋予权限

1.创建目录,不指定权限就赋予默认权限。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/baimu
        owner: qingjun
        group: qingjun
        state: directory

Ansible基础6——文件模块、jinja2模板
2.指定目录权限创建。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/baimu
        owner: qingjun
        group: qingjun
        mode: '0777'       ##指定目录权限创建。
        state: directory

Ansible基础6——文件模块、jinja2模板

1.2.3 创建软连接

1.对文件软连接。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        src: /opt/qingjun.txt     ##源文件。
        dest: /opt/baimu/link_qingjun.txt      ##目的地址,自定义连接连接名。
        owner: qingjun
        group: qingjun
        state: link

Ansible基础6——文件模块、jinja2模板
2.对目录软连接。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        src: /opt/baimu            ##源目录。
        dest: /tmp/link_baimu       ##目标地址,自定义连接目录名称,进入连接目录相当于进入源目录。
        owner: qingjun
        group: qingjun
        state: link

Ansible基础6——文件模块、jinja2模板

1.2.4 删除文件或目录

1.删除文件。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/qingjun.txt     ##删除/opt/qingjun.txt文件。
        state: absent

Ansible基础6——文件模块、jinja2模板
2.删除目录。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      file:
        name: /opt/baimu          ##删除/opt/baimu目录。
        state: absent

Ansible基础6——文件模块、jinja2模板

1.3 fetch模块

  • 模块连接
  • 使用fetch模块从受控机上索取文件到本地。

1.将受控机上家目录下的文件传到主控机本地目录。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      fetch:
        src: /root/anaconda-ks.cfg
        dest: /opt

Ansible基础6——文件模块、jinja2模板

1.4 lineinfile模块

  • 模块连接
  • lineinfile模块可以确保某一行是否存在文件里,若存在则返回ok,若不存在则文件末尾追加。

1.判断受控机上的/opt/qingjun文件里否存在“baimu"这一行。若存在,则返回ok;若不存在,则在文件末行追加。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      lineinfile:
        path: /opt/qingjun
        line: baimu
        state: present

Ansible基础6——文件模块、jinja2模板

1.5 stat模块

  • 模块连接
  • 可以查看受管主机的文件状态。

1.查看受控机/opt/qingjun文件状态。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      stat:
        path: /opt/qingjun
        checksum_algorithm: md5
      register: qingjun
    - debug:
        var: qingjun

Ansible基础6——文件模块、jinja2模板
2.获取文件的md5值,若值发生改变,则说明文件内容已被更改过。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 创建文件
  hosts: 192.168.130.161
  gather_facts: no
  tasks:
    - name: 添加权限创建文件
      stat:
        path: /opt/qingjun
        checksum_algorithm: md5
      register: qingjun
    - debug: 
        msg: "该文件当前md5值为:{{ qingjun.stat.checksum }}"   ##指定msg参数自定义打印信息。

Ansible基础6——文件模块、jinja2模板

1.6 synchronize模块

  • 模块连接
  • synchronize模块需要提前安装rsync工具,主控机和受控机都要安装

1.把主控机上的目录一次性同步到所有受控机。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 主控机安装服务
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 安装rsync服务
      yum:
        name: rsync
        state: present

- name: 受控机安装服务
  hosts: all
  gather_facts: no
  tasks:
    - name: 安装rsync服务
      yum:
        name: rsync
        state: present
    - name: 目录同步
      synchronize:
       src: /etc/ansible/playbook
       dest: /opt/

2.查看受控机同步过来的目录。
Ansible基础6——文件模块、jinja2模板

二、jinja2模板

  • jinja2模板常用于将主控机带有变量的模板文件传到受控机时,会将变量改为具体的值。
  • 自定义的jinja2模板的变量,也会在playbook中引用。

2.1 构建jinja2模板

定义格式:

  • {% EXPR %}:用于事实表达式或脚本逻辑。
  • {{ EXPR }}:用于向最终用户输出表达式或变量的结果。
  • {# COMMENT #}:不会在最终文件里出现,是jinja2文件本身的注释。

注意事项:

  1. 必须使用template模块,因为它可以修改变量值。
  2. 在jinja2模板文件里使用for语句和if语句,playbook中使用loop语句和when语句。

1.主控机定义模板文件,模板文件里面可以取事实,可以取变量。取的事实值,将会再传到受控机上时把对应的事实值改为受控机本机的信息。可以先使用setup模块查看收集的事实。

[root@localhost playbook]# cat file/hosts.j2 
{# redis配置文件模板 #}
hostname: {{ ansible_facts.hostname }}
redis_ip: {{ ansible_facts.default_ipv4.address }}

2.编写playbook,将本地的file/hosts模板文件传到受控机的/etc/hosts文件。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all,localhost
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /etc/hosts

3.执行playbook,受控机验证。
Ansible基础6——文件模块、jinja2模板

2.2 管理jinja2模板

  • 加文件提示,让管理员在操作受控机上的配置文件时,知道这个文件时ansible生成的,不能擅自修改。

1.修改ansible配置文件ansible_managed参数,自定义文件输出提示内容,最后就会在受控机上生成的配置文件里添加这行注释。
Ansible基础6——文件模块、jinja2模板
2.修改jinja2模板。
Ansible基础6——文件模块、jinja2模板
3.编写playbook。
Ansible基础6——文件模块、jinja2模板

2.3 控制结构

  • 用户可以在模板文件中使用jinja2控制结构,以减少重复输入,为play中的每个主机动态输入条目,或者有条件地将文本插入到文件中。

2.3.1 for循环语句

  • 使用{% 自定义逻辑 %}表示执行逻辑。
  • {{ 变量 }} 表示取的变量值将会输出到受控机文件内。
2.3.1.1 for循环+变量

1.jinja2模板定义逻辑,使用for循环变量users里的值,变量user作为输出内容。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# 循环语句 #}
{% for user in users %}      ##for表示开始。
{{ user }}
{% endfor %}      ##endfor表示结束。

2.playbook定义users变量循环体。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all
  vars:
    users:        ##将对users变量下的内容进行循环。
      - zhangsan
      - lisi
      - wangwu
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /opt/qingjun

3.执行playbook,查看受控机上输出的文件,文件里的内容正是playbook里的users变量下的内容,如何循环使用jinja2模板定义。
Ansible基础6——文件模块、jinja2模板

2.3.1.2 for循环+loop.index

1.配合loop.index使用,取当前循环索引。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# 循环语句 #}
{% for user in users %}
{{ loop.index }}
{% endfor %} 

Ansible基础6——文件模块、jinja2模板

2.3.1.3 for循环+条件判断
  • 对playbook中的变量进行循环,取出不是qingjun的内容,将其输出到受控机的/opt/qingjun文件里。

1.playbook定义变量循环体。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all
  vars:
    users:
      - zhangsan
      - lisi
      - wangwu
      - qingjun
      - shito
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /opt/qingjun

2.jinja2模板定义循环逻辑。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# 循环语句 #}
{% for user in users if not user == "qingjun" %}
number user:{{ loop.index }} ,{{ user }}
{% endfor %} 

3.执行playbook,查看受控机文件内容。
Ansible基础6——文件模块、jinja2模板

2.3.1.4 for循环+playbook变量组
  • 在playbook中定义变量组,编写jinja2模板文件时可以根据变量组名称应用取其中的值。

1.playbook中定义变量循环体,同时定义两个组,qingjun组和baimu组。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all
  vars:
    group:
      qingjun:
        - zhangsan
        - lisi
        - wangwu
      baimu:
        - skasdk
        - shito
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /opt/qingjun

2.定义jinja2模板文件,对playbook里的qingjun组里的内容进行循环。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# 循环语句 #}
{% for name  in group['qingjun'] %}           ##playbook中的变量组group,其中有个qingjun组。
number user:{{ loop.index }} ,{{ name }}
{% endfor %} 

3.执行playbook,受控机查看文件内容。
Ansible基础6——文件模块、jinja2模板

2.3.15 for循环+清单文件组
  • jinja2模板文件中使用groups引用清单文件中的组,根据组名取其中的值,不会取变量值,所以只会取出主机ip。

1.清单文件里由两个组,mq和qq。可以根据主机组名称来取值。
Ansible基础6——文件模块、jinja2模板
2.编写playbook,虽然仍然存在变量组,但在后面的jinja2模板文件里不再引用。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all
  vars:
    group:
      qingjun:
        - zhangsan
        - lisi
        - wangwu
      baimu:
        - skasdk
        - shito
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /opt/qingjun

3.定义jinja2模板文件,对清单文件里的mq组内容进行循环。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# 循环语句 #}
{% for name  in groups['mq'] %}           ##清单文件中的组mq。
number user:{{ loop.index }} ,{{ name }}
{% endfor %} 

4.执行playbook,受控机查看文件内容。
Ansible基础6——文件模块、jinja2模板

2.3.2 if判断语句

  • if语句与前面的when语句作用相同,当满足条件时则输出内容;不满足条件时,则不输出内容。

1.定义jinja2模板文件,自定义判断条件。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# if判断语句 #}
{% if 1 >2   %}     ##自定义判断条件,当为true时,则输出内容到文件里;当为false时,则不做输出。
number user:{{ ansible_facts['default_ipv4']['address']  }}
{% endif %} 

2.编写playbook,把jinja2文件内容传输到受控机的/opt/qingjun文件里。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 配置受控机配置文件
  hosts: all
  tasks:
    - name: 安装rsync服务
      template:
        src: file/hosts.j2
        dest: /opt/qingjun

3.执行playbook,受控机查看文件内容。
Ansible基础6——文件模块、jinja2模板
4.此时改变jinja2中的判断规则,条件为true时,则将内容输出到受控机。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# if判断语句 #}
{% if 1 < 2   %}       ##条件为真,输出内容到受控机。
number user:{{ ansible_facts['default_ipv4']['address']  }}
{% endif %} 

Ansible基础6——文件模块、jinja2模板

2.4 变量过滤器

  • 变量过滤器也是编写jinja2模板文件,在里面写一些可以优化输出内容格式的参数语句,方便客户阅读。
  • 格式:{{ 变量 | to_json }}

1.输出内容为普通json格式,参数to_json。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# if判断语句 #}
{% if 1 < 2   %}
{{ ansible_facts['default_ipv4'] | to_json   }}
{% endif %} 

Ansible基础6——文件模块、jinja2模板
2.输出为方便阅读的json格式,参数to_nice_json。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# if判断语句 #}
{% if 1 < 2   %}
{{ ansible_facts['default_ipv4'] | to_nice_json }}
{% endif %} 

Ansible基础6——文件模块、jinja2模板
3.输出为yaml格式,参数to_yaml和to_nice_yaml。

[root@localhost playbook]# cat file/hosts.j2 
# {{ ansible_managed  }}
{# if判断语句 #}
{% if 1 < 2   %}
{{ ansible_facts['default_ipv4'] | to_nice_yaml }}
{% endif %} 

Ansible基础6——文件模块、jinja2模板
4.限制注入变量格式,只能是字符串型,参数from_json和from_yaml。
Ansible基础6——文件模块、jinja2模板
Ansible基础6——文件模块、jinja2模板文章来源地址https://www.toymoban.com/news/detail-470144.html

到了这里,关于Ansible基础6——文件模块、jinja2模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年04月11日
    浏览(56)
  • 【python】flask模板渲染引擎Jinja2,流程控制语句与过滤器的用法剖析与实战应用

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年04月11日
    浏览(46)
  • ansible常用文件模块

    blockinfile:         插入、更新或删除由可定义标记包围的多行文本块 lineinfile:         确保特定行位于指定文件中,反向使用正则表达式替换行。 copy:         将本地或远程主机文件复制到受管主机的指定位置,可以设置文件属性,SELinux上下文。 fetch:         与copy相

    2023年04月19日
    浏览(35)
  • ImportError: cannot import name ‘escape‘ from ‘jinja2‘

    使用flask时,导入jinja2报错如下: 然后在必应bing搜索现实jinja2版本应该小于3.1.0 之后在所用环境查看jinja2版本为3.1.2,所以jinja2版本应降到3.1.0一下,之后我把版本改为3.0.2。 但是导入发现依旧报错,然后仔细看了下报错原因。发现所用的环境是AppData下的,于是又把系统的环境

    2024年02月16日
    浏览(54)
  • 解决flask中jinja2插值变量变成字符串的办法

    今天在通过使用{{ variable_name }}这种方式插入html内容时,发现变量内容到了页面中全部变成了字符串, python代码: html代码中插入: 结果这在页面中都变成了类似下图的字符串,并没有渲染 应当在html代码中加入safe告诉引擎不要转义: 之后内容就可以正常被渲染而非显示字符

    2024年01月18日
    浏览(37)
  • 解决 ImportError: cannot import name ‘contextfilter‘ from ‘jinja2‘

    升级 jupyterhub -i 就是选择镜像源,不然更新很慢。 如果是conda环境,运行以下命令 国内镜像: 更新pip

    2024年02月12日
    浏览(49)
  • cannot import name Markup from jinja2解决方案

    将代码改一下,  代码如下:  运行结果:

    2024年02月11日
    浏览(43)
  • ansible(2)-- ansible常用模块

    部署ansible:ansible(1)-- 部署ansible连接被控端_luo_guibin的博客-CSDN博客 目录  一、ansible常用模块 1.1 ping 1.2 command 1.3 raw 1.4 shell 1.5 script 1.6 copy 1.7 template 1.8 yum 11.0.1.13 主控端(ansible) 11.0.1.12 被控端(k8s-master) 查看主控端被控端IP,主控端(10.1.1.13)查看ansible配置文件的被控端,

    2024年02月11日
    浏览(39)
  • 【ansible】认识ansible,了解常用的模块

    目录 一、ansible是什么? 二、ansible的特点? 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步:配置主机清单 第二步:完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1:command模块 模块2:shell模块 模块3:cron模块 模块4:user模块 模块5:gro

    2024年02月20日
    浏览(40)
  • ansible 常用模块

    目录 1.ping模块  2.command模块 3. shell模块 4.copy模块 5.file模块  6.fetch模块 7.cron模块 8.yum模块 9.service模块 10.user模块 11.group模块 12.script 模块  13.setup模块 14. get_url模块 15.stat模块 16.unarchive模块 1.ping模块 使用ansible db1 -m ping 命令进行主机连通性测试  2.command模块 这个模块可以直

    2024年01月24日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包