ansible-自动化运维

ansible:

远程自动化运维

ansible是基于python开发的配置管理和应用部署工具。

也是自动化运维的重要工具。

可以批量配置、部署、管理上千台主机。

只需要在一台主机配置ansible就可以完成对其他主机的操作

操作模式

1、模块化操作,命令行操作

2、playbook,脚本,也是把命令行的脚本化。脚本的格式是yaml格式

ansible的特性:

幂等性:多次操作或者是多次执行,对系统的影响不会发生变化,无论执行多少次结果都是一样的。

ansible什么都不会做

ansible四大组件

1、inventory 主机清单 主机组

必须要声明管理主机的地址或者其他的配置,不声明ansible无法对目标主机进行操作

2modules 模块 学习核心

ansible的功能是靠模块来实现的

3、插件

4、playbooks 剧本 ---- 脚本(服用)

模块和语法的学习

命令行

test41 192.168.65.41 安装ansible

docker1 192.168.65.51

docker2 192.168.65.52

安装ansible
复制代码
#关闭防火墙
[root@test41 ~]# systemctl stop firewalld
[root@test41 ~]# setenforce 0
​
#安装epel-release
[root@test41 ~]# yum -y install epel-release
#安装ansible
[root@test41 ~]# yum -y install ansible
[root@test41 ~]# cd /etc/ansible/
[root@test41 ansible]# ls
ansible.cfg  hosts  roles
#修改连接的配置文件
[root@test41 ansible]# vim hosts 
20行 [web]
23行 192.168.65.51
​
33行 [xy102]
37行 192.168.65.52
​
#设置免密登录
[root@test41 ansible]# ssh-keygen -t rsa
#传密码
[root@test41 ansible]# sshpass -p '123' ssh-copy-id root@192.168.65.51
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
[root@test41 ansible]# sshpass -p '123' ssh-copy-id root@192.168.65.52
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
#列出ansible所有已安装的模块
[root@test41 ansible]# ansible-doc -l 
#command模块,基础模块,也是ansible的默认模块,不支持管道符和重定向操作,执行一般的linux命令。
​
#如果报错就把密码再传一次就能执行
[root@test41 ansible]# ansible 192.168.65.52 -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >>          #可以用指定的ip地址
2024年 08月 21日 星期三 09:43:23 CST
[root@test41 ansible]# ansible 192.168.65.51 -m command -a "date"
192.168.65.51 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 09:43:35 CST
[root@test41 ansible]# ansible web -m command -a "date"
192.168.65.51 | CHANGED | rc=0 >>          #也可以用组名
2024年 08月 21日 星期三 10:00:47 CST
[root@test41 ansible]# ansible xy102 -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:01:01 CST
#所有声明的主机都会执行
[root@test41 ansible]# ansible all -m command -a "date"
192.168.65.52 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:02:19 CST
192.168.65.51 | CHANGED | rc=0 >>
2024年 08月 21日 星期三 10:02:19 CST
​

#怎么使用ansible

复制代码
ansible<组名/ip地址> -m 指定模块,不加就是默认使用command -a <参数或者命令>

常用的模块参数

