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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
157 3
|
21天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
46 4
|
23天前
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
26 1
|
29天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
53 2
|
29天前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
138 0
|
2月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
70 4
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
59 4
|
18天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
28天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
51 4
|
2月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。