ansible受控节点上创建文件或目录

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命令类似,如果不存在则创建一个空文件,如果存在,则更新其修改时间

---
- hosts: 192.168.25.130
  tasks:
    - name:
      file:
        path: /opt/kk      //指定文件路径
        owner: tom
        group: tom
        mode: 0640      //指定文件权限
        state: touch



注意: 用户必须存在

1.2.2 修改文件属性

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

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

修改文件属性,设定selinux类型,此时为临时更改

---
- hosts: 192.168.25.130
  tasks:
    - name:
      file:
        path: /opt/kk
        owner: tom
        group: tom
        mode: 0640
        state: touch

    - name: Set selinex
      file:
        path: /opt/kk
        setype: samba_share_t


[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom unconfined_u:object_r:samba_share_t:s0 0 7月  28 08:56 kk

上述修改类型为临时修改,刷新selinux授权表后,设定消失

[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom unconfined_u:object_r:samba_share_t:s0 0 7月  28 08:56 kk
[root@apache opt]# restorecon -RvvF kk 
Relabeled /opt/kk from unconfined_u:object_r:samba_share_t:s0 to system_u:object_r:usr_t:s0
[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom system_u:object_r:usr_t:s0 0 7月  28 08:56 kk

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

设置文件上下文时,file模块的行为与chcon类似,通过运行restorecon,使用file设置上下文后,用户可以使用system模块集合中的sefcontext来更新SELinux策略。

永久更改文件属性

---
- hosts: 192.168.25.130
  tasks:
    - name:
      file:
        path: /opt/kk
        owner: tom
        group: tom
        mode: 0640
        state: touch

    - name: Set selinex
      sefcontext:
        target: /opt/kk
        setype: samba_share_t
        state: present


[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom system_u:object_r:usr_t:s0 0 7月  28 09:01 kk
[root@apache opt]# restorecon -RvvF kk 
Relabeled /opt/kk from system_u:object_r:usr_t:s0 to system_u:object_r:samba_share_t:s0
[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom system_u:object_r:samba_share_t:s0 0 7月  28 09:01 kk
[root@apache opt]# restorecon -RvvF kk 
[root@apache opt]# ll -Z kk 
-rw-r-----. 1 tom tom system_u:object_r:samba_share_t:s0 0 7月  28 09:01 kk

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

copy模块用于将位于控制节点上的Ansible工作目录中的文件复制到选定的受管主机,此模块假定设置了force: yes。这会强制该模块覆盖远程文件(如果存在但包含与正在复制的文件不同的内容)。如果设置force: no,则它仅会将该文件复制到受管主机(如果该文件尚不存在)。

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

要从受管主机检索文件,请使用fetch模块

---
- hosts: 192.168.25.130
  tasks:
    - name:
      fetch:
        src: /root/anaconda-ks.cfg      //受管主机文件地址
        dest: /opt      //控制主机地址

要确保现有文件中存在特定的单行文本,请使用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模块

[root@ansible ansible]# cat test.yml 
---
- hosts: 192.168.25.130
  tasks:
    - name:
      blockinfile:
        path: /opt/abc
        block: |
          hello word
          hello tom
        state: present

1.2.5 从受管主机中删除文件

从受管主机中删除文件的基本示例是使用file模块和state: absent参数

---
- hosts: 192.168.25.130
  gather_facts: no
  tasks:
    - name:
      file:
        dest: /var/www/html/index.php
        state: absent

[root@ansible ansible]# ansible-playbook group_vars/file.yml 

PLAY [192.168.25.130] *************************************************************

TASK [file] ***********************************************************************
changed: [192.168.25.130]

PLAY RECAP ************************************************************************
192.168.25.130             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


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

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

stat模块的结果,然后显示它检查的文件的MD5检验和

---
- hosts: 192.168.25.130
  tasks:
    - name:
      stat:
        path: /opt/abc
        checksum_algorithm: md5
      register: result

    - debug:
        msg: "The checksum of the file is {{ result.stat.checksum }}"



[root@ansible ansible]# ansible-playbook test.yml 

PLAY [192.168.25.130] **************************************************************

TASK [Gathering Facts] *************************************************************
ok: [192.168.25.130]

TASK [stat] ************************************************************************
ok: [192.168.25.130]

TASK [debug] ***********************************************************************
ok: [192.168.25.130] => {
    "msg": "The checksum of the file is 29401e8d38a72608f735371f2af93f22"
}

PLAY RECAP *************************************************************************
192.168.25.130             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


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

---
- hosts: 192.168.25.130
  tasks:
    - name:
      stat:
        path: /opt/abc
        checksum_algorithm: md5
      register: result

    - debug:
        var: results

[root@ansible ansible]# ansible-playbook test.yml 

PLAY [192.168.25.130] **************************************************************

TASK [Gathering Facts] *************************************************************
ok: [192.168.25.130]

TASK [stat] ************************************************************************
ok: [192.168.25.130]

TASK [debug] ***********************************************************************
ok: [192.168.25.130] => {
    "results": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP *************************************************************************
192.168.25.130             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


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

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

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

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

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

  1. 什么是jinja2模板:简单理解就是把所有固定的值都写成变量的配置文件
  2. 为什么使用jinja2模板:构建出模板可以更方便的管理文件
  3. jinja2模板的关键字
  • {% EXPR %} :表达式或者逻辑
  • {{ EXPR }} :最终向用户输出表达式或结果
  • {# COMMENT #} :注释

语法示例

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


2.1构建jinja2模块

  • jinja2 模板由多个元素组成:数据、变量、表达式
  • 模板中使用的变量可以在 playbook 的 vars 中指定
  • 模板中所有的值都使用变量方式,将来会被受管主机对应的值替代
  • 包含jinja2模板的文件不需要有任何特定的文件扩展名(如.j2)。但是,提供此类文件扩展名会让你更容易记住它是模板文件

2.2 部署jinja2模板

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

与src键关联的值指定来源jinja2模板,而与dest键关联的值指定要在目标主机上创建的文件

[root@ansible ansible]# cat test.yml 
---
- hosts: 192.168.25.130
  tasks:
    - name:
      template:
        src: files/hosts.j2
        dest: /etc/hosts

template模块可以取用validate选项运行任意命令(如visudo -c),在将文件复制到位之前检查该文件的语法是否正确

2.3模板控制结构

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

2.3.1使用循环:jinja2 使用 for 语句提供循环

[root@ansible files]# cat user.yml 
users: 
  - tom
  - jj
  - kk
  - ll


[root@ansible files]# cat user.j2 
{% for user in users  %}
	{{ user }}			 //user 变量将替换为users
{% endfor %}


[root@ansible ansible]# cat test.yml 
---
- hosts: 192.168.25.130
  vars_files:
    - files/user.yml
  tasks:
    - name:
      template:
        src: files/user.j2
        dest: /opt/abc

2.3.2 使用条件句

jinja2使用if语句来提供条件控制,如果满足条件执行程序

[root@ansible files]# cat user.j2 
{% if users %}
    {{ users}}			 
{% endif %}

[root@apache opt]# cat abc 
    ['tom', 'jj', 'kk', 'll']	

2.3.3使用条件和for

使用for语句逐一运行users变量中的所有值,将user替换为各个值,但值为tom时除外
loop.index变量扩展至循环当前所处的索引号。它在循环第一次执行时值为1,每一次迭代递增1

[root@ansible files]# cat user.j2 
{% for user in users if not user == "tom" %}
User number {{ loop.index }} - {{ user }}			 
{% endfor %}


[root@ansible ansible]# cat test.yml 
---
- hosts: 192.168.25.130
  vars_files:
    - files/user.yml
  tasks:
    - name:
      template:
        src: files/user.j2
        dest: /opt/abc

[root@apache opt]# cat abc 
User number 1 - jj			 
User number 2 - kk			 
User number 3 - ll	

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

2.3.4变量过滤器

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

输出结果改写为指定格式

{{ output | to_json }} 		#以 json 格式输出
{{ output | to_yaml }}		#以 yaml 格式输出
{{ output | from_json }}	#对 json 格式字符串进行解析
{{ output | from_yaml }}	#对 yaml 格式字符串进行解析

[root@ansible files]# cat user.j2 
{{ users | to_nice_json }}	

[root@apache opt]# cat abc 
[
    "tom",
    "jj",
    "kk",
    "ll"
]	

2.5.4 变量测试

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

tasks:
...output omitted...
  - debug: msg="the execution was aborted"
    when: returnvalue is failed
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值