1、command模块
复制代码
#chdir在目标主机提前进入目录,然后执行指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'chdir=/home ls'
192.168.65.51 | CHANGED | rc=0 >>
aaa
bbb
wbl
​
#creates判断文件是否存在,如果存在就不执行后面的指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'creates=/opt/123 ls/opt'
192.168.65.51 | SUCCESS | rc=0 >>
skipped, since /opt/123 exists
​
#removes 判断文件是否存在,如果存在就会执行指令
[root@test41 ansible]# ansible 192.168.65.51 -a 'removes=/opt/123 ls /opt'
192.168.65.51 | CHANGED | rc=0 >>
123
docker-compose.yml
harbor
harbor-offline-installer-v2.8.1.tgz
mysql
mysql1
nginx
nginx1
nhtml
php
php1
​
2、shell模块 支持管道符和重定向,也可以用逻辑表达式&&且 ; 逻辑或
复制代码
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'useradd test'
192.168.65.51 | CHANGED | rc=0 >>
​
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'echo 123456 | passwd --stdin test'
192.168.65.51 | CHANGED | rc=0 >>
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
​
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'cat /opt/123'
192.168.65.51 | CHANGED | rc=0 >>
123
​
#逻辑且
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'touch /opt/123.txt && echo 123 > /opt/123.txt && cat /opt/123.txt'
[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.
192.168.65.51 | CHANGED | rc=0 >>
123
​
#逻辑或       (前一个失败不影响后一个执行)
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'cat /etc/passwdd ; cat /opt/123.txt'
192.168.65.51 | CHANGED | rc=0 >>
123cat: /etc/passwdd: 没有那个文件或目录
​

在目标主机创建一个脚本,在脚本中写一个命令ifcong,然后运行脚本

复制代码
[root@test41 ansible]# ansible 192.168.65.51 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
192.168.65.51 | CHANGED | rc=0 >>
br-211011ad3135: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:41ff:fe8e:75ed  prefixlen 64  scopeid 0x20<link>
        ether 02:42:41:8e:75:ed  txqueuelen 0  (Ethernet)
        RX packets 12020  bytes 3861077 (3.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16415  bytes 1421992 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
3、cron模块,定时任务模块 minute/hour/day/month/weekday 分/时/日/月/周
复制代码
#创建定时任务,不指定名字就会报错
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'minute=30 hour=8 day=* job="ls /opt"'
[DEPRECATION WARNING]: The 'name' parameter will be required in future 
releases.. This feature will be removed in version 2.12. Deprecation warnings 
can be disabled by setting deprecation_warnings=False in ansible.cfg.
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None"
    ]
}
​
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
#Ansible: None
30 8 * * * ls /opt
#指定文件名
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'minute=30 hour=8 day=3  month=9 job="ls /opt" name="test1"'
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None", 
        "test1"
    ]
​
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
#Ansible: None
30 8 * * * ls /opt
#Ansible: test1
30 8 3 9 * ls /opt
​
#删除定时任务
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'name="test1" state=absent'
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None"
    ]
}
[root@test41 ansible]# ansible 192.168.65.51 -m cron -a 'name="None" state=absent'
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@test41 ansible]# ansible 192.168.65.51 -a 'crontab -l'
192.168.65.51 | CHANGED | rc=0 >>
​
4、user模块,用户管理模块

name用户名必选参数

state=present|absent present创建 absent删除

system=yes|no 创建用户时,是否是系统账号

uid指定用户的uid

group指定用户组

shell默认系统用户可以不加

create_home=yes|no不是默认的家目录/home。指定到/opt/test1家目录 create_home=yes创建 no不创建

password用户添加密码

remove=yes|no只有当state=absent删除用户,删除用户时是否删除家目录

复制代码
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy102 system=no'
=no是普通用户
xy102:x:1002:1002::/home/xy102:/bin/bash
​
#指定用户、uid号、是否是系统用户
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy103 uid=900 shell=/sbin/nologin system=yes'
​
xy103:x:900:900::/home/xy103:/sbin/nologin
​
#删除用户
[root@test41 ansible]# ansible 192.168.65.51 -m user -a 'name=xy102 remove=yes state=absent'
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "xy102", 
    "remove": true, 
    "state": "absent"
}
​

5、copy模块 复制模块,复制主机文件到目标主机。

src表示源文件 dest目标主机保存的路径 mode复制文件保存的权限 owner文件的所有者 group文件的所在组 content指定复制内容,就不能用src

