ansible.builtin.blockinfile 模块 - 在标记行包围的文本块中插入/更新/删除文本
注意
此模块是 ansible-core
的一部分,包含在所有 Ansible 安装中。在大多数情况下,即使没有指定 集合关键字,您也可以使用简短的模块名称 blockinfile
。但是,我们建议您使用 完全限定的集合名称 (FQCN) ansible.builtin.blockinfile
,以便轻松链接到模块文档并避免与可能具有相同模块名称的其他集合冲突。
概要
此模块将插入/更新/删除由可自定义标记行包围的多行文本块。
参数
参数 |
评论 |
---|---|
如果文件末尾没有出现,则在插入的块末尾追加一个空行。 请注意,当 选择
|
|
结果文件系统对象应具有的属性。 要获取支持的标志,请查看目标系统上 此字符串应包含与 假定 |
|
创建一个备份文件,其中包含时间戳信息,以便您可以检索原始文件,以防您意外地将其覆盖。 选择
|
|
如果文件不存在,则创建一个新文件。 选择
|
|
应拥有文件系统对象的组的名称,如将提供给 当未指定时,它使用当前用户的当前组,除非您是 root 用户,在这种情况下,它可以保留先前的所有权。 |
|
如果指定并且没有找到开始/结束 提供了一个特殊值; 如果指定正则表达式没有匹配项或未传递任何值,则将使用 正则表达式中存在多行标志 (?m) 控制匹配是逐行完成还是跨多行完成。此行为是在 ansible-core 2.14 中添加的。 |
|
如果指定并且没有找到开始/结束 提供了一个特殊值; 如果指定正则表达式没有匹配项,则块将被插入到文件末尾。 正则表达式中存在多行标志 (?m) 控制匹配是逐行完成还是跨多行完成。此行为是在 ansible-core 2.14 中添加的。 |
|
标记行模板。
使用没有 不支持多行标记,这将导致在后续剧本运行时重复插入块。 模块会自动在 默认值: |
|
这将插入到开头 ansible 块 默认值: |
|
这将插入到结尾 ansible 块 默认值: |
|
结果文件系统对象应具有的权限。 对于那些习惯使用 向 Ansible 提供没有遵循以上任何规则的数字将最终得到一个十进制数,这将产生意外的结果。 从 Ansible 1.8 开始,模式可以指定为符号模式(例如, 如果未指定 如果未指定 指定 |
|
应拥有文件系统对象的用户的名称,如将提供给 当未指定时,它使用当前用户,除非您是 root 用户,在这种情况下,它可以保留先前的所有权。 指定数字用户名将被假定为用户 ID,而不是用户名。避免使用数字用户名以避免这种混淆。 |
|
如果插入的块没有出现在文件开头,则在插入的块前添加一个空行。 请注意,当 选择
|
|
SELinux 文件系统对象上下文的级别部分。 这是 MLS/MCS 属性,有时称为 设置为 |
|
SELinux 文件系统对象上下文的角色部分。 设置为 |
|
SELinux 文件系统对象上下文的类型部分。 设置为 |
|
SELinux 文件系统对象上下文的用户部分。 默认情况下,它使用 设置为 |
|
块应该存在还是不存在。 选择
|
|
影响何时使用原子操作来防止目标文件系统对象的数据损坏或不一致读取。 默认情况下,此模块使用原子操作来防止目标文件系统对象的数据损坏或不一致读取,但有时系统会以阻止此操作的方式配置或出现故障。例如,docker 挂载的文件系统对象无法从容器内部进行原子更新,只能以不安全的方式写入。 此选项允许 Ansible 在原子操作失败时回退到不安全的文件系统对象更新方法(但它不会强制 Ansible 执行不安全写入)。 重要!不安全写入会受到竞态条件的影响,并可能导致数据损坏。 选择
|
|
将更新后的文件复制到最终目标之前要运行的验证命令。 使用临时文件路径进行验证,通过 此外,该命令以安全的方式传递,因此 shell 功能(如扩展和管道)将不起作用。 有关如何处理比此选项提供的更复杂的验证的示例,请参阅 处理复杂验证。 |
属性
属性 |
支持 |
描述 |
---|---|---|
支持:完全支持 |
可以在 check_mode 下运行,并在不修改目标的情况下返回更改状态预测,如果不受支持,则操作将被跳过。 |
|
支持:完全支持 |
在 diff 模式下,将返回有关更改内容(或在 check_mode 下可能需要更改的内容)的详细信息 |
|
平台: posix |
可以操作的目标操作系统/系列 |
|
支持:完全支持 |
使用 Ansible 的严格文件操作函数来确保适当的权限并避免数据损坏 |
|
支持:不支持 |
可以自动解密 Ansible 保险库文件 |
备注
示例
# Before Ansible 2.3, option 'dest' or 'name' was used instead of 'path'
- name: Insert/Update "Match User" configuration block in /etc/ssh/sshd_config prepending and appending a new line
ansible.builtin.blockinfile:
path: /etc/ssh/sshd_config
append_newline: true
prepend_newline: true
block: |
Match User ansible-agent
PasswordAuthentication no
- name: Insert/Update eth0 configuration stanza in /etc/network/interfaces
(it might be better to copy files into /etc/network/interfaces.d/)
ansible.builtin.blockinfile:
path: /etc/network/interfaces
block: |
iface eth0 inet static
address 192.0.2.23
netmask 255.255.255.0
- name: Insert/Update configuration using a local file and validate it
ansible.builtin.blockinfile:
block: "{{ lookup('ansible.builtin.file', './local/sshd_config') }}"
path: /etc/ssh/sshd_config
backup: yes
validate: /usr/sbin/sshd -T -f %s
- name: Insert/Update HTML surrounded by custom markers after <body> line
ansible.builtin.blockinfile:
path: /var/www/html/index.html
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
insertafter: "<body>"
block: |
<h1>Welcome to {{ ansible_hostname }}</h1>
<p>Last updated on {{ ansible_date_time.iso8601 }}</p>
- name: Remove HTML as well as surrounding markers
ansible.builtin.blockinfile:
path: /var/www/html/index.html
marker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"
block: ""
- name: Add mappings to /etc/hosts
ansible.builtin.blockinfile:
path: /etc/hosts
block: |
{{ item.ip }} {{ item.name }}
marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.name }}"
loop:
- { name: host1, ip: 10.10.1.10 }
- { name: host2, ip: 10.10.1.11 }
- { name: host3, ip: 10.10.1.12 }
- name: Search with a multiline search flags regex and if found insert after
blockinfile:
path: listener.ora
block: "{{ listener_line | indent(width=8, first=True) }}"
insertafter: '(?m)SID_LIST_LISTENER_DG =\n.*\(SID_LIST ='
marker: " <!-- {mark} ANSIBLE MANAGED BLOCK -->"