Ansible自动化运维工具之常用模块使用实战(5)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Ansible自动化运维工具之常用模块使用实战(5)

环境介绍:


管理主机 k8s_master1 192.168.1.18


被托管主机 k8s_node1 192.168.1.19


被托管主机 K8S_node2 192.168.1.20


操作系统 Centos 7.5


常用模块:


ansible-docping模块


command模块


shell模块


script模块


copy模块


lineinfile|replace模块


yum模块


service模块


setup模块


模块使用实战:


1.ansible-docping模块

12.png

- ansible-doc


[root@k8s_master1 ~]# ansible-doc -l     //列出所有模块
fortios_router_community_list                                 Configure community lists in Fortinet's FortiOS and...
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 RESTful O...
tower_receive                                                 Receive assets from Ansible Tower
netapp_e_iscsi_target                                         NetApp E-Series manage iSCSI target configuration
azure_rm_acs                                                  Manage an Azure Container Service(ACS) instance
......
[root@k8s_master1 ~]# ansible-doc -l | grep mysql   //查找mysql相关的模块
azure_rm_mysqlfirewallrule_info                               
Get Azure MySQL Firewall Rule facts
azure_rm_mysqlconfiguration_info                              
Get Azure MySQL Configuration facts
mysql_info                                                    
Gather information about MySQL servers                                                                                          
...
[root@k8s_master1 ~]# ansible-doc mysql_db     //查看mysql_db模块的使用手册
> MYSQL_DB    (/usr/lib/python2.7/site-packages/ansible/modules/database/mysql/mysql_db.py)
        Add or remove MySQL databases from a remote host.
  * This module is maintained by The Ansible Community
OPTIONS (= is mandatory):
- ca_cert
        The path to a Certificate Authority (CA) certificate. This option, if used, must
        specify the same certificate as used by the server.
        (Aliases: ssl_ca)[Default: (null)]
        type: path
        version_added: 2.0
- client_cert
        The path to a client public key certificate.
        (Aliases: ssl_cert)[Default: (null)]
        type: path
        version_added: 2.0
...

- ping

[root@k8s_master1 ~]# cat /etc/ansible/hosts
...
[k8s_node]
k8s_node1
k8s_node2
[root@k8s_master1 ~]# ansible k8s_node -m ping   
k8s_node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
k8s_node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[root@k8s_master1 ~]# ansible k8s_node -m ping -k
SSH password:    --》 -k 表示交互式输入被托管主机连接密码
k8s_node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
k8s_node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

2.command模块

13.png


- command


完整格式:


  ansible 主机集合 -m 模块名称 -a 模块参数

[root@k8s_master1 ~]# ansible k8s_node -m command -a 'uptime'  //ansible远程查看k8s_node主机组中的主机系统负载信息
k8s_node2 | CHANGED | rc=0 >>
 17:51:47 up 1 day,  7:37,  2 users,  load average: 0.00, 0.01, 0.05
k8s_node1 | CHANGED | rc=0 >>
 09:38:28 up 1 day, 16:03,  2 users,  load average: 0.00, 0.01, 0.05
[root@k8s_master1 ~]# ansible k8s_node -m command -a 'date'  //ansible远程查看k8s_node主机组中的主机系统时间
k8s_node2 | CHANGED | rc=0 >>
2021年 08月 11日 星期三 17:51:52 CST
k8s_node1 | CHANGED | rc=0 >>
2021年 08月 11日 星期三 09:38:33 CST
[root@k8s_master1 ~]# ansible k8s_node -m command -a 'cat /etc/passwd'   //ansible远程查看k8s_node主机组中的主机中/etc/passwd文件
k8s_node2 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
k8s_node1 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......

14.png

示例:


[root@k8s_master1 ~]# ansible k8s_node -m command -a 'ps -aux | grep sshd'   //ansible在使用command模块远程控制主机组时无法识别上图字符
k8s_node2 | FAILED | rc=1 >>
error: user name does not exist
Usage:
 ps [options]
 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.
For more details see ps(1).non-zero return code
k8s_node1 | FAILED | rc=1 >>
error: user name does not exist
Usage:
 ps [options]
 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.
For more details see ps(1).non-zero return code

3.shell模块

15.png

- shell


  shell模块基本上可以执行所有类型(除了交互式)的命令。

