资讯详情

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

1. 修改文件并将其复制到主机

1.1 描述文件模块

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

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

1.2 files模块自动化示例

用户可以使用在受管主机上创建、复制、编辑和删除文件Files模块库中模块执行的常见任务。 这些模块可以自动执行常见的文件管理任务。

1.2.1 确保受管主机上有文件

使用模块处理受管主机上的文件。其工作模式和命令类似,如果不存在,则创建空文件,如果存在,则更新修改时间。在这种情况下,除了处理文件,Ansible确保将文件的所有者、组和权限设置为特定值。

- name: Touch a file and set permissions   file:     path: /path/to/file     owner: user1     group: group1     mode: 0640     state: touch 

1.2.2 修改文件属性

使用模块还可以确保新的或现有的文件有正确的权限和权限SELinux类型。

例如,以下文件保留了与用户主目录相比的默认情况SELinux这不是上下文所需要的。

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

以下任务确保了文件的SELinux上下文件的类型属性是必要的类型。这种行为和Linux中的命令类似。

- name: SELinux type is set to samba_share_t   file:     path: /path/to/samba_file     setype: samba_share_t 

示例结果:

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

文件属性参数可用于多个文件管理模块。命令获取其他信息。

1.2.3 使SELinux文件上下文变更持久

设置文件上下文时,模块与模块类似。通过操作,使用该模块所做的更改可能会意外取消。设置上下文后,用户可以使用集合模块来更新SELinux策略,如

- name: SELinux type is persistently set to samba_share_t   sefcontext:     target: /path/to/samba_file     setype: samba_share_t     state: present  - name: shengxiao   command: restorecon -irv /path/to/samba_file         //加后面的command让这个立即生效,看到效果

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

1.2.4 复制和编辑受管主机上的文件

在这个例子中,在控制节点上使用模块Ansible将工作目录中的文件复制到选定的受管主机上。(将本地放在对面)

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

- name: Copy a file to managed hosts   copy:     src: file     dest: /path/to/file 

请从受管主机检索文件模块。在将参考系统分发给其他受管主机之前,可以用来检查参考系统SSH公钥等文件。(本地放对面)

- name: Retrieve SSH key from reference host   fetch:     src: "/home/{     
      { user }}/.ssh/id_rsa.pub"     dest: "files/keys/{     
      { user }}.pub" 

请确保现有文件中有特定的单行文本模块:

- name: Add a line of text to a file   lineinfile:     path: /path/to/file     line: 'Add this line to the file'     state: present 

将文本块添加到现有文件中,请使用模块:

- name: Add additional lines to a file   blockinfile:     path: /path/to/file     block: |       First line in the additional block of text       Second line in the additional block of text     state: present 

注意:使用在模块中,注释块标记插入块的开头和结尾,以确保功率等效。

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

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

1.2.5 从受管主机中删除文件

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

- name: Make sure a file does not exist on managed hosts
  file:
    dest: /path/to/file
    state: absent
[root@localhost tmp]# ls
abc    //文件
hehe    //目录
systemd-private-53f76c41002447c4ae972294d2c8af96-colord.service-SZqJXi
systemd-private-53f76c41002447c4ae972294d2c8af96-fprintd.service-QgC19e
systemd-private-53f76c41002447c4ae972294d2c8af96-geoclue.service-3sb1Se
systemd-private-53f76c41002447c4ae972294d2c8af96-ModemManager.service-EyGXOi
systemd-private-53f76c41002447c4ae972294d2c8af96-rtkit-daemon.service-bonN9f
tracker-extract-files.0
vmware-root_1011-4290101035

//删除文件
[root@control httpd]# vim test.yml 
[root@control httpd]# cat test.yml 
---
- hosts: all
  gather_facts: no
  tasks:
    - name: delete
      file:
        path: /tmp/abc
        state: absent
[root@control httpd]# ansible-playbook test.yml 

PLAY [all] *************************************************************************

TASK [delete] **********************************************************************
changed: [web01.example.com]

PLAY RECAP *************************************************************************
web01.example.com          : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@localhost tmp]# ls
hehe
systemd-private-53f76c41002447c4ae972294d2c8af96-colord.service-SZqJXi
systemd-private-53f76c41002447c4ae972294d2c8af96-geoclue.service-3sb1Se
systemd-private-53f76c41002447c4ae972294d2c8af96-ModemManager.service-EyGXOi
systemd-private-53f76c41002447c4ae972294d2c8af96-rtkit-daemon.service-bonN9f
tracker-extract-files.0
vmware-root_1011-4290101035

//删除目录
[root@control httpd]# vim test.yml 
[root@control httpd]# cat test.yml 
---
- hosts: all
  gather_facts: no
  tasks:
    - name: delete
      file:
        path: /tmp/hehe
        state: absent
[root@control httpd]# ansible-playbook test.yml 

PLAY [all] *************************************************************************

TASK [delete] **********************************************************************
changed: [web01.example.com]

