在受管节点上创建文件或目录
修改文件并将其复制到主机
常用的文件模块
blockinfile | #将文本块添加到现有文件 |
copy | #将文件复制到受管主机 |
fetch | #从受管主机拷贝文件到控制节点 |
file | #设置文件属性 |
lineinfile | #确保特定行位于某个文件 |
stat | #检索文件状态信息 |
synchronize | #rsync 命令的一个打包程序 |
测试1:
使用 file 模块处理文件,如果不存在就新建出来
---
- name: Test
hosts: usersevers
tasks:
- name: Touch file
file:
path: /mnt/testfile #写入需要创建的文件路径和文件名
owner: redhat # 文件拥有者
group: root #文件拥有组
mode: 0555 #文件的权限
state: touch
...
执行后去受管主机查看
测试2:
创建文件,并修改文件的安全上下文
---
- name: Test
hosts: usersevers
tasks:
- name: Touch file
file:
path: /mnt/testfile
owner: redhat
group: root
mode: 0555
state: touch
- name: Set up selinux
file:
path: /mnt/testfile
setype: samba_share_t
...
执行后查看文件的安全上下文状态
但是这种修改方式是临时修改,使用命令刷新安全上下文就会还原
测试3:
创建文件,并永久修改文件的安全上下文
---
- name: Test
hosts: usersevers
tasks:
- name: Touch file
file:
path: /mnt/testfile
owner: redhat
group: root
mode: 0555
state: touch
- name: Set up selinux
file:
path: /mnt/testfile
setype: samba_share_t
- name: Save selinux
sefcontext:
target: /mnt/testfile
setype: samba_share_t
state: present
...
在受管主机上复制和编辑文件
可以使用到的模块有:blockinfile、 copy、 fetch、 lineinfile
例:
---
- name: Copy file
hosts: usersevers
tasks:
copy:
src: /mnt/testfile #文件原路径
dest: /mnt/testfile #复后存放的路径
...
检测受管主机上的文件状态
检测文件的 MD5 校验和输出结果
tasks:
- name: Touch file
file:
path: /mnt/testfile
owner: redhat
group: root
mode: 0555
state: touch
- name: Verify the status
stat:
path: /mnt/testfile
checksum_algorithm: md5
register: result
- debug:
msg: "The checksum is {{ result.stat.checksum }}"
...
使用 jinja2 模板部署自定义文件
构建出模板可以更方便的管理文件
{% EXPR %} #表达式或者逻辑
{{ EXPR }} #最终向用户输出表达式或结果
{# COMMENT #} #注释
构建 jinja2 模板
jinja2 模板由多个元素组成:数据、变量、表达式
模板中使用的变量可以在 playbook 的 vars 中指定 模板中所有的值都使
用变量方式,将来会被受管主机对应的值替代
如:将 /etc/ssh/sshd_config 文件 中的配置替换为变量引用
Port 22 ==> Port {{ ssh_port }}
PermitRootLogin yes ==> {{ root_allowed }}
部署 jinja2 模板
tasks:
- name: template
template:
src: /root/j2-template.j2
dest: /root/dest-config-file.txt
结构设置
使用循环语句
jinja2 使用 for 语句提供循环:
{% for user in users %}
{{ user }} #user 变量将循环使用 users
{% endfor %}
{% for myhost in groups['myhosts'] %} #列出 myhosts 组中所有主机
{{ myhosts }}
{% endfor %}
使用条件句
{% if finished %} #只有此条件为真,才会将 result 变量的值放入文件
{{ result }}
{% endif %}
jinja2 的循环和条件只能在模板中使用,不能在 playbook 中使用
变量过滤器
{{ output | to_json }} #以 json 格式输出
{{ output | to_yaml }}
{{ output | from_json }} #对 json 格式字符串进行解析
{{ output | from_yaml }}
jinja2 模板由两个元素构成:变量和表达式,在使用 jinja2 模板时,他们被替换为值;
通过 jinja2 过滤器,模板表达式可以从一种数据格式转换为另一种。