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

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

1. 文件管理

1.1 blockfile

1.2 fetch

1.3 stat

1.4 synchronize同步

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

2.1 jinja2简介

2.2构建inja2模板

2.3 部署jinja2模板

2.4 管理模板文件

2.5 控制结构

2.5.1 使用循环

2.5.2 使用条件语

2.5.3 变量过滤器


1. 文件管理

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

1.1 blockfile

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      blockinfile:
        path: //tmp/abc
        block: | 
          snde
          sjduie
          dknchewp
[root@yibie playbook]# ansible-playbook test.yml 
PLAY [*] **********************************************************************************
TASK [yibie] ******************************************************************************
changed: [192.168.57.30]
 
PLAY RECAP ********************************************************************************
192.168.57.30              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
 
[root@yibie-apache ~]# cat /tmp/abc 
{yibie: {first_name: yi, last_name: bie, age: 20}, awm: {first_name: wm, age: 22}}
# BEGIN ANSIBLE MANAGED BLOCK
snde
sjduie
dknchewp
# END ANSIBLE MANAGED BLOCK
[root@yibie-apache ~]# > /tmp/abc 
[root@yibie-apache ~]# echo "yibie hui" > /tmp/abc 
[root@yibie-apache ~]# cat /tmp/abc 
yibie hui
[root@yibie-apache ~]# 

1.2 fetch

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      fetch:
        src: /tmp/abc
        dest: /opt
[root@yibie playbook]# ansible-playbook test.yml 
PLAY [*] **********************************************************************************
TASK [yibie] ******************************************************************************
changed: [192.168.57.30]
 
PLAY RECAP ********************************************************************************
192.168.57.30              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
 
[root@yibie playbook]# cd
[root@yibie ~]# cd /opt/
[root@yibie opt]# ls
192.168.57.30
[root@yibie opt]# cd 192.168.57.30/
[root@yibie 192.168.57.30]# ls
tmp
[root@yibie 192.168.57.30]# 

1.3 stat

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      stat:
        path: /tmp/abc
      register: result
    - debug:
        var: result
[root@yibie playbook]# ansible-playbook test.yml 
 
PLAY [*] **********************************************************************************
 
TASK [yibie] ******************************************************************************
ok: [192.168.57.30]
 
TASK [debug] ******************************************************************************
ok: [192.168.57.30] => {
    "result": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "stat": {
            "atime": 1627494146.477639,
            "attr_flags": "",
            "attributes": [],
            "block_size": 4096,
            "blocks": 8,
            "charset": "us-ascii",
            "checksum": "f9e2b4754e3e1e4854907d0b38cf6f95bbdc1bb6",
            "ctime": 1627494140.595591,
            "dev": 64768,
            "device_type": 0,
            "executable": false,
            "exists": true,
            "gid": 0,
            "gr_name": "root",
            "inode": 67286937,
            "isblk": false,
            "ischr": false,
            "isdir": false,
            "isfifo": false,
            "isgid": false,
            "islnk": false,
            "isreg": true,
            "issock": false,
            "isuid": false,
            "mimetype": "text/plain",
            "mode": "0644",
            "mtime": 1627494140.595591,
            "nlink": 1,
            "path": "/tmp/abc",
            "pw_name": "root",
            "readable": true,
            "rgrp": true,
            "roth": true,
            "rusr": true,
            "size": 10,
            "uid": 0,
            "version": "1264199129",
            "wgrp": false,
            "woth": false,
            "writeable": true,
            "wusr": true,
            "xgrp": false,
            "xoth": false,
            "xusr": false
        }
    }
}
 
PLAY RECAP ********************************************************************************
192.168.57.30              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

1.4 synchronize同步

受控主机和控制主机都需要装rsync

可同步单个文件也可同步目录

[root@yibie ansible]# yum -y install rsync
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use 
(过程省略)
 
 
[root@yibie ansible]# cat playbook/test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      yum:
        name: rsync
        state: present
    - name: 同步文件
      synchronize:
        src: files
        dest: /opt 
[root@yibie ansible]# cd playbook/
[root@yibie playbook]# mkdir files
[root@yibie playbook]# ansible-playbook test.yml 
PLAY [*] **********************************************************************************
TASK [yibie] ******************************************************************************
ok: [192.168.57.30]
 
TASK [同步文件] *******************************************************************************
changed: [192.168.57.30]
PLAY RECAP ********************************************************************************
192.168.57.30              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

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

2.1 jinja2简介

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

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

2.2构建inja2模板

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

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

2.3 部署jinja2模板

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

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

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

2.4 管理模板文件

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

