锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-09-13 10:30:00 19sb1j电连接器

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

1.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命令。

1.2 files模块自动化示例

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

1.2.1 确保受管主机上有文件

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

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

1.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_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 

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

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

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

- 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让这个立即生效,看到效果

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

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

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

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

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

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

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

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

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

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

- 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 

注意:使用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数,帮助确保将正确的注释字符或文本用于相关文件。

1.2.5 从受管主机中删除文件

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

- 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 检索受管主机上的文件状态

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

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

以下示例注册stat模块的结果,然后显示它检查的文件的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 }}"

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

- 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 同步控制节点和受管主机之间的文件

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

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

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

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

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

2.1 jinja2简介

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

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

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

{# /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模板

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 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模板

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

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

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


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

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

2.4 管理模板文件

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

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

ansible_managed = Ansible managed

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

{
    
      { ansible_managed }}

2.5 控制结构

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

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

2.5.2 使用条件句

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

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

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

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

2.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_jsonfrom_yaml过滤器相应要求JSON或YAML格式的字符串,并对它们进行解析。

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

2.5.4 变量测试

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

tasks:
...output omitted...
  - debug: msg="the execution was aborted"
    when: returnvalue is failed
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章