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

文章目录

  • 一、常用文件模块
    • 1.1 blockinfile模块
    • 1.2 file模块
      • 1.2.1 创建文件并赋予权限
      • 1.2.2 创建目录并赋予权限
      • 1.2.3 创建软连接
      • 1.2.4 删除文件或目录
    • 1.3 fetch模块
    • 1.4 lineinfile模块
    • 1.5 stat模块
    • 1.6 synchronize模块
  • 二、jinja2模板
    • 2.1 构建jinja2模板
    • 2.2 管理jinja2模板
    • 2.3 控制结构
      • 2.3.1 for循环语句
        • 2.3.1.1 for循环+变量
        • 2.3.1.2 for循环+loop.index
        • 2.3.1.3 for循环+条件判断
        • 2.3.1.4 for循环+playbook变量组
        • 2.3.15 for循环+清单文件组
      • 2.3.2 if判断语句
    • 2.4 变量过滤器

一、常用文件模块

模块名称 释义
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模板_第1张图片
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模板_第2张图片
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模板_第3张图片

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模板_第4张图片
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模板_第5张图片

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模板_第6张图片
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模板_第7张图片

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模板_第8张图片
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模板_第9张图片

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模板_第10张图片
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模板_第11张图片

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模板_第12张图片

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模板_第13张图片

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模板_第14张图片
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模板_第15张图片

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模板_第16张图片

二、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模板_第17张图片

2.2 管理jinja2模板

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

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

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模板_第21张图片

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模板_第22张图片

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模板_第23张图片

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模板_第24张图片

2.3.15 for循环+清单文件组

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

1.清单文件里由两个组,mq和qq。可以根据主机组名称来取值。
Ansible基础6——文件模块、jinja2模板_第25张图片
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模板_第26张图片

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模板_第27张图片
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模板_第28张图片

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模板_第29张图片
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模板_第30张图片
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模板_第31张图片
4.限制注入变量格式,只能是字符串型,参数from_json和from_yaml。
Ansible基础6——文件模块、jinja2模板_第32张图片
Ansible基础6——文件模块、jinja2模板_第33张图片

你可能感兴趣的:(Ansible,ansible,linux,运维,自动化)