[root@yibie playbook]# cat hosts.j2 
{{ ansible_facts['hostname'] }}
{# 注释 #}
{{ ansible_facts['default_ipv4']['address'] }}
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  tasks:
    - name: yibie
      template:      //如果使用copy模块你会发现只会把内容copy过去,不会替换里面的事实
        src: /etc/ansible/playbook/hosts.j2
        dest: /etc/hosts
[root@yibie playbook]#  ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

[root@yibie-apache ~]# cat /etc/hosts
yibie-apache             //看见了主机ip和主机名,如果使用copy模块会看见整个注释和模板
192.168.57.30     

2.5 控制结构

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

2.5.1 使用循环

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

[root@yibie vars]# cat huihui.yml 
info:   
  - hello 1
  - hello 2
  - hello 3
[root@yibie vars]# cd /etc/ansible/playbook/
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  vars_files:
    - /etc/ansible/vars/huihui.yml
  tasks:
    - name: yibie
      template:
        src: /etc/ansible/files/test.j2
        dest: /tmp/abc
[root@yibie playbook]# cat /etc/ansible/files/test.j2 
{% for msg in info %}
 {{ msg }}
{%  endfor %}
[root@yibie playbook]#  ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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


[root@yibie-apache ~]# cat /tmp/abc 
 hello 1
 hello 2
 hello 3
//可以在变量的后面加东西
[root@yibie playbook]# cat /etc/ansible/files/test.j2 
{% for msg in info %}
 {{ msg }}
============
{%  endfor %}
[root@yibie playbook]# ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

[root@yibie-apache ~]# cat /tmp/abc 
 hello 1
============
 hello 2
============
 hello 3
============

以下示例模板使用for语句逐一运行msg变量中的所有值,将msg替换为各个值,但只取hello 2的值

[root@yibie playbook]# cat /etc/ansible/files/test.j2 
{% for msg in info if msg == "hello 2" %}
 {{ msg }}
============
{%  endfor %}
[root@yibie playbook]# ansible-playbook test.yml 


[root@yibie-apache ~]# cat /tmp/abc 
 hello 2
============

值为除了hello 3的其他值

[root@yibie playbook]# cat /etc/ansible/files/test.j2 
{% for msg in info if not msg == "hello 2" %}
 {{ msg }}
============
{%  endfor %}
[root@yibie playbook]# ansible-playbook test.yml 


[root@yibie-apache ~]# cat /tmp/abc 
 hello 1
============
 hello 3
============

 另一种格式

[root@yibie ansible]# cat files/test.j2 
{% for msg in info %}
{%  if msg != "hello 3" %}
 {{ msg }}
{%  endif %}
{%  endfor %}
[root@yibie ansible]# ansible-playbook playbook/test.yml 

[root@yibie-apache ~]# cat /tmp/abc 
 hello 1
 hello 2

指定次数

[root@yibie ansible]# cat files/test.j2 
{% for msg in info %}
{%  if msg != "hello 3" %} //结果里面不会出现3,因为我们把它排除了
count {{ loop.index}} of info is {{ msg }}. //循环第几次对这个info变量循环的值是msg
{%  endif %}
{%  endfor %}
[root@yibie ansible]# ansible-playbook playbook/test.yml 
[root@yibie-apache ~]# cat /tmp/abc 
count 1 of info is hello 1. //出现次数
count 2 of info is hello 2. //第二次对info这个变量循环的是hello2

总结:

  • 不需要用{{}}引用变量的场景:
  • debug模块里面的var参数
  • playbook中用when判断条件时
  • 模块文件定义的时候{% 定义的时候%}

2.5.2 使用条件语

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

[root@yibie ansible]# cat files/test.j2 
{% if "" %}
abc
{% endif %}
[root@yibie ansible]# ansible-playbook playbook/test.yml 
[root@yibie-apache ~]# cat /tmp/abc //条件不成立,abc不搞过来,没有东西,覆盖,所以为空

[root@apache ~]# 

2.5.3 变量过滤器

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

{{ output | to_json }}
{{ output | to_yaml }}
{{ output | to_nice_json }}
{{ output | to_nice_yaml }}
{{ output | from_json }}
{{ output | from_yaml }}

列子:

[root@yibie vars]# cat huihui.yml 
info:
  - name: dong
    age: 20
  - name: hui
    age: 21
[root@yibie ansible]# cat files/test.j2 
{% if " " %} //中间是空格
{{ info }}
{% endif %}
[root@yibie ansible]# ansible-playbook playbook/test.yml 


[root@yibie-apache ~]# cat /tmp/abc 
 
[{'name': 'dong', 'age': 20}, {'name': 'hui', 'age': 21}]
[root@yibie files]# cat test.j2 
{% if " " %}
{{ info | to_nice_json }}
{% endif %}
[root@yibie files]# cd /etc/ansible/
[root@yibie ansible]# ansible-playbook playbook/test.yml 


[root@yibie-apache ~]# cat /tmp/abc 
 
[{'name': 'dong', 'age': 20}, {'name': 'hui', 'age': 21}]
[root@yibie-apache ~]# cat /tmp/abc 
[
    {
        "age": 20,
        "name": "dong"
    },
    {
        "age": 21,
        "name": "hui"
    }
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值