文章目录
一、常用文件模块
模块名称 | 释义 |
---|---|
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文件是否存在此行内容,不存在则添加此行。
2.更新ansible追加进去的文本内容。
[root@localhost playbook]# cat qingjun.yml
---
- name: 判断文件内容是否存在
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 判断文件内容是否存在
blockinfile:
path: /opt/qingjun
block: |
大好河山 ##将之前添加进去的内容换成此行,代表之前添加内容会被删除,再在文件里添加此行。
3.追加新文件内容。
[root@localhost playbook]# cat qingjun.yml
---
- name: 判断文件内容是否存在
hosts: 192.168.130.161
gather_facts: no
tasks:
- name: 判断文件内容是否存在
blockinfile:
path: /opt/qingjun
block: |
大好河山
华夏九州 ##追加此行内容。
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
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
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
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
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
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
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
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
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
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
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
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参数自定义打印信息。
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.查看受控机同步过来的目录。
二、jinja2模板
- jinja2模板常用于将主控机带有变量的模板文件传到受控机时,会将变量改为具体的值。
- 自定义的jinja2模板的变量,也会在playbook中引用。
2.1 构建jinja2模板
定义格式:
- {% EXPR %}:用于事实表达式或脚本逻辑。
- {{ EXPR }}:用于向最终用户输出表达式或变量的结果。
- {# COMMENT #}:不会在最终文件里出现,是jinja2文件本身的注释。
注意事项:
- 必须使用template模块,因为它可以修改变量值。
- 在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,受控机验证。
2.2 管理jinja2模板
- 加文件提示,让管理员在操作受控机上的配置文件时,知道这个文件时ansible生成的,不能擅自修改。
1.修改ansible配置文件ansible_managed参数,自定义文件输出提示内容,最后就会在受控机上生成的配置文件里添加这行注释。
2.修改jinja2模板。
3.编写playbook。
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模板定义。
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 %}
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,查看受控机文件内容。
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,受控机查看文件内容。
2.3.15 for循环+清单文件组
- jinja2模板文件中使用groups引用清单文件中的组,根据组名取其中的值,不会取变量值,所以只会取出主机ip。
1.清单文件里由两个组,mq和qq。可以根据主机组名称来取值。
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,受控机查看文件内容。
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,受控机查看文件内容。
4.此时改变jinja2中的判断规则,条件为true时,则将内容输出到受控机。
[root@localhost playbook]# cat file/hosts.j2
# {{ ansible_managed }}
{# if判断语句 #}
{% if 1 < 2 %} ##条件为真,输出内容到受控机。
number user:{{ ansible_facts['default_ipv4']['address'] }}
{% endif %}
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 %}
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 %}
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 %}
4.限制注入变量格式,只能是字符串型,参数from_json和from_yaml。