被管理节点上创建文件或目录

  • 一、修改文件并将其复制到主机
    • 1、描述文件的模块
    • 2、files模块的自动化示例
      • 2.1 确保受管主机上存在文件
      • 2.2 修改文件属性
      • 2.3 使SELinux文件上下文更改具有持久性
      • 2.4 在受管主机上复制和编辑文件
      • 2.5 从受管主机中删除文件
      • 2.6 检索受管主机上的文件状态
      • 2.7 同步控制节点和受管主机之间的文件(目录文件都可同步)
  • 二、使用jinja2模板部署自定义文件
    • 1、jinja2简介
    • 2、构建jinja2模板
    • 3、部署jinja2模板
    • 4、管理模板文件
    • 5、控制结构
      • 5.1 使用循环
      • 5.2 使用条件语句
      • 5.3 变量过滤器
      • 5.4 变量测试

一、修改文件并将其复制到主机

1、描述文件的模块

Files模块库包含的模块允许用户完成与Linux文件管理相关的大多数任务,如创建、复制、编辑和修改文件的权限和其他属性。

常用文件模块

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

2、files模块的自动化示例

在受管主机上创建、复制、编辑和删除文件是用户可以使用Files模块库中的模块实施的常见任务。

2.1 确保受管主机上存在文件

使用file模块处理受管主机上的文件。其工作方式与touch命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间。在本例中,除了处理文件之外,Ansible还确保将文件的所有者、组和权限设置为特定值。

---
- name: testhosts: alltasks:- name:Touch a file and set permissionsfile:path: /root/fileowner: hhhgroup: hhhmode: 0755state: touch

2.2 修改文件属性

使用file模块还可以确保新的或现有的文件具有正确的权限和SELinux类型。
例如,以下文件保留了相对于用户主目录的默认SELinux上下文,这不是所需的上下文。

[root@localhost ~]# ls -Z samba_file
- rw-r--r-- owner group unconfined_u:object_r:user_home_t:s0 samba_file

以下任务确保了anaconda-ks.cfg文件的SELinux上下文件类型属性是所需的samba_share_t类型。此行为与Linux中的chcon命令类似。

---
- name: SELinux type is set to samba_share_tfile:path: /root/samba_filesetype: samba_share_t

示例结果:

[root@localhost ~]# ls -Z samba_file
- rw-r--r-- owner group unconfined_u:object_r:samba_share_t:s0 samba_file

文件属性参数在多个文件管理模块中可用。运行ansible-doc file和ansible-doc copy命令以获取其他信息。

2.3 使SELinux文件上下文更改具有持久性

设置文件上下文时,file模块的行为与chcon类似。通过运行restorecon,可能会意外地撤消使用该模块所做的更改。使用file设置上下文后,用户可以使用system模块集合中的sefcontext来更新SELinux策略,如semanage fcontext。

---
- hosts: webtasks:
- name: SELinux type is persistently set to samba_share_tsefcontext:target: /path/to/samba_filesetype: samba_share_tstate: present

注意:sefcontext模块更新SELinux策略中目标的默认上下文,但不更改现有文件的上下文。

2.4 在受管主机上复制和编辑文件

在此示例中,copy模块用于将位于控制节点上的Ansible工作目录中的文件复制到选定的受管主机。