复制代码
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/'
​
[root@docker2 opt]# cat xy102.txt 
123
​
#设置权限
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/ mode=640'
root用户下的权限640
[root@docker2 opt]# ll
-rw-r-----. 1 root root         4 8月  21 11:37 xy102.txt
​
#指定文件的所有者
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'src=/opt/xy102.txt dest=/opt/ mode=640 owner=wbl group=wbl'
改变了所有者
[root@docker2 opt]# ll
-rw-r-----. 1 wbl  wbl          4 8月  21 11:37 xy102.txt
​
#
[root@test41 opt]# ansible 192.168.65.52 -m copy -a 'content="黑神话:悟空真好玩" dest=/opt/houzi.txt mode=777 owner=wbl group=wbl'
​
[root@docker2 opt]# cat houzi.txt 
黑神话:悟空真好玩
​
#修改文件名
[root@test41 opt]# ansible 192.168.65.52 -a 'mv /opt/houzi.txt /opt/孙悟空。txt'192.168.65.52 | CHANGED | rc=0 >>
​
[root@docker2 opt]# ll
改前的文件名
-rwxrwxrwx. 1 wbl  wbl         27 8月  21 11:43 houzi.txt
改后的文件名
-rwxrwxrwx. 1 wbl  wbl         27 8月  21 11:43 孙悟空。txt
​
权限:r/4读--w/2写--x/1执行
​
5、file模块 设置文件属性

mode owner group state=touch |absent touch 创建 absent 删除

复制代码
#创建文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt state=touch mode=777 owner=wbl group=wbl'
​
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl  wbl   0 8月  21 13:37 abc.txt
​
#创建链接文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt.link src=/opt/abc.txt state=link' 
​
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl  wbl   0 8月  21 13:37 abc.txt
lrwxrwxrwx. 1 root root 12 8月  21 13:39 abc.txt.link -> /opt/abc.txt
​
#删除链接文件
[root@test41 opt]# ansible 192.168.65.51 -m file -a 'path=/opt/abc.txt.link state=absent' 
​
[root@docker1 opt]# ll
-rwxrwxrwx. 1 wbl  wbl   0 8月  21 13:37 abc.txt
​
6、hostname模块 设置远程主机的主机名
复制代码
[root@test41 opt]# ansible 192.168.65.51 -m hostname -a "name=nginx1"
​
[root@docker1 opt]# su
[root@nginx1 opt]# 
​
7、ping模块 测试主机和主机名
复制代码
#ping主机看连接是否正常
[root@test41 opt]# ansible all -m ping
192.168.65.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.65.52 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
​
8、yum模块 在目标主机安装软件 (只能安装和卸载)
复制代码
#安装软件
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=httpd'
192.168.65.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "httpd-2.4.6-99.el7.centos.1.x86_64 providing httpd is already installed"
    ]
}
​
#卸载软件
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=httpd state=absent'
192.168.65.51 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "changes": {
        "removed": [
            "httpd"
        ]
    }, 
​
#查看服务运行状态
[root@test41 opt]# ansible 192.168.65.51 -a 'systemctl status httpd'
192.168.65.51 | FAILED | rc=4 >>
Unit httpd.service could not be found.non-zero return code
​
9、service模块 用来管理目标主机上的软件的运行状态

name 服务名称

state=started|stopped|restarted

enabled=true 设置开机自启

runlevel=40 运行级别 设置了开机自启就需要声明运行级别

复制代码
[root@test41 opt]# ansible 192.168.65.51 -m yum -a 'name=nginx'
[root@test41 opt]# ansible 192.168.65.51 -m service -a 'name=nginx enabled=true state=started runlevel=60'
​

1、安装nginx 2、开启nginx 开机自启动 3、访问的内容是this is nginx1!

复制代码
[root@test41 opt]# ansible 192.168.65.52 -m shell -a 'yum -y install nginx && systemctl start nginx && systemctl enable nginx && echo "this is nginx!" > /usr/share/nginx/html/index.html && curl 192.168.65.52'
​
相关推荐
孤客网络科技工作室3 分钟前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
。puppy38 分钟前
HCIP--3实验- 链路聚合,VLAN间通讯,Super VLAN,MSTP,VRRPip配置,OSPF(静态路由,环回,缺省,空接口),NAT
运维·服务器
颇有几分姿色1 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
AndyFrank1 小时前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源2 小时前
Kafka-linux环境部署
linux·kafka
EricWang13582 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
成都古河云2 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
算法与编程之美2 小时前
文件的写入与读取
linux·运维·服务器
xianwu5433 小时前
反向代理模块
linux·开发语言·网络·git