ansible——模块

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的命令执行过程:
  1. 加载Ansible的配置文件,默认是/etc/ansible/ansible.cfg。

  2. 加载Ansible对应的模块文件,即command等。

  3. 通过Ansible将模块或命令生成相应的py文件,然后将该文件传输至被控机器上的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.py文件。

  4. 在被控机器上给该py文件加上可执行权限。

  5. 执行该文件并返回结果。

  6. 删除该py文件,sleep 0退出。

执行状态:

  • 绿色:执行成功并且不需要做改变的操作。

  • 黄色:执行成功并且对目标主机做变更。

  • 红色:执行失败。

1、5 Ansible的常用模块包括:
  1. 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相反(比如,抓取其他服务器上日志信息);只能复制单个文件。

  1. # 查看帮助文档
    [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

推送命令到远程,效率无限提升

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值