默认情况下,此模块假定设置了force: yes。这会强制该模块覆盖远程文件(如果存在但包含与正在复制的文件不同的内容)。如果设置force: no,则它仅会将该文件复制到受管主机(如果该文件尚不存在)。

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiontasks: - name: copy:src: /root/abcdest: /root[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [192.168.129.137]TASK [copy] *******************************************************************************************
changed: [192.168.129.137]PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

从受管主机检索文件,请使用fetch模块。这可用于在将参考系统分发给其他受管主机之前从参考系统中检查诸如SSH公钥之类的文件。
fetch

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiongather_facts: notasks: - name: fetch:src: /root/abcdest: /opt[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [fetch] ******************************************************************************************
changed: [192.168.129.137]PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

查看:

[root@192 project]# ls /opt/
192.168.129.137  project

要确保现有文件中存在特定的单行文本,请使用lineinfile模块:
lineinfile

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiontasks: - name: lineinfile:path: /root/abcline: 'Add this line to the file'state: present[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [192.168.129.137]TASK [lineinfile] *************************************************************************************
changed: [192.168.129.137]PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

要将文本块添加到现有文件,请使用blockinfile模块:
block(会覆盖掉之前的数据)

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiontasks: - name: blockinfile:path: /root/abcblock: |jjyyhellobakabakastate: present[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [192.168.129.137]TASK [blockinfile] ************************************************************************************
changed: [192.168.129.137]PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

查看:

[root@hhr ~]# cat abc
Add this line to the file
# BEGIN ANSIBLE MANAGED BLOCK
jjyy
hello
bakabaka
# END ANSIBLE MANAGED BLOCK

注意:使用blockinfile模块时,注释块标记插入到块的开头和结尾,以确保幂等性。

# BEGIN ANSIBLE MANAGED BLOCK
First line in the additional block of text
Second line in the additional block of text
# END ANSIBLE MANAGED BLOCK

用户可以使用该模块的marker参数,帮助确保将正确的注释字符或文本用于相关文件。

2.5 从受管主机中删除文件

受管主机中删除文件的基本示例是使用file模块state: absent参数。state参数对于许多模块是可选的。一些模块也支持其他选项。

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiontasks: - name: file:path: /root/123state: absent[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [192.168.129.137]TASK [file] *******************************************************************************************
changed: [192.168.129.137]PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2.6 检索受管主机上的文件状态

stat模块检索文件的事实,类似于Linux中的stat命令。参数提供检索文件属性、确定文件检验和等功能。

stat模块返回一个包含文件状态数据的值的散列字典,允许用户使用单独的变量引用各条信息。

以下示例注册stat模块的结果,然后显示它检查的文件的MD5检验和。

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiongather_facts: notasks: - name: stat:path: /root/abcregister: result- debug:var: result
[root@192 project]# ansible-playbook playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [stat] *******************************************************************************************
ok: [192.168.129.137]TASK [debug] ******************************************************************************************
ok: [192.168.129.137] => {"result": {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"failed": false,"stat": {"atime": 1627393830.848072,"attr_flags": "","attributes": [],"block_size": 4096,"blocks": 8,"charset": "us-ascii","checksum": "5d15a6efdb648d1eb6712f828e21473baa87705f","ctime": 1627393546.8900664,"dev": 64768,"device_type": 0,"executable": false,"exists": true,"gid": 0,"gr_name": "root","inode": 67166408,"isblk": false,"ischr": false,"isdir": false,"isfifo": false,"isgid": false,"islnk": false,"isreg": true,"issock": false,"isuid": false,"mimetype": "text/plain","mode": "0644","mtime": 1627393546.8890662,"nlink": 1,"path": "/root/abc","pw_name": "root","readable": true,"rgrp": true,"roth": true,"rusr": true,"size": 118,"uid": 0,"version": "1435065990","wgrp": false,"woth": false,"writeable": true,"wusr": true,"xgrp": false,"xoth": false,"xusr": false}}
}PLAY RECAP ********************************************************************************************
192.168.129.137            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

有关stat模块返回的值的信息由ansible-doc记录,或者可以注册一个变量并显示其内容以查看可用内容:

---
- name: Examine all stat output of /etc/passwdhosts: webtasks:- name: stat /etc/passwdstat:path: /etc/passwdregister: results- name: Display stat resultsdebug:var: results

2.7 同步控制节点和受管主机之间的文件(目录文件都可同步)

synchronize模块是一个围绕rsync工具的打包程序,它简化了playbook中的常见文件管理任务。rsync工具必须同时安装在本机和远程主机上。默认情况下,在使用synchronize模块时,“本地主机”是同步任务所源自的主机(通常是控制节点),而“目标主机”是synchronize连接到的主机。

以下示例将位于Ansible工作目录中的文件同步到受管主机:注意:本机和受管机都要安装rsync

[root@192 project]# cat playbook/test.yml
---
- hosts: webname: Touch a file and set permissiongather_facts: notasks: - name: yum:name: rsyncstate: present- name: tongbusynchronize:src: /root/filedest: /opt[root@192 project]# ansible-playbook  playbook/test.yml PLAY [Touch a file and set permission] ****************************************************************TASK [yum] ********************************************************************************************
ok: [192.168.129.135]TASK [tongbu] *****************************************************************************************
changed: [192.168.129.135]PLAY RECAP ********************************************************************************************
192.168.129.135            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

查看:

[root@LAMP ~]# tree /opt/
/opt/
└── file└── abc

二、使用jinja2模板部署自定义文件

1、jinja2简介

Ansible将jinja2模板系统用于模板文件。Ansible还使用jinja2语法来引用playbook中的变量。

变量和逻辑表达式置于标记或分隔符之间。例如,jinja2模板将{% EXPR %}用于表达式或逻辑(如循环),而{{ EXPR }}则用于向最终用户输出表达式或变量的结果。后一标记在呈现时将被替换为一个或多个值,对最终用户可见。使用{# COMMENT #}语法括起不应出现在最终文件中的注释。

在下例中,第一行中含有不会包含于最终文件中的注释。第二行中引用的变量被替换为所引用的系统事实的值。

{# /etc/hosts line #}
{{ ansible_facts['default_ipv4']['address'] }}      {{ ansible_facts['hostname'] }}

2、构建jinja2模板

jinja2模板由多个元素组成:数据、变量和表达式。在呈现jinja2模板时,这些变量和表达式被替换为对应的值。模板中使用的变量可以在playbookvars部分中指定。可以将受管主机的事实用作模板中的变量。

请记住,可以使用ansible system_hostname -i inventory_file -m setup命令来获取与受管主机相关的事实。

下例演示了如何使用变量及Ansible从受管主机检索的事实创建/etc/ssh/sshd_config的模板。当执行相关的playbook时,任何事实都将被替换为所配置的受管主机中对应的值。

注意:包含jinja2模板的文件不需要有任何特定的文件扩展名(如.j2)。但是,提供此类文件扩展名会让你更容易记住它是模板文件。

# {{ ansible_managed }}
# DO NOT MAKE LOCAL MODIFICATIONS TO THIS FILE AS THEY WILL BE LOSTPort {{ ssh_port }}
ListenAddress {{ ansible_facts['default_ipv4']['address'] }}HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_keySyslogFacility AUTHPRIVPermitRootLogin {{ root_allowed }}
AllowGroups {{ groups_allowed }}AuthorizedKeyFile /etc/.rht_authorized_keys .ssh/authorized_keysPasswordAuthentication {{ passwords_allowed }}ChallengeResponseAuthentication noGSSAPIAuthentication yes
GSSAPICleanupCredentials noUsePAM yesX11Forwarding yes
UsePrivilegeSeparation sandboxAcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERSSubsystem sftp /usr/libexec/openssh/sftp-server

3、部署jinja2模板

jinja2模板是功能强大的工具,可用于自定义要在受管主机上部署的配置文件。创建了适用于配置文件的jinja2模板后,它可以通过template模板部署到受管主机上,该模块支持将控制节点中的本地文件转移到受管主机。

若要使用template模块,请使用下列语法。与src键关联的值指定来源jinja2模板,而与dest键关联的值指定要在目标主机上创建的文件

[root@master project]# cat playbook/test.yml
---
- hosts: httpdtasks:- name: template rendertemplate:src: files/hosts.j2dest: /etc/hosts[root@master playbook]# ansible-playbook test.yml PLAY [httpd] *****************************************************************************************TASK [Gathering Facts] *******************************************************************************
ok: [192.168.129.133]TASK [template render] *******************************************************************************
changed: [192.168.129.133]PLAY RECAP *******************************************************************************************
192.168.129.133            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 [root@httpd ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.129.133 httpd

template模块还允许指定已部署文件的所有者、组、权限和SELINUX上下文,就像file模块一样。它也可以取用validate选项运行任意命令(如visudo -c),在将文件复制到位之前检查该文件的语法是否正确。

有关更多详细信息,请参阅ansible-doc template

4、管理模板文件

为避免系统管理员修改Ansible部署的文件,最好在模板顶部包含注释,以指示不应手动编辑该文件。

可使用ansible_managed指令中设置的"Ansible managed"字符串来执行此操作。这不是正常变量,但可以在模板中用作一个变量。ansible_managed指令在ansible.cfg文件中设置:

ansible_managed = Ansible managed

要将ansible_managed字符串包含在jinja2模板内,请使用下列语法:

{{ ansible_managed }}

5、控制结构

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

5.1 使用循环

jinja2使用for语句来提供循环功能。在下例中,user变量替换为users变量中包含的所有值,一行一个值

{% for user in users %}{{ user }}
{% endfor %}

以下示例模板使用for语句逐一运行users变量中的所有值,将myuser替换为各个值,但值为root时除外。

{# for statement #}
{% for myuser in users if not myuser == "root" %}
User number {{ loop.index }} - {{ myuser }}
{% endfor %}

loop.index变量扩展至循环当前所处的索引号。它在循环第一次执行时值为1,每一次迭代递增1。

再如,此模板也使用了for语句,并且假定使用的清单文件中已定义了myhosts变量。此变量将包含要管理的主机的列表。使用下列for语句时,文件中将列出清单myhosts组内的所有主机。

{% for myhost in groups['myhosts'] %}
{{ myhost }}
{% endfor %}

举一个更实际的例子,用户可以使用该模板从主机事实动态生成**/etc/hosts**文件。假设playbook如下:

- name: /etc/hosts is up to datehosts: allgather_facts: yestasks:- name: Deploy /etc/hoststemplate:src: templates/hosts.j2dest: /etc/hosts

下述三行templates/hosts.j2模板从all组中的所有主机构造文件。(由于变量名称的长度,模板的中间行非常长。)它迭代组中的每个主机以获得**/etc/hosts**文件的三个事实。

{% for host in groups['all'] %}
{{ hostvars['host']['ansible_facts']['default_ipv4']['address'] }}      {{ hostvars['host']['ansible_facts']['fqdn'] }}     {{ hostvars['host']['ansible_facts']['hostname'] }}
{% endfor %}

5.2 使用条件语句

jinja2使用if语句来提供条件控制。如果满足某些条件,这允许用户在已部署的文件中放置一行。

在以下示例中,仅当finished变量的值为True时,才可将result变量的值放入已部署的文件。

{% if finished %}
{{ result }}
{% endif %}

注意,在Ansible模板中我们可以使用jinja2循环和条件,但不能在Ansible Playbook中使用。

5.3 变量过滤器

jinja2提供了过滤器,更改模板表达式的输出格式(例如,输出到果JSON)。有适用于YAML和JSON等语言的过滤器。to_json过滤器使用JSON格式化表达式输出,to_yaml过滤器则使用YAML格式化表达式输出

{{ output | to_json }}可实现
{{ output | to_yaml }}

也有其他过滤器,如to_nice_jsonto_nice_yaml过滤器,它们将表达式输出格式化为JSON或YAML等人类可读格式。

{{ output | to_nice_json }}可实现
{{ output | to_nice_yaml }}

from_json和from_yaml过滤器相应要求JSON或YAML格式的字符串,并对它们进行解析。

{{ output | from_json }}可实现
{{ output | from_yaml }}

5.4 变量测试

在Ansible Playbook中与when子句一同使用的表达式是jinja2表达式。用于测试返回值的内置Ansible测试包括failedchangedsuccessdedskipped。以下任务演示了如何在条件表达式内使用测试。

tasks:
...output omitted...- debug: msg="the execution was aborted"when: returnvalue is failed

在被管理节点上创建文件或目录相关推荐

  1. 在被受控节点上创建文件或目录

    章节目录 1. 修改文件并将其复制到主机 1.1 描述文件模块 1.2 files模块的自动化示例 1.2.1 确保受管主机上存在文件 1.2.2 修改文件属性 1.2.3 使SELinux文件上下文 ...

  2. 在被管理主机上创建文件或目录

    文章目录 在被管理主机上创建文件或目录 修改文件并将其复制到主机 files模块的自动化示例 确保受管主机上存在文件 修改文件属性 使SELinux文件上下文更具持久性 在受管主机上复制和编辑文件 从 ...

  3. Android---在SD卡上创建文件或目录总结

    每个程序在手机上运行时,或多或少会需要使用一些手机的存储空间去存储一些用户数据或临时缓存数据等等,通常在存储设备上创建文件或目录,都会成功.但也会有失败的时候,下面会列举一些创建文件或目录失败,常见和 ...

  4. 在受控主机上创建文件或目录

    修改文件并将其复制到主机 描述文件模块 Files模块库包含的模块允许用户完成与Linux文件管理相关的大多数任务,如创建.复制.编辑和修改文件的权限和其他属性.下表提供了常用文件管理模块的列表: 常 ...

  5. 在服务器上创建文件夹,在服务器上创建文件夹

    在服务器上创建文件夹 内容精选 换一换 在迁移之前必须先创建输入文件夹和输出文件夹,并将待迁移的所有SQL脚本复制到输入文件夹中.Linux系统操作如下:由于DSC批量无序地读取输出文件夹,因此,建议 ...

  6. java在FTP服务器创建文件夹,java在ftp服务器上创建文件夹

    java在ftp服务器上创建文件夹 内容精选 换一换 启动目的端时失败,错误码:SMS.3103,提示迁移失败原因"对目的服务器重新建立引导失败".启动目的端后,系统会重新安装目的 ...

  7. echo添加换行 linux_在 Linux 上创建文件的 10 个方法

    我下面将会介绍多个在 Linux 上创建文件的方法.我建议你选择几个简单高效的来辅助你的工作. -- Vinoth Kumar 我们都知道,在 Linux 上,包括设备在内的一切都是文件.Linux ...

  8. 服务器共享目标文件夹访问被拒绝,访问被拒绝尝试在服务器上创建文件夹

    客户端注册系统的每个新项目都会创建一个文件夹来存储位于"\ Images \ Projects {ProjectID}"中的图像,其中{ProjectID}是ID项目.访问被拒绝尝 ...

  9. 在NIO.2中创建文件和目录

    如今,大量的应用程序创建文件或目录的目的非常广泛. 无论是生成报告,导出配置文件还是仅存储一些数据,能够处理这些任务都非常重要. 创建文件和目录是使用文件系统时最常用的功能之一. 图书馆的这一部分进行 ...

最新文章

  1. verilog 里面,always,assign和always@(*)区别
  2. Django_博客_XSS 攻击防范
  3. MFC动态链接库的制作步骤和使用方法
  4. 关于asp.net利用mono部署到Linux上的一些说明
  5. Web框架——Flask系列之json、jsonify模块的使用(十四)
  6. 前端的葵花宝典 - 红宝书《JavaScript高级程序设计(第4版)》学习笔记
  7. python 分类_Python数据类型分类
  8. 我的邮箱又收到了一封信,这一次,关乎爱情
  9. Deep Learning Literature 常用词中英文总结(一)
  10. npm安装typescript
  11. 102份深圳炒房材料曝光 网友举报千人炒房大会
  12. 绝杀《绝地求生》外挂!
  13. 雇员类(JAVA实现简单的类)
  14. linux hg(mercurial)入门
  15. 每天一道剑指offer-旋转数组的最小数字
  16. java的线程的daemon_Java 多线程(四)之守护线程(Daemon)
  17. 锐捷服务器端口映射教程,锐捷路由器端口映射,路由器端口映射
  18. 计算机主机故障有哪些,电脑硬件常见故障有哪些
  19. VueCLI和Vite
  20. css样式 元素自适应长宽比

热门文章

  1. w10谷歌chrome关闭自动更新
  2. 大一计算机应用基础实验指导,大学计算机应用基础实验指导详解.doc
  3. stm32 驱动 触摸屏
  4. Unity_YM_拼图2
  5. 科技“战”疫,AI的春天来了吗?
  6. 基础题库:6 打印ASCII码
  7. Python识别验证码----谷歌reCapture 4*4验证码
  8. 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
  9. 程序员给小孩取的名字
  10. 史上最全PPT制作教程和PPT模板,毕业论文答辩PPT制作方法