[root@k8s_master1 ~]# ansible k8s_node -m shell -a 'ps -aux | grep sshd'   //ansible使用shell模块远程查看k8s_node主机组中的sshd服务信息
k8s_node1 | CHANGED | rc=0 >>
root       1164  0.0  0.3 162012  6888 ?        Ss   8月09   0:00 sshd: root@pts/0
root       1166  0.0  0.3 161664  6396 ?        Ss   8月09   0:00 sshd: root@notty
root       2174  0.0  0.2 112892  4344 ?        Ss   8月10   0:00 /usr/sbin/sshd -D
root       5417  0.0  0.2 154968  5868 ?        Ss   09:49   0:00 sshd: root@pts/1
root       5539  0.0  0.0 113172  1208 pts/1    S+   09:50   0:00 /bin/sh -c ps -aux | grep sshd
root       5541  0.0  0.0 112724   952 pts/1    S+   09:50   0:00 grep sshd
k8s_node2 | CHANGED | rc=0 >>
root        892  0.0  0.2 112892  4344 ?        Ss   8月10   0:00 /usr/sbin/sshd -D
root       1185  0.0  0.3 159848  6784 ?        Ss   8月10   0:00 sshd: root@pts/0
root       1187  0.0  0.3 159532  6332 ?        Ss   8月10   0:00 sshd: root@notty
root       5933  0.0  0.2 154964  5872 ?        Ss   18:03   0:00 sshd: root@pts/1
root       6056  0.0  0.0 113172  1212 pts/1    S+   18:03   0:00 /bin/sh -c ps -aux | grep sshd
root       6058  0.0  0.0 112724   956 pts/1    S+   18:03   0:00 grep sshd
[root@k8s_master1 ~]# ansible k8s_node -m shell -a 'uptime'
k8s_node2 | CHANGED | rc=0 >>
 18:04:07 up 1 day,  7:50,  2 users,  load average: 0.00, 0.01, 0.05
k8s_node1 | CHANGED | rc=0 >>
 09:50:48 up 1 day, 16:16,  2 users,  load average: 0.00, 0.01, 0.05
[root@k8s_master1 ~]# ansible k8s_node -m shell -a 'echo ${HOSTNAME}'   //ansible使用shell模块远程查看k8s_node主机组中的HOSTNAME内置变量值
k8s_node2 | CHANGED | rc=0 >>
k8s_node2
k8s_node1 | CHANGED | rc=0 >>
k8s_node1

16.png

以上testfile文件案例验证:


[root@k8s_master1 ~]# ansible k8s_node -m shell -a "cd /tmp"  //ansible使用shell模块远程进入k8s_node主机组中的tmp目录
k8s_node2 | CHANGED | rc=0 >>
k8s_node1 | CHANGED | rc=0 >>
[root@k8s_master1 ~]# ansible k8s_node -m shell -a "touch testfile"  //ansible使用shell模块远程为k8s_node主机组创建testfile文件
[WARNING]: Consider using the file module with state=touch rather than running 'touch'.  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.
k8s_node2 | CHANGED | rc=0 >>
k8s_node1 | CHANGED | rc=0 >>
--两台被托管主机查看创建的testfile文件---
[root@k8s_node1 ~]# pwd
/root
[root@k8s_node1 ~]# ll testfile
-rw-r--r-- 1 root root 0 8月  11 09:58 testfile
[root@k8s_node2 ~]# pwd
/root
[root@k8s_node2 ~]# ll testfile
-rw-r--r-- 1 root root 0 8月  11 18:11 testfile

 可以看到在创建testfile文件时,并没有创建在tmp目录下,而是被默认创建到了root目录下,说明ansible 是使用 ssh 多次连接执行,连接退出以后之前的状态就全部失效了。


- - 解决办法 - -:


  使用 chdir 代替 cd 命令

[root@k8s_master1 ~]# ansible k8s_node -m shell -a "chdir=/tmp touch testfile"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'.  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.
k8s_node2 | CHANGED | rc=0 >>
k8s_node1 | CHANGED | rc=0 >>
[root@k8s_node1 ~]# ll /tmp/testfile    //成功将testfile文件创建到tmp文件夹中
-rw-r--r-- 1 root root 0 8月  11 10:09 /tmp/testfile
[root@k8s_node2 ~]# ll /tmp/testfile
-rw-r--r-- 1 root root 0 8月  11 18:22 /tmp/testfile

例子:为k8s_node主机组中的主机创建一个test用户并且设置密码为123。

[root@k8s_master1 ~]# ansible k8s_node -m shell -a 'useradd test'
k8s_node2 | CHANGED | rc=0 >>
k8s_node1 | CHANGED | rc=0 >>
[root@k8s_master1 ~]# ansible k8s_node -m shell -a 'echo 123 | passwd --stdin test'
k8s_node2 | CHANGED | rc=0 >>
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
k8s_node1 | CHANGED | rc=0 >>
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。

4.script模块

17.png

- script


案例:在两台被托管主机上判断有无用户tom,如果没有则创建用户tom并配置密码为123。

