ping yum template copy user group service raw command shell script
shell,raw,command的区别(除了需要交互的命令以外几乎都可以执行)
shell模块调用的/bin/sh指令执行-可执行受控主机上的脚本
command模块不是调用的shell的指令,所以没有bash的环境变量(不支持管道符,重定向)
raw很多地方和shell类似,更多的地方建议使用shell和command模块。但是如果是使用老版本python,需要用到raw,又或者是客户端是路由器,因为没有安装python模块,那就需要使用raw模块了
3种都不具备幂等性所以一般只用来进行查看性的命令
[root@localhost ~]# ansible all -m ping 192.168.216.131 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong"
控制主机上编辑脚本
[root@localhost /]# cat test.sh !#/bin/bash df -h
返回结果
[root@localhost /]# ansible all -m script -a '/test.sh' 192.168.216.131 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 192.168.216.131 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.216.131 closed." ], "stdout": "/root/.ansible/tmp/ansible-tmp-1626604440.52-7368-87853866289385/test.sh: line 1: !#/bin/bash: No such file or directory\r\nFilesystem Size Used Avail Use% Mounted on\r\ndevtmpfs 872M 0 872M 0% /dev\r\ntmpfs 901M 0 901M 0% /dev/shm\r\ntmpfs 901M 18M 883M 2% /run\r\ntmpfs 901M 0 901M 0% /sys/fs/cgroup\r\n/dev/mapper/rhel-root 22G 4.7G 18G 21% /\r\n/d
[root@localhost ~]# ansible all -m template -a 'src=/etc/ansible/hosts dest=/tmp/' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, 将hosts复制到对方/tmp目录下
state常用的值:
latest:安装软件(最新的) installed:安装软件 present:安装软件 removed:卸载软件 absent:卸载软件
不加参数默认安装加参数 disabled_gpg_check=yes表示忽略
ansible all -m yum -a 'list=installed' 查询安装好的包
[root@ansible ~]# ansible all -m shell -a 'rpm -q httpd' [WARNING]: Consider using the yum, dnf or zypper module rather than running 'rpm'. If you need to use command because yum, dnf or zypper is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message. 192.168.216.131 | CHANGED | rc=0 >> httpd-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64 查询指定包是否存在
[root@localhost ~]# ansible all -m yum -a 'name=httpd state=present' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "", "rc": 0, "results": [
添加组
[root@localhost ~]# ansible all -m group -a 'name=mysql gid=520 state=present' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" },
删除组
[root@localhost ~]# ansible all -m group -a 'name=mysql gid=520 state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true,
[root@localhost ~]# ansible all -m shell -a 'cat /etc/group | grep mysql' 192.168.216.131 | FAILED | rc=1 >> non-zero return code
创建用户
[root@localhost ~]# ansible all -m user -a 'name=xfx uid=1005 ' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true,
[root@ansible ~]# ansible all -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/mginx' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "comment": "", "create_home": true, "group": 973, "home": "/var/mginx", "name": "nginx", "shell": "/sbin/nologin", "state": "present", "system": true, "uid": 975 } 创建一个系统服务账号,不允许登录,家目录在/var/nginx
查询
[root@ansible ~]# ansible all -a 'getent passwd nginx' 192.168.216.131 | CHANGED | rc=0 >> nginx:x:975:973::/var/mginx:/sbin/nologin
删除用户
[root@localhost ~]# ansible all -m user -a 'name=xfx uid=1005 state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, 删除家目录加参数remove=yes
查看httpd服务是否启动
[root@localhost ~]# ansible all -m shell -a 'systemctl status httpd' 192.168.216.131 | FAILED | rc=3 >> * httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd.service(8)non-zero return code 未启动
启动模块
[root@localhost ~]# ansible all -m service -a 'name=httpd state=started' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "name": "httpd", "state": "started", "status": {
[root@localhost ~]# ansible all -m shell -a 'ss -anltp' 192.168.216.131 | CHANGED | rc=0 >> State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=1040,fd=4),("systemd",pid=1,fd=30)) LISTEN 0 32 192.168.122.1:53 0.0.0.0:* users:(("dnsmasq",pid=1745,fd=6)) LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1331,fd=5)) LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=1332,fd=10)) LISTEN 0 128 [::]:111 [::]:* users:(("rpcbind",pid=1040,fd=6),("systemd",pid=1,fd=33)) LISTEN 0 128 *:80 *:* users:(("httpd",pid=31300,fd=4),("httpd",pid=312 有80端口说明已启动
设置开机自启动
[root@localhost ~]# ansible all -m service -a 'name=httpd enabled=yes' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "enabled": true, "name": "httpd",
可以改变名字,组,属主,但目标目录必须存在
[root@localhost ansible]# ll hosts -rw-r--r--. 1 root root 1006 7月 15 23:44 hosts [root@localhost ansible]# ansible all -m copy -a 'src=/etc/ansible/hosts dest=/temp/ mode=0750 owner=tom' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "f4efa214cdc7b62e90f4b625e45493e7a47f6b02", "dest": "/temp/hosts", "gid": 0, "group": "root", "md5sum": "6a36b6fcb5097162cadf27e9cf2a27b8", "mode": "0750", "owner": "tom", "size": 1006, "src": "/root/.ansible/tmp/ansible-tmp-1626607165.66-60457-65789293650640/source", "state": "file", "uid": 1001 }
查看结果
[root@localhost temp]# ll hosts -rwxr-x--- 1 tom root 1006 Jul 18 19:19 hosts
也可以直接写入数据到对方主机
[root@localhost ansible]# ansible all -m copy -a 'content=hello\n111 dest=/tmp/11123 mode=750 owner=tom group=tom' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "74a9ada5b7e646ebaa0ca626391c29ef0f9742de", "dest": "/tmp/11123", "gid": 1001, "group": "tom", "md5sum": "a6cd917b1c09b94db137a24a1969dcb0", "mode": "0750", "owner": "tom", "size": 9, "src": "/root/.ansible/tmp/ansible-tmp-1626608832.33-93242-167051994148452/source", "state": "file", "uid": 1001 }
[root@localhost tmp]# cat 11123 hello 111
加入参数backup=yes,如果复制的版本与原始版本不一样则备份原始版本
[root@localhost ~]# ansible all -m fetch -a 'src=/var/log/messages dest=date/' 192.168.216.131 | CHANGED => { "changed": true, "checksum": "f0df19d66c75a8f1d865b851d5a36ca94b4d3905", "dest": "/root/date/192.168.216.131/var/log/messages", "md5sum": "12b7cdaa125d23a83a838cb7528f94c6", "remote_checksum": "f0df19d66c75a8f1d865b851d5a36ca94b4d3905", "remote_md5sum": null } 抓取受控主机日志
查看
[root@localhost log]# cat messages Jul 18 19:27:01 localhost rsyslogd[1560]: [origin software="rsyslogd" swVersion="8.1911.0-3.el8" x-pid="1560" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Jul 18 19:27:02 localhost rhsmd[123913]: In order for Subscription Manager to provide your system with updates, your system must be registered with the Customer Portal. Please enter your Red Hat login to ensure your system is up-to-date. Jul 18 19:27:30 localhost systemd-logind[1192]: Session 66 logged out. Waiting for processes to exit. Jul 18 19:27:30 localhost systemd-logind[1192]: Removed session 66. Jul 18 19:28:01 localhost systemd[1]: Started Session 70 of user root. Jul 18 19:29:01 localhost NetworkManager[1321]: <info> [1626607741.0709] dhcp4 (ens160): option dhcp_lease_time => '1800' Jul 18 19:29:01 localhost NetworkManager[1321]: <info> [1626607741.0710] dhcp4 (ens160): option domain_name => 'localdomain' Jul 18 19:29:01 localhost NetworkManager[1321]: <info> [1626607741.0711] dhcp4 (ens160): option domain_name_servers => '192.168.216.2' Jul 18 19:29:01 localhost NetworkManager[1321]: <info> [1626607741.0711] dhcp4 (ens160): option expiry => '1626609541'
抓取多个文件需要tar打包后抓取
path-dest=name
[root@ansible ~]# ansible all -m file -a 'path=/date/f3 state=touch' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "dest": "/date/f3", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 }
创建空文件
[root@localhost date]# ls f3
删除文件
[root@ansible ~]# ansible all -m file -a 'path=/date/f3 state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "path": "/date/f3", "state": "absent" }
[root@ansible ~]# ansible all -m file -a 'path=/date/f2 state=directory' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/date/f3", "size": 6, "state": "directory", "uid": 0 } 建立文件夹
[root@localhost date]# ls f2
创建软连接
[root@ansible ~]# ansible all -m file -a 'src=/etc/fstab path=/date/fstab.link state=link' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "dest": "/date/fstab.link", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 10, "src": "/etc/fstab", "state": "link", "uid": 0 }
[root@localhost date]# ls f2 fstab.link
删除软连接
[root@ansible ~]# ansible all -m file -a ' path=/date/fstab.link state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "path": "/date/fstab.link", "state": "absent" }
修改主机名字且永久生效
[root@ansible ~]# ansible all -m hostname -a 'name=test' 192.168.216.131 | CHANGED => { "ansible_facts": { "ansible_domain": "", "ansible_fqdn": "test", "ansible_hostname": "test", "ansible_nodename": "test", "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "name": "test" }
[root@ansible ~]# ansible all -m lineinfile -a 'path=/temp/123 line="1111"' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup": "", "changed": true, "msg": "line added" } 在末尾插入内容
查看结果
[root@test temp]# cat 123 123 456 asd bfg [root@test temp]# cat 123 123 456 asd bfg 1111
[root@ansible ~]# ansible all -m lineinfile -a 'path=/temp/123 regexp="^1" line='222'' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup": "", "changed": true, "msg": "line replaced" } 匹配以1开头的,替换掉
[root@test temp]# cat 123 123 156 asd afg 1111 [root@test temp]# cat 123 123 156 asd afg 222 只替换了最后一个
[root@ansible ~]# ansible all -m lineinfile -a 'path=/temp/123 regexp="^a" state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup": "", "changed": true, "found": 2, "msg": "2 line(s) removed" } 匹配以a开头的,删除他
[root@test temp]# cat 123 123 156 asd afg 222 [root@test temp]# cat 123 123 156 222 以a开头的全被删除了
insertafter/insertbefore///插入之后或之前
[root@ansible ~]# ansible all -m lineinfile -a 'path=/temp/123 insertafter='222' line="111"' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup": "", "changed": true, "msg": "line added" } 将文本插在指定行之后
[root@ansible ~]# ansible all -m blockinfile -a 'path=/temp/123 block="888"' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "Block inserted" } 文件尾部插入数据
[root@test temp]# cat 123 123 156 222 111 [root@test temp]# cat 123 123 156 222 111 # BEGIN ANSIBLE MANAGED BLOCK 888 # END ANSIBLE MANAGED BLOCK 效果于lineinfile类似,不过block会在插入的文本中添加标记
[root@ansible ~]# ansible all -m blockinfile -a 'path=/temp/123 block="999" 'marker='#{mark}000' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "Block inserted" } marker可以替换标记名
#BEGIN000 999 #END000
[root@ansible ~]# ansible all -m blockinfile -a 'path=/temp/123 block="777" 'marker='#{mark}000' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "Block inserted" } 存在相同标记但block值不同
#BEGIN000 777 #END000 结果block被替换
[root@ansible ~]# ansible all -m blockinfile -a 'path=/temp/123 block="" 'marker='#{mark}000' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "Block removed" } block为空则删除标记和标记内容
[root@ansible ~]# ansible all -m blockinfile -a 'path=/temp/123 block="555" 'marker='#{mark}000 insertbefore=BOF' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "msg": "Block inserted" } BOF表示插入到开头EOF表示插入到结尾
disabled=yes=true/no=false
[root@ansible ~]# ansible all -m cron -a 'minute=* weekday=1,7 job="/usr/bin/wall warning" name=warningcron' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "warningcron" ] } 星期一和星期天的每分钟执行计划任务warningcron命令用双引号括起来
Broadcast message from root@test (somewhere) (Sun Jul 18 22:09:01 2021): warning
目标主机计划任务表
#Ansible: warningcron * * * * 1,7 /usr/bin/wall warning
禁用
[root@ansible ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=warningcron' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "warningcron", "None" ] }
[root@test ~]# crontab -l */1 * * * * date #Ansible: warningcron #* * * * * /usr/bin/wall warning 被注释了
[root@ansible ~]# ansible all -m cron -a 'disabled=no job="/usr/bin/wall warning" name=warningcron' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "warningcron" ] }
[root@test ~]# crontab -l */1 * * * * date #Ansible: warningcron * * * * * /usr/bin/wall warning 取消注释了
删除
[root@ansible ~]# ansible all -m cron -a 'disabled=no job="/usr/bin/wall warning" name=warningcron state=absent' 192.168.216.131 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [] } /state=absent