文章目录[隐藏]
一、ad-hoc概述
1.什么是ad-hoc
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
2.ad-hoc使用场景
可以用作查看远程机器的进程,或者磁盘,或者拷贝文件
3.ad-hoc命令使用
[root@m01 ~]# ansible webs -m command -a 'free -m' web01 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 1982 143 1688 9 150 1668 Swap: 1023 0 1023 web02 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 1982 142 1684 9 155 1666 Swap: 1023 0 1023
4.ad-hoc结果返回含义
绿色:代表被控端主机内容和控制端内容完全一致 黄色:代表被控端主机发生了内容的改变 粉色:提示、警告信息 红色:代表出现了故障,提示报错
5.ad-hoc常用的模块
command # 执行shell命令(不支持管道等特殊字符) shell # 执行shell命令 scripts # 执行shell脚本 yum_repository # 配置yum仓库 yum # 安装软件 copy # 变更配置文件 file # 建立目录或文件 service # 启动与停止服务 mount # 挂载设备 cron # 定时任务 get_url # 下载软件 firewalld # 防火墙 selinux #selinux
5.ansible帮助
[root@m01 ~]# ansible-doc -l # 查看所有模块说明 [root@m01 ~]# ansible-doc copy # 查看指定模块方法 [root@m01 ~]# ansible-doc -s copy # 查看指定模块参数
二、Ansible命令模块
1.command模块(不识别特殊符号)
默认模块,执行命令,不支持管道符、正则等特殊符号。
[root@m01 ~]# ansible all -m command -a 'free -m' web01 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 972 114 434 13 423 668 Swap: 1023 0 1023 web02 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 972 116 439 7 416 672 Swap: 1023 0 1023
2.shell模块
支持shell的所有命令,权限较大,不建议使用。
[root@m01 ~]# ansible all -m shell -a 'ps -ef | grep httpd' web02 | CHANGED | rc=0 >> root 27226 27221 0 09:22 pts/0 00:00:00 /bin/sh -c ps -ef | grep httpd root 27228 27226 0 09:22 pts/0 00:00:00 grep httpd web01 | CHANGED | rc=0 >> root 28156 28151 0 09:22 pts/0 00:00:00 /bin/sh -c ps -ef | grep httpd root 28158 28156 0 09:22 pts/0 00:00:00 grep httpd [root@m01 ~]# ansible all -m shell -a "ifconfig eth0 | awk 'NR==2 {print \$2}'" web02 | CHANGED | rc=0 >> 10.0.0.8 web01 | CHANGED | rc=0 >> 10.0.0.7
3.script模块(脚本模块)
编写脚本:
[root@m01 ~]# vim mkdir.sh #!/bin/bash mkdir /service
执行script模块ansible命令
[root@m01 ~]# ansible web_group -m script -a '/root/mkdir.sh' web01 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to web01 closed.\r\n", "stderr_lines": [ "Shared connection to web01 closed." ], "stdout": "", "stdout_lines": [] } web02 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to web02 closed.\r\n", "stderr_lines": [ "Shared connection to web02 closed." ], "stdout": "", "stdout_lines": [] }
查看验证:
[root@m01 ~]# ansible web_group -m shell -a 'ls -ld /service' web02 | CHANGED | rc=0 >> drwxr-xr-x 2 root root 6 Mar 18 09:37 /service web01 | CHANGED | rc=0 >> drwxr-xr-x 2 root root 6 Mar 18 09:37 /service
三、Ansible软件管理模块
1.yum模块
yum模块语法:
[root@m01 ~]# ansible-doc yum yum: name: httpd state: latest,absent,present name: httpd #服务名称 http:// #安装软件的地址 file #安装本地的rpm包 state: latest #安装最新版本的包 present #安装软件包(默认为安装) absent #卸载软件包
实例:
#安装服务httpd [root@m01 ~]# ansible web_group -m yum -a 'name=httpd state=present' 相当于在远程机器上:yum install -y httpd #安装云上的服务 [root@m01 ~]# ansible web_group -m yum -a 'name=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present' 相当于在远程机器上:yum install -y https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm #安装本地的rpm包(包一定先传到远程机器上) [root@m01 ~]# ansible web_group -m yum -a 'name=/tmp/nginx-1.16.1-1.el7.ngx.x86_64.rpm' 相当于在远程机器上:yum localinstall -y /tmp/nginx-1.16.1-1.el7.ngx.x86_64.rpm
2.yum_repository模块(yum仓库模块)
yum_repository模块语法:
[root@m01 ~]# ansible-doc yum_repository yum_repository: name: epel description: EPEL YUM repo baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ file: external_repos gpgcheck: no mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge enabled: no state: absent
实例:
[root@m01 ~]# ansible web_group -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/\$basearch/ gpgcheck=no enabled=yes"
被控制端查看:
[root@web01 yum.repos.d]# vim nginx.repo [nginx] baseurl = http://nginx.org/packages/centos/7/$basearch/ enabled = 1 gpgcheck = 0 name = nginx repo
详解:
name #yum源里面[]的内容 description #yum院里面的name baseurl #指定yum仓库 gpgcheck #是否校验 yes no enabled #是否启用仓库 yes no state present #添加仓库 absent #删除仓库 file #指定yum仓库名字
四、Ansible文件管理模块
1.copy模块(推送、复制、写入文件模块)
copy模块语法:
[root@m01 ~]# ansible-doc copy copy: src: /srv/myfiles/foo.conf dest: /etc/foo.conf owner: foo group: foo mode: '0644' backup: yes content: '# This file was moved to /etc/other.conf' follow: yes
实例:
#推送仓库文件 [root@m01 ~]# ansible web_group -m copy -a 'src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/' #推送一个站点文件,并授权 [root@m01 ~]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=644' #推送一个站点文件,把远程服务器的原文件备份(推送的文件必须修改内容) [root@m01 ~]# ansible web_group -m copy -a 'src=/root/index.html dest=/var/www/html owner=root group=root mode=644 backup=yes' #将指定内容写入指定文件 [root@m01 ~]# ansible web_group -m copy -a "content='123456' dest=/etc/rsync_password"
详解:
src #源文件 dest #目标文件 owner #文件属主 group #文件属组 mode #文件的权限 backup #文件是否备份 yes no follow #是否识别软连接
2.file模块(创建目录、文件模块)
file模块语法:
[root@m01 ~]# ansible-doc file file: path: /etc/foo.conf owner: foo group: foo mode: '0644' state: directory,touch,link recurse: yes
实例:
#创建目录 [root@m01 ~]# ansible web_group -m file -a 'path=/code state=directory' 相当于远程机器上:mkdir /code #创建目录并授权 [root@m01 ~]# ansible web01 -m file -a 'path=/file state=directory owner=root group=root mode=777' 相当于远程机器上:mkdir /file 并且 chmod 777 并且 chonw -R root.root #递归创建目录,并递归授权 [root@m01 ~]# ansible web01 -m file -a 'path=/code/wordpress/wp-content/uploads state=directory owner=root group=root mode=777' #递归授权目录 [root@m01 ~]# ansible web01 -m file -a 'path=/file state=directory owner=adm group=adm mode=755 recurse=yes' #创建文件,并授权(创建文件的时候,必须有文件的上级目录) [root@m01 ~]# ansible web01 -m file -a 'path=/file/1.txt state=touch owner=adm group=adm mode=755' #做软连接 [root@m01 ~]# ansible web01 -m file -a 'src=/data/file dest=/data/file.ori state=link' 相当于远程机器上:ln -s /data/file /data/file.ori #注意: 1.当创建目录不存在时,递归创建会递归授权 2.当目录存在时,递归授权只授权指定目录下的内容
详解:
path: #创建的文件或者目录 owner: #文件或目录的属主 group: #文件或目录的属组 mode: #文件的权限 state: directory #创建目录 touch #创建文件 link #创建软连接 src #链接的源文件 dest #软连接名字 recurse: #是否递归授权 yes no
3.get_url模块(下载模块)
get_url模块语法:
- name: Download foo.conf get_url: url: http://example.com/path/file.conf dest: /etc/foo.conf mode: '0440' checksum: sha256: md5:
实例:
#下载文件 [root@m01 ~]# ansible 'web_group' -m get_url -a 'url=https://www.mumusir.com/download/1.txt dest=/tmp/ mode=777' #验证文件再下载 [root@m01 ~]# ansible 'web_group' -m get_url -a 'url=https://www.mumusir.com/download/1.txt dest=/tmp/ mode=777 checksum=md5:f447b20a7fcbf53a5d5be013ea0b15af'
五、Ansible服务管理模块
1.service/systemd模块
service/systemd模块语法:
- name: Start service httpd, if not started service: name: httpd #服务 state: #状态 started #启动 stopped #停止 restarted #重启 reloaded #重载 enable: #是否加入开机自启 yes no
实例:
#启动服务 [root@m01 ~]# ansible 'web_group' -m service -a 'name=httpd state=started' #重启服务 [root@m01 ~]# ansible 'web_group' -m service -a 'name=httpd state=restarted'
六、Ansible用户管理模块
1.group模块
group模块语法:
- name: Ensure group "somegroup" exists group: name: somegroup #组名字 state: #状态 present #创建用户组 absent #删除用户组 gid: 666 #指定gid
实例:
#创建用户组(如果用户已存在,会修改gid) [root@m01 ~]# ansible 'web_group' -m group -a 'name=wwwww gid=666 state=present' #删除用户组 [root@m01 ~]# ansible 'web_group' -m group -a 'name=www gid=666 state=absent'
2.user模块
user模块语法:
user: name: johnd #用户名 comment: John Doe #用户备注 uid: 1040 #指定uid group: admin #指定用户组 shell: /bin/bash #指定用户登录脚本 generate_ssh_key: #是否创建秘钥对 yes no ssh_key_bits: 2048 #秘钥长度 ssh_key_file: .ssh/id_rsa #秘钥文件位置 state: absent #删除用户 present #创建用户 remove: yes #删除用户jia目录 expires: #用户过期时间 create_home: false/no #不创建家目录
实例:
#创建用户,不需要登录,有家目录 [root@m01 ~]# ansible 'web_group' -m user -a 'name=www uid=666 group=www shell=/sbin/nologin state=present' #删除用户 [root@m01 ~]# ansible 'web_group' -m user -a 'name=www state=absent' #删除用户和家目录 [root@m01 ~]# ansible 'web_group' -m user -a 'name=www state=absent remove=yes'
注意:
1.当组的名字和用户名相同时,组也被删除
2.当组的下面有多个用户,即使组的名字和用户名相同也不会删除
七、Ansible定时任务模块
cron模块
cron模块语法:
- name: Ensure a job that runs at 2 and 5 exists. Creates an entry like "0 5,2 * * ls -alh > /dev/null" cron: name: "check dirs" # 脚本的备注 minute: "0" #分钟 hour: "5,2" #小时 day: #日 month: #月 weekday: #周 job: "ls -alh > /dev/null" #执行的内容 disable: yes #注释定时任务 no #解除注释
实例:
#添加定时任务 [root@m01 ~]# ansible 'web_group' -m cron -a 'name=test minute=* hour=* day=* month=* weekday=* job="/bin/bash /tmp/touch.sh"' [root@web01 /]# crontab -l #Ansible: test * * * * * /bin/bash /tmp/touch.sh #不配置时间参数,默认是* [root@m01 ~]# ansible 'web_group' -m cron -a 'name=test job="/bin/bash /tmp/touch.sh"' [root@web01 /]# crontab -l #Ansible: test * * * * * /bin/bash /tmp/touch.sh #删除定时任务(必须指定name参数) [root@m01 ~]# ansible 'web_group' -m cron -a 'name=test2 minute=3,15 hour=8-11 day=*/2 job="/bin/bash /tmp/touch.sh" state=absent' #注释定时任务 [root@m01 ~]# ansible 'web_group' -m cron -a 'name=test2 minute=3,15 hour=8-11 day=*/2 job="/bin/bash /tmp/touch.sh" disabled=yes'
八、Ansible磁盘挂载模块
mount模块
mount模块语法;
- name: Mount DVD read-only mount: path: /mnt/dvd #本地要挂在的目录 src: /dev/sr0 #远端挂在点目录 fstype: nfs #挂载类型 opts: ro,noauto #/etc/fstab参数 state: present #开机才挂载,将配置写到自动挂载 mounted #直接挂在,并且配置写到自动挂载(常用) unmounted #取消挂载,但是不清除/etc/fstab自动挂载配置 absent #取消挂载,并清除/etc/fstab自动挂载配置(常用)
实例:
#没直接挂载,需要重启服务器或者mount -a才会挂载 [root@m01 ~]# ansible 'web_group' -m mount -a 'src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=present' #直接挂在,并且配置写到自动挂载 [root@m01 ~]# ansible 'web_group' -m mount -a 'src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=mounted' #取消挂载 [root@m01 ~]# ansible 'web_group' -m mount -a 'src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=absent'
九、Ansible防火墙模块
1.selinux模块
selinux模块语法:
- name: Enable SELinux selinux: policy: targeted state: disabled
实例:
#关闭selinux [root@m01 ~]# ansible 'all' -m selinux -a 'state=disabled'
2.firewalld模块
firewalld模块语法:
- firewalld: service: https #指定服务 permanent: #是否永久生效 yes #永久生效 no #临时生效(默认) state: #状态 enabled #允许 disabled #禁止 port: #端口 8081/tcp #指定端口 161-162/udp #端口范围 rich_rule: #富规则 source: 192.0.2.0/24 #指定网段或IP zone: trusted #指定空间
实例:
#允许访问http服务,永久生效,需要重启防火墙 [root@m01 ~]# ansible 'web_group' -m firewalld -a 'service=http permanent=yes state=enabled' #允许访问80端口,临时生效 [root@m01 ~]# ansible 'web_group' -m firewalld -a 'port=80/tcp permanent=no state=enabled' #允许10.0.0.0/24网段访问22端口 [root@m01 ~]# ansible 'web_group' -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1 service name=http accept" state=enabled' #配置网段白名单,永久生效 [root@m01 ~]# ansible 'web_group' -m firewalld -a 'source=10.0.0.0/24 zone=trusted state=enabled permanent=yes'
十、Ansible解压缩模块
1.unarchive模块
unarchive模块语法:
- name: Extract foo.tgz into /var/lib/foo unarchive: src: foo.tgz #压缩包的路径及文件 dest: /var/lib/foo #压缩到远端服务器的位置 remote_src: yes #压缩包在被控端服务器 no #压缩包在控制端
实例:
#解压控制的包到被控端 [root@m01 ~]# ansible 'web_group' -m unarchive -a 'src=/root/php.tar.gz dest=/tmp/' #解压被控端包到被控端自己 [root@m01 ~]# ansible 'web_group' -m unarchive -a 'src=/root/php.tar.gz dest=/tmp/ remote_src=yes'
2.archive模块
archive模块语法:
- name: Compress directory /path/to/foo/ into /path/to/foo.tgz archive: path: /path/to/foo #要打包的内容 dest: /path/to/foo.tgz #包位置与名字
实例:
#打包被控端的文件 [root@m01 ~]# ansible 'web_group' -m archive -a 'path=/data dest=/tmp/data.tar.gz'
十一、Ansible主机信息模块
1.获取web01主机所有的信息
[root@m01 ~]# ansible web01 -m setup
2.获取Ip
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4' web01 | SUCCESS => { "ansible_facts": { "ansible_default_ipv4": { "address": "10.0.0.7", "alias": "eth0", "broadcast": "10.0.0.255", "gateway": "10.0.0.2", "interface": "eth0", "macaddress": "00:0c:29:c6:7b:51", "mtu": 1500, "netmask": "255.255.255.0", "network": "10.0.0.0", "type": "ether" }, "discovered_interpreter_python": "/usr/bin/python" }, "changed": false }
3.获取主机名
[root@m01 ~]# ansible web01 -m setup -a 'filter=ansible_fqdn' web01 | SUCCESS => { "ansible_facts": { "ansible_fqdn": "www.baidu.com", "discovered_interpreter_python": "/usr/bin/python" }, "changed": false }
常用的值
ansible_all_ipv4_addresses:仅显示ipv4的信息。 ansible_devices:仅显示磁盘设备信息。 ansible_distribution:显示是什么系统,例:centos,suse等。 ansible_distribution_major_version:显示是系统主版本。 ansible_distribution_version:仅显示系统版本。 ansible_machine:显示系统类型,例:32位,还是64位。 ansible_eth0:仅显示eth0的信息。 ansible_hostname:仅显示主机名。 ansible_fqdn:仅显示主机名。 ansible_kernel:仅显示内核版本。 ansible_lvm:显示lvm相关信息。 ansible_memtotal_mb:显示系统总内存。 ansible_memfree_mb:显示可用系统内存。 ansible_memory_mb:详细显示内存情况。 ansible_swaptotal_mb:显示总的swap内存。 ansible_swapfree_mb:显示swap内存的可用内存。 ansible_mounts:显示系统磁盘挂载情况。 ansible_processor:显示cpu个数(具体显示每个cpu的型号)。 ansible_processor_vcpus:显示cpu个数(只显示总的个数)。