[root@k8s_master1 ~]# cat >> user.sh << EOF
> #!/bin/bash
> id tom
> if [  $? != 0 ];then
> useradd tom
> echo 123 | passwd --stdin tom
> fi
> EOF
[root@k8s_master1 ~]# cat user.sh
#!/bin/bash
id tom
if [ $? != 0 ];then
useradd tom
echo 123 | passwd --stdin tom
fi
[root@k8s_master1 ~]# ansible k8s_node -m script -a '/root/user.sh'
k8s_node2 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to k8s_node2 closed.\r\n",
    "stderr_lines": [
        "Shared connection to k8s_node2 closed."
    ],
    "stdout": "id: tom: no such user\r\n更改用户 tom 的密码 。\r\npasswd:所有的身份验证令牌已经成功更新。\r\n",
    "stdout_lines": [
        "id: tom: no such user",
        "更改用户 tom 的密码 。",
        "passwd:所有的身份验证令牌已经成功更新。"
    ]
}
k8s_node1 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to k8s_node1 closed.\r\n",
    "stderr_lines": [
        "Shared connection to k8s_node1 closed."
    ],
    "stdout": "id: tom: no such user\r\n更改用户 tom 的密码 。\r\npasswd:所有的身份验证令牌已经成功更新。\r\n",
    "stdout_lines": [
        "id: tom: no such user",
        "更改用户 tom 的密码 。",
        "passwd:所有的身份验证令牌已经成功更新。"
    ]
}
---两台被托管主机查看ansible执行情况---
[root@k8s_node1 ~]# id tom
uid=1001(tom) gid=1001(tom) 组=1001(tom)
[root@k8s_node1 ~]# cat /etc/passwd | grep tom
tom:x:1001:1001::/home/tom:/bin/bash
[root@k8s_node2 ~]# id tom
uid=1001(tom) gid=1001(tom) 组=1001(tom)
[root@k8s_node2 ~]# cat /etc/passwd | grep tom
tom:x:1001:1001::/home/tom:/bin/bash

5.copy模块

18.png

19.png

- copy


[root@k8s_master1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.18 k8s_master1
192.168.1.19 k8s_node1
192.168.1.20 k8s_node2
[root@k8s_master1 ~]# ansible k8s_node -m copy -a 'src=/etc/hosts dest=/etc/hosts'
k8s_node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "checksum": "561ed24474a2938a845088d89f280b8e3e864103",
    "dest": "/etc/hosts",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "path": "/etc/hosts",
    "size": 229,
    "state": "file",
    "uid": 0
}
k8s_node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "checksum": "561ed24474a2938a845088d89f280b8e3e864103",
    "dest": "/etc/hosts",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "path": "/etc/hosts",
    "size": 229,
    "state": "file",
    "uid": 0
}
[root@k8s_node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.18 k8s_master1
192.168.1.19 k8s_node1
192.168.1.20 k8s_node2
[root@k8s_node2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.18 k8s_master1
192.168.1.19 k8s_node1
192.168.1.20 k8s_node2
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
Web App开发 前端开发 JavaScript
Playwright极速UI自动化实战指南
Playwright告别Selenium痛点,以智能等待、强大选择器、网络拦截与多设备模拟四大利器,提升自动化效率与稳定性。本文通过实战代码详解其加速秘籍,助你构建高效、可靠的UI测试方案。
|
3月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
4月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
428 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
3月前
|
弹性计算 人工智能 前端开发
在阿里云ECS上部署n8n自动化工作流:U2实例实战
本文介绍如何在阿里云ECS的u2i/u2a实例上部署开源工作流自动化平台n8n,利用Docker快速搭建并配置定时任务,实现如每日抓取MuleRun新AI Agent并推送通知等自动化流程。内容涵盖环境准备、安全组设置、实战案例与优化建议,助力高效构建低维护成本的自动化系统。
755 5
|
3月前
|
人工智能 搜索推荐 UED
一个牛逼的国产AI自动化工具,开源了 !
AiPy是国产开源AI工具,结合大语言模型与Python,支持本地部署。用户只需用自然语言描述需求,即可自动生成并执行代码,轻松实现数据分析、清洗、可视化等任务,零基础也能玩转编程,被誉为程序员的智能助手。
|
3月前
|
人工智能 运维 监控
运维安全还能靠“人盯人”?别闹了,聊聊自动化处理的真功夫
运维安全还能靠“人盯人”?别闹了,聊聊自动化处理的真功夫
175 17
|
4月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
211 6
|
4月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
143 4
|
3月前
|
人工智能 缓存 自然语言处理
86_自动化提示:AutoPrompt工具
在当今人工智能领域,提示工程(Prompt Engineering)已成为释放大语言模型(LLM)潜能的关键技术。随着LLM规模和能力的不断增长,如何设计高效、精确的提示词成为研究和应用的焦点。然而,传统的手工提示工程面临着巨大挑战

热门文章

最新文章