PLAY RECAP *************************************************************************
web01.example.com          : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@localhost tmp]# ls
systemd-private-53f76c41002447c4ae972294d2c8af96-colord.service-SZqJXi
systemd-private-53f76c41002447c4ae972294d2c8af96-geoclue.service-3sb1Se
systemd-private-53f76c41002447c4ae972294d2c8af96-ModemManager.service-EyGXOi
systemd-private-53f76c41002447c4ae972294d2c8af96-rtkit-daemon.service-bonN9f
tracker-extract-files.0
vmware-root_1011-4290101035


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

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

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

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

- name: Verify the checksum of a file
  stat:
    path: /path/to/file
    checksum_algorithm: md5
  register: result
  
- debug
  msg: "The checksum of the file is {
    
      { result.stat.checksum }}"

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

- name: Examine all stat output of /etc/passwd
  hosts: 172.16.103.129
  
  tasks:
    - name: stat /etc/passwd
      stat:
        path: /etc/passwd
      register: results
      
    - name: Display stat results
      debug:
        var: results

1.2.7 同步控制节点和受管主机之间的文件

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

以下示例将位于Ansible工作目录中的文件同步到受管主机:

- name: synchronize local file to remote files
  synchronize:
    src: file
    dest: /path/to/file

有很多种方法可以使用模块及其许多参数,包括同步目录。运行命令查看其他参数和playbook示例。

2. 使用jinja2模板部署自定义文件

2.1 jinja2简介

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

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

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

{# /etc/hosts line #}
{
    
      { ansible_facts['default_ipv4']['address'] }}      {
    
      { ansible_facts['hostname'] }}
//受控机
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

//主控机
[root@control httpd]# vim files/hosts.j2
[root@control httpd]# cat files/hosts.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{
    
      { ansible_facts['default_ipv4']['address'] }} {
    
      { ansible_facts['hostname'] }} {
    
      { ansible_facts['fqdn'] }}

[root@control httpd]# vim test.yml 
[root@control httpd]# ansible-playbook test.yml 

PLAY [all] *************************************************************************

TASK [update /etc/hosts] ***********************************************************
changed: [web01.example.com]

PLAY RECAP *************************************************************************
web01.example.com          : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@control httpd]# cat test.yml 
---
- hosts: all
  gather_facts: no
  tasks:
    - name: update /etc/hosts
      copy:
        src: files/hosts.j2
        dest: /etc/hosts
[root@control httpd]# 

//受控机查看,这种是把变量完整的复制过去了,而不是转换了复制
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{
    
      { ansible_facts['default_ipv4']['address'] }} {
    
      { ansible_facts['hostname'] }} {
    
      { ansible_facts['fqdn'] }}

[root@localhost ~]# 

2.2 构建jinja2模板

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

请记住,可以使用命令来获取与受管主机相关的事实。

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

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

# {
    
      { ansible_managed }}
# DO NOT MAKE LOCAL MODIFICATIONS TO THIS FILE AS THEY WILL BE LOST

Port {
    
      { 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_key

SyslogFacility AUTHPRIV

PermitRootLogin {
    
      { root_allowed }}
AllowGroups {
    
      { groups_allowed }}

AuthorizedKeyFile /etc/.rht_authorized_keys .ssh/authorized_keys

PasswordAuthentication {
    
      { passwords_allowed }}

ChallengeResponseAuthentication no

GSSAPIAuthentication yes
GSSAPICleanupCredentials no

UsePAM yes

X11Forwarding yes
UsePrivilegeSeparation sandbox

AcceptEnv 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 XMODIFIERS

Subsystem sftp /usr/libexec/openssh/sftp-server

2.3 部署jinja2模板

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

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

tasks:
  - name: template render
    template:
      src: /tmp/j2-template.j2
      dest: /tmp/dest-config-file.txt





//这种可以转换变量
[root@control httpd]# cat test.yml 
---
- hosts: all
  gather_facts: no
  tasks:
    - name: update /etc/hosts
      template:
        src: files/hosts.j2
        dest: /etc/hosts
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.130 web01 web01.example.com


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

有关更多详细信息,请参阅

2.4 管理模板文件

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

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

ansible_managed = Ansible managed

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

{
    
      { ansible_managed }}

2.5 控制结构

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

2.5.1 使用循环

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

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

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

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

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

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

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

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

- name: /etc/hosts is up to date
  hosts: all
  gather_facts: yes
  tasks:
    - name: Deploy /etc/hosts
      template:
        src: templates/hosts.j2
        dest: /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 %}

2.5.2 使用条件句

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

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

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

2.5.3 变量过滤器

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

{
    
      { output | to_json }}
{
    
      { output | to_yaml }}

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

{
    
      { output | to_nice_json }}
{
    
      { output | to_nice_yaml }}

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

{
    
      { output | from_json }}
{
    
      { output | from_yaml }}

2.5.4 变量测试

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

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

标签: 19sb1j电连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台