在被管理节点上创建文件或目录
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"
}
]