ansible——模块
命令:ansible <hostname-pattern> [-m module_name] [-a args] 主机模式 模块 参数 ansible系列命令 ansible、ansible-doc、ansible-playbook、ansible-vault、ansible-console、ansible-galaxy、ansible-pull
1、1 基于账户密码验证
远程ping主机
[root@k8s-node2 ~]# ansible 10.0.0.41 -m ping -k SSH password: 10.0.0.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
远程ping多台主机
[root@k8s-node2 ~]# vim /etc/ansible/ansible.cfg [master] # 分组 10.0.0.41 10.0.0.47 10.0.0.48 [root@k8s-node2 .ssh]# ansible all -m ping -k # all=10.0.0.41,10.0.0.47,10.0.0.48 SSH password: 10.0.0.47 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.48 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
显示模块内容
[root@k8s-node2 .ssh]# ansible-doc -l fortios_router_community_list Configure community lists in Fortinet's FortiOS... azure_rm_devtestlab_info Get Azure DevTest Lab facts ecs_taskdefinition register a task definition in ecs avi_alertscriptconfig Module for setup of AlertScriptConfig Avi RESTf... tower_receive Receive assets from Ansible Tower netapp_e_iscsi_target NetApp E-Series manage iSCSI target configurati... azure_rm_acs Manage an Azure Container Service(ACS) instance fortios_log_syslogd2_filter Filters for remote system server in Fortinet's ... junos_rpc Runs an arbitrary RPC over NetConf on an Junipe... na_elementsw_vlan [root@k8s-node2 ~]# ansible-doc -l | wc -l # 显示模块并统计 3387
列出/etc/ansible/ansible.cfg文件中所有的host主机ip
[root@k8s-node2 ~]# ansible master --list [root@k8s-node2 ~]# ansible all --list-hosts hosts (3): 10.0.0.41 10.0.0.47 10.0.0.48
远程列出另一台主机root目录
[root@k8s-node2 ~]# ansible 10.0.0.41 -u root -k -m command -a "ls /root" SSH password: 10.0.0.41 | CHANGED | rc=0 >> domain.sh kube-bench kube-manifests kuboard-data member.back nfs_root snap.20231206.db test1.sh test.sh #远程访问另一台主机通过普通用户列出/root # 创建一个用户 useradd han passwd han # 把用户加入wheel组中 [root@k8s-node1 ~]# usermod -aG wheel han [root@k8s-node1 ~]# groups han han : han wheel [root@k8s-node2 ~]# ansible 10.0.0.41 -m command -a "ls /root" -u han -k -b -K # 模块 参数 普通用户 密码 授权 密码 SSH password: BECOME password[defaults to SSH password]: # 在使用visudo打开sudo文件修改无密码授权 [root@k8s-node2 ~]# ansible master -m command -a "ls /root" -u han -k -b #不需要授权普通用户密码登录 SSH password: 补充:给visudo文件上颜色 [root@k8s-node2 ~]# echo export EDITOR=vim >> /etc/profile.d/env.sh [root@k8s-node2 ~]# cat /etc/profile.d/env.sh export EDITOR=vim [root@k8s-node2 ~]# source /etc/profile.d/env.sh [root@k8s-node2 ~]# visudo
1、2 基于密钥验证
[root@k8s-node2 ~]# ssh-kengen [root@k8s-node2 ~]# ssh-copy-id 10.0.0.41 [root@k8s-node2 ~]# ssh-copy-id 10.0.0.47 [root@k8s-node2 ~]# ssh-copy-id 10.0.0.48 [root@k8s-node2 ~]# ansible all -m ping # 测试 10.0.0.47 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.48 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
1、3 ansible的主机模式
匹配主机的列表 all:表示主机清单中的所有主机 *:通配符 ansible 10.0.0.* -m ping ansible "mast* " -m ping ansible " * " -m ping 或关系 ansible master:master1 -m ping 逻辑与 ansible "master:&master1" -m ping 10.0.0.47 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 逻辑非关系 ansible 'master:!master1' -m ping 10.0.0.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 正则表达式 [root@k8s-node2 ~]# ansible '~(ma|no)st' -m ping 10.0.0.47 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 10.0.0.48 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
1、4 Ansible的命令执行过程:
-
加载Ansible的配置文件,默认是/etc/ansible/ansible.cfg。
-
加载Ansible对应的模块文件,即command等。
-
通过Ansible将模块或命令生成相应的py文件,然后将该文件传输至被控机器上的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.py文件。
-
在被控机器上给该py文件加上可执行权限。
-
执行该文件并返回结果。
-
删除该py文件,sleep 0退出。
执行状态:
-
绿色:执行成功并且不需要做改变的操作。
-
黄色:执行成功并且对目标主机做变更。
-
红色:执行失败。
1、5 Ansible的常用模块包括:
-
command模块:
用于在远程主机上执行任意命令;默认模块,可以忽略-m选项。
[root@k8s-node2 ~]# ansible all -a "ls /root" # 以han用户执行ping的存活检测 ansible all -m ping -u han -k
以han用户sudo到root用户执行ping的存活检测
ansible all -m ping -u han -b -k
以han用户sudo到mage用户执行ping的存活检测
ansible all -m ping -u han -b -k --become-user mage
以han用户sudo到root用户执行ls
ansible all -m command -u han --become-user mage -a 'ls /root' -b -k -K
同时给多台主机创建目录 ```bash ansible all -a 'mkdir /data' # 同时给多台主机创建目录 [WARNING]: Consider using the file module with state=directory rather than running 'mkdir'. If you need to use command because file 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. # 不是专用的创建目录的模块,但是也可以使用 10.0.0.47 | CHANGED | rc=0 >> 10.0.0.41 | FAILED | rc=1 >> mkdir: cannot create directory ‘/data’: File existsnon-zero return code 10.0.0.48 | CHANGED | rc=0 >> [root@k8s-node2 ~]# ansible all -a 'ls -dl /data' # 列出创建的目录 10.0.0.41 | CHANGED | rc=0 >> drwxr-xr-x. 2 root root 4096 Dec 11 15:01 /data 10.0.0.48 | CHANGED | rc=0 >> drwxr-xr-x. 2 root root 4096 Dec 18 11:15 /data 10.0.0.47 | CHANGED | rc=0 >> drwxr-xr-x 2 root root 4096 Dec 18 11:15 /data
# 查看多台主机的文件内容 ansible all -a 'cat /etc/passwd' # 如果某台主机中不存在该文件内容则不执行,存在的话才执行 ansible all -a 'removes=/etc/passwd cat /etc/passwd' # create命令的效果相反
切换到/bin执行命令
ansible all -a 'chdir=/bin ls -al' # 切换到/bin目录下执行查看命令 ansible 10.0.0.23 -a 'chdir=root ./doain.sh' # 切换到/root目录下执行某个脚本文件
给多台主机创建账号
[root@k8s-node2 ~]# ansible all -a 'useradd test1' 10.0.0.47 | CHANGED | rc=0 >> 10.0.0.41 | CHANGED | rc=0 >> 10.0.0.48 | CHANGED | rc=0 >> [root@k8s-node2 ~]# ansible all -a 'getent passwd test1' 10.0.0.47 | CHANGED | rc=0 >> test1:x:1000:1000::/home/test1:/bin/bash 10.0.0.41 | CHANGED | rc=0 >> test1:x:1001:1001::/home/test1:/bin/bash 10.0.0.48 | CHANGED | rc=0 >> test1:x:1000:1000::/home/test1:/bin/bash
2、shell模块:
用于在远程主机上执行shell命令。
[root@k8s-node2 ~]# ansible all -a "echo $HOSTNAME" # ansible中不能执行变量($)、| 10.0.0.47 | CHANGED | rc=0 >> k8s-node2 10.0.0.41 | CHANGED | rc=0 >> k8s-node2 10.0.0.48 | CHANGED | rc=0 >> k8s-node2 [root@k8s-node2 ~]# ansible all -m shell -a 'echo $HOSTNAME' # ansible中使用shell模块才能执行成功 10.0.0.47 | CHANGED | rc=0 >> k8s-node3 10.0.0.41 | CHANGED | rc=0 >> k8s-node1 10.0.0.48 | CHANGED | rc=0 >> k8s-node2 通过比较发现,shell模块功能比command模块功能强,推荐用shell模块 [root@k8s-node2 ~]ansible all -m shell -a 'rm -rf /data/*' # 删除data目录下的所有文件
3、script模块:
用于在远程主机上执行脚本文件。
[root@k8s-node2 ~]# mkdir ansible [root@k8s-node2 ~]# ll drwxr-xr-x. 2 root root 4096 Dec 18 12:28 ansible [root@k8s-node2 ~]# cd ansible/ [root@k8s-node2 ansible]# vim host.sh [root@k8s-node2 ansible]# chmod +x host.sh [root@k8s-node2 ansible]# ansible all -m script -a '/root/ansible/host.sh'
4、copy模块:
用于将文件从一个服务器复制到另一个其他服务器(客户端)上。
以下是copy模块的一些常用选项:
-
source:指定要复制的文件的源路径。
-
dest:指定目标路径,即要将文件复制到的位置。
-
content:如果要将字符串内容复制到目标位置,而不是从文件中复制,则可以使用此选项。
-
mode:指定目标文件的权限模式。
-
owner:指定目标文件的拥有者。
-
group:指定目标文件的所属组。
同时给多台主机复制文件并且备份
[root@k8s-node2 ansible]# ansible all -m copy -a 'src=/root/ansible/host.sh dest=/root backup=yes' # 查看复制之后的文件 [root@k8s-node2 ansible]# ansible all -a 'ls /root' # 删除给多台主机复制的文件 [root@k8s-node2 ansible]# ansible all -a 'rm -rf /root/host.sh' # 将自己生成的内容复制到多台主机上 [root@k8s-node2 ~]# ansible all -m copy -a ' "content=hello world" dest=/data '
5、Fetch模块:
从客户端获取文件到服务器上,与copy相反(比如,抓取其他服务器上日志信息);只能复制单个文件。
# 查看帮助文档 [root@k8s-node2 ~]# ansible-doc -s fetch # 抓取其他服务器上的某个文件 [root@k8s-node2 data]# ansible all -m fetch -a 'src=/var/log/yum.log dest=/data' [root@k8s-node2 data]# ls 10.0.0.41 10.0.0.47 10.0.0.48 # 同时抓取多个log日志文件 [root@k8s-node2 data]# ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log' # 将其他服务器(客户端)多个日志文件打包成一个压缩包——没有指定文件路径默认在/root下 [WARNING]: Consider using the unarchive module rather than running 'tar'. If you need to use command because 打包模块 unarchive 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. 10.0.0.47 | CHANGED | rc=0 >> tar: Removing leading `/' from member names 10.0.0.48 | CHANGED | rc=0 >> tar: Removing leading `/' from member names 10.0.0.41 | CHANGED | rc=0 >> tar: Removing leading `/' from member names
6、File模块:设置文件属性
# 同时给多台主机创建一个文件 [root@k8s-node2 ~]# ansible all -m file -a 'name=/data/f1 state=touch' # 查看一下 [root@k8s-node2 ~]# ansible all -a 'ls /data' 10.0.0.47 | CHANGED | rc=0 >> f1 10.0.0.41 | CHANGED | rc=0 >> f1 10.0.0.48 | CHANGED | rc=0 >> 10.0.0.41 10.0.0.47 10.0.0.48 f1 # 同时删除某个文件 [root@k8s-node2 ~]# ansible all -m file -a 'name=/data/f1 state=absent' # 创建文件夹 [root@k8s-node2 ~]# ansible all -m file -a 'name=/data/name state=directory' # 删除文件夹 [root@k8s-node2 ~]# ansible all -m file -a 'name=/data/name state=absent' # 创建软链接 [root@k8s-node2 ~]# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link' # 删除软链接 [root@k8s-node2 ~]# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=absent' 注意shell模块也能实现删除目录
7、Hostname:管理主机名
[root@k8s-node2 ~]# ansible 10.0.0.41 -m hostname -a 'name=k8s-node1'
8、Cron:计划任务
[root@k8s-node2 ~]# which wall /usr/bin/wall # 同时给多台主机设置一个定时任务 [root@k8s-node2 ~]# ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron' # 取消定时任务 [root@k8s-node2 ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron' # 不能省略 禁用(yes) # no/false 启用 # 删除定时任务 [root@k8s-node2 ~]# ansible all -m cron -a 'state=absent job="/usr/bin/wall FBI warning" name=warningcron'
9、Yum:管理包
# 查看帮助文档 [root@k8s-node2 ~]# ansible-doc -s yum # 给多台主机同时安装软件包 [root@k8s-node2 ~]# ansible all -m yum -a 'name=vfstpd' # 多台主机同时列出yum安装目录 [root@k8s-node2 ~]# ansible all -m yum -a 'list=installed' # 多台主机同时删除软件包 [root@k8s-node2 ~]# ansible all -m yum -a 'name=vsftpd state=removed' # 检查是否卸载 [root@k8s-node2 ~]# ansible all -m shell -a 'rpm -q vsftpd' # 直接安装网络上下载的安装包 判断目标主机是否有安装包——若没有 第一步: 给目标主机复制安装包 [root@k8s-node2 /]# ansible 10.0.0.41 -m copy -a 'src=/data/包名 dest=/root' 第二步:安装 [root@k8s-node2 ~]# ansible 10.0.0.41 -m yum -a 'name=/root/包名 disable_gpg_check=yes' # 禁用 GPG 密钥检查可能会降低软件包的安全性
9、Service:管理服务
# 给目标主机开启服务以及开机自启动 [root@k8s-node2 ~]# ansible 10.0.0.41 -m service -a 'name=vsftpd state=started enabled=yes' [root@k8s-node1 ~]# systemctl status vsftpd ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2023-12-20 11:28:31 CST; 1min 50s ago Process: 5392 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS) Main PID: 5393 (vsftpd) Tasks: 1 Memory: 576.0K CGroup: /system.slice/vsftpd.service └─5393 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf [root@k8s-node1 ~]# systemctl is-enabled vsftpd # 已经开启了开机自启动 enabled [root@k8s-node2 ~]# ansible 10.0.0.41 -m service -a 'name=vsftpd state=stopped enabled=no' # 停止服务
10、User:管理用户
# 创建账户 [root@k8s-node2 ~]# ansible 10.0.0.41 -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=nginx service' 家目录 附加组 用户id 描述 # 删除账户 [root@k8s-node2 ~]# ansible 10.0.0.41 -m user -a 'name=nginx state=absent remove=yes' 删除家目录 # 创建组 [root@k8s-node2 ~]# ansible 10.0.0.41 -m group -a 'name=nginx system=yes gid=80' # 查看 [root@k8s-node2 ~]# ansible 10.0.0.41 -a 'getent group gid=80' # 删除组 [root@k8s-node2 ~]# ansible 10.0.0.41 -m group -a 'name=nginx state=absent'
11、ansible-galaxy
连接Ansible Galaxy下载相应的roles。
列出已安装的galaxy
[root@k8s-node2 ~]# ansible-galaxy list
安装galaxy
[root@k8s-node2 ~]# ansible-galaxy install geerlingguy.redis - downloading role 'redis', owned by geerlingguy - downloading role from https://github.com/geerlingguy/ansible-role-redis/archive/1.8.0.tar.gz - extracting geerlingguy.redis to /root/.ansible/roles/geerlingguy.redis - geerlingguy.redis (1.8.0) was installed successfully [root@k8s-node2 ~]# ansible-galaxy list geerlingguy.redis # /root/.ansible/roles - geerlingguy.redis, 1.8.0
删除galaxy
[root@k8s-node2 ~]# ansible-galaxy remove geerlingguy.redis - successfully removed geerlingguy.redis
12、ansible pull
推送命令到远程,效率无限提升