部署文件到受管主机
准备环境
[lyk@controller ~]$ mkdir web && cd web[lyk@controller web 16:37:14]$ cat > ansible.cfg <<'EOF'> [defaults]> remote_user = lyk> inventory = ./inventory> > [privilege_escalation]> become = True> become_user = root> become_method = sudo> become_ask_pass = False> EOF[lyk@controller web 17:03:18]$ cat > inventory <<'EOF'> controller> node1> node2> node3> node4> EOF
修改文件并将其复制到主机
添加文件
1 ---2 - hosts: node13 gather_facts: no4 tasks:5 - name: Touch a file and set permissions6 file:7 path: /tmp/testfile8 owner: lyk9 group: wheel10 mode: 064011 state: touch [lyk@controller web 17:20:21]$ ansible-playbook playbook.yml PLAY [node1] ************************************************************************TASK [Touch a file and set permissions] *********************************************changed: [node1]PLAY RECAP **************************************************************************node1 : ok=1 changed=1 unreachable=0 failed=0 skippe#创建出新文件[root@node1 ~ 17:14:30]# ls -1 /tmp/testfile/tmp/testfile
删除文件
1 --- 2 - hosts: node1 3 gather_facts: no 4 tasks: 5 - name: delete file 6 file: 7 path: /tmp/testfile8 state: absent [lyk@controller web 17:20:27]$ ansible-playbook playbook.yml PLAY [node1] ***********************************************************************TASK [delete file] *****************************************************************changed: [node1]PLAY RECAP *************************************************************************node1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #已删除 [root@node1 ~ 17:17:45]# ls -1 /tmp/testfilels: 无法访问/tmp/testfile: 没有那个文件或目录
sefcontext 模块
1 --- 2 - hosts: node1 3 gather_facts: no 4 tasks: 5 - sefcontext: 6 target: '/samba(/.*)?'7 setype: samba_share_t8 state: present [root@node1 ~ 17:29:29]# sudo yum install -y policycoreutils-python[root@node1 ~ 17:29:29]# sudo vim /etc/selinux/configSELINUX=enforcing[root@node1 ~ 17:31:16]# sudo reboot[lyk@controller web 17:31:39]$ ansible-playbook playbook.yml PLAY [node1] ***********************************************************************TASK [sefcontext] ******************************************************************changed: [node1]PLAY RECAP *************************************************************************node1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
lineinfile 模块
示例1:给文件加一行内容(确保存在)
核心功能:往文件里加一行特定内容,如果这行已经有了,就不动;没有就加上。
#基础用法:直接在文件里加一行(默认加在文件末尾)---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /tmp/testfileline: 'Add this line to file' # 要加的内容state: present
insertbefore,最后一个匹配到前插入
---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: 'Listen 82'insertbefore: 'Listen 80'state: present#Listen 82 # 新内容插在"Listen 80"的前面#Listen 80 # 原来的行
insertafter,最后一个匹配到后插入
---- hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: 'Listen 82'insertafter: 'Listen 80'state: present#Listen 80 # 原来的行#Listen 82 # 新内容插在"Listen 80"的后面
示例2:替换文件里的某一行*
核心功能:找到文件中符合 “规则” 的行,用新内容替换它。
#regexp: 'Add':只要一行里有Add这个词,就把整行换成replace---- hosts: node1gather_facts: notasks:- name: replace linelineinfile:path: /tmp/testfileregexp: 'Add' line: 'replace'state: present
#regexp: '^Listen 80':专门找以Listen 80开头的行,把它换成#Listen 80(加个注释符) --- - hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /etc/httpd/conf/httpd.confline: '#Listen 80'regexp: '^Listen 80' state: present
示例3:替换成多行内容
核心功能:找到符合规则的行后,不是换一行,而是换成好几行内容。
--- - hosts: node1gather_facts: notasks:- name: add linelineinfile:path: /tmp/testfileline: |line 1line 2regexp: 'replace'state: present #这里的|符号表示 “多行文本”,意思是:把找到的行(符合regexp: 'replace'的行)换成两行内容:line 1和line 2。#举例:相当于把作文里的某一句话,改成一整段话(包含好几行)。
总结区别
示例 | 操作目的 | 关键点 |
---|---|---|
1 | 加一行(可指定位置) | 只加不删,已有则不重复加 |
2 | 替换某一行 | 用新内容换掉旧行(按规则找旧行) |
3 | 替换成多行 | 用好几行内容换掉旧行 |
replace 模块:批量替换符合规则的内容
--- - hosts: node1gather_facts: notasks:- name: replace multi linereplace:path: /tmp/testfileregexp: '^Hello World.*'replace: 'Hello lyk'#执行示例中的replace任务后:#会找所有 “以Hello World开头” 的行(regexp: '^Hello World.*'的意思) #把这些行全部换成Hello lyk#举例: Hello lyk # 替换了第一行 abc Hello World xyz # 没被替换(因为不是以Hello World开头)其他不相关的内容
blockinfile 模块:添加一整块内容(带标记)
作用:往文件里插入 “一整块多行内容”,并且会自动加特殊标记(注释)把这块内容包起来。
执行示例中的
blockinfile
任务后,/tmp/testfile
里会新增这样一段:
--- - hosts: node1gather_facts: notasks:- name: add block lines to fileblockinfile:path: /tmp/testfileblock: |line 1 in fileline 2 in fileaaline 3 in file sssstate: present
执行示例中的blockinfile
任务后,/tmp/testfile
里会新增这样一段:
# BEGIN ANSIBLE MANAGED BLOCK line 1 in file line 2 in fileaa line 3 in file sss # END ANSIBLE MANAGED BLOCK
关键点:
插入的是 “多行内容”(用
|
符号定义)自动在内容前后加注释标记(
# BEGIN...
和# END...
),方便后续识别和管理如果再次执行同样的任务,不会重复添加,只会更新内容(如果内容有变化)
举例:就像给文件贴了一张 “便利贴”,便利贴里写了多行内容,并且有明确的开头和结尾标记,别人一看就知道这部分是通过 Ansible 添加的。
copy 模块:从控制节点 “推” 文件到被管理节点
就像你把自己电脑上的文件,通过 U 盘拷贝到别人电脑上。
示例 1: 把控制节点(你操作的电脑)上的
/tmp/testfile
文件,复制到被管理节点(node1)的/tmp
目录下。特点:如果 node1 的
/tmp
目录下已经有这个文件,默认会直接覆盖(类似强制复制);如果设置force: no
,则不会覆盖。
--- - hosts: node1gather_facts: notasks:- name: copy /tmp/testfile to remote nodecopy:src: /tmp/testfiledest: /tmp
示例 2: 不拷贝现成文件,而是直接在 node1 的
/tmp/testfile
里写内容 —— 比如写一句 “hello world”。相当于直接在别人电脑上新建文件并输入内容,不用先在自己电脑上创建。
--- - hosts: node1gather_facts: notasks:- name: write string into /tmp/testfilecopy:content: "hello world\n"dest: /tmp/testfile
synchronize 模块:用 rsync 工具 “同步” 文件 / 目录(更智能的复制)
类似 “双向同步”,但主要是从控制节点往被管理节点同步,会自动跳过没变的文件,效率更高。
前提:控制节点和被管理节点都要装
rsync
工具(类似两个人都要有 “同步工具”)。示例 1(同步文件): 把控制节点的
/tmp/testfile
同步到 node1 的/tmp
目录。区别于
copy
:如果文件内容没变化,就不重复传输,节省时间;如果变了,只传变化的部分。
--- - hosts: node1gather_facts: notasks:- name: synchronize filesynchronize:src: /tmp/testfiledest: /tmp/
示例 2(同步目录): 把控制节点的
/etc/sysconfig
整个目录(包括里面的所有文件和子目录)同步到 node1 的/tmp
目录下。适合批量同步文件夹,比如网站目录、配置文件夹等。
--- - hosts: node1gather_facts: noremote_user: roottasks:- name: synchronize directorysynchronize:src: /etc/sysconfigdest: /tmp/
fetch 模块:从被管理节点 “拉” 文件到控制节点
和copy
相反,是把别人电脑上的文件拷贝到自己电脑上。
示例
把 node1 上的 /tmp/testfile 拉到控制节点的 /tmp目录下。
特殊点:拉过来的文件会自动按 “被管理节点的名字 + 原路径” 存放,比如
/tmp/node1/tmp/testfile
。这样做是为了区分不同节点的文件(比如从多个节点拉同一个文件名的文件,不会混乱)。
适合收集日志、配置文件等,比如从所有服务器拉取
/var/log/messages
日志到本地分析。
--- - hosts: node1gather_facts: notasks:- name: fetch file from remote nodefetch:src: /tmp/testfiledest: /tmp
文件保存在:/tmp/node1/tmp/testfile
[lyk@controller web]$ tree /tmp/node1 /tmp/node1 └── tmp└── testfile1 directory, 1 file
总结区别
模块 | 方向 | 特点 | 通俗比喻 |
---|---|---|---|
copy | 控制节点 → 被管理节点 | 强制复制,覆盖方便 | 用 U 盘把自己的文件拷给别人 |
synchronize | 控制节点 → 被管理节点 | 智能同步,只传变化的部分 | 用 “增量同步工具” 更新别人的文件 |
fetch | 被管理节点 → 控制节点 | 拉取文件,自动按节点分类 | 把别人的文件拷到自己电脑,按人名建文件 |