您现在的位置是:首页 >技术杂谈 >Linux-ansible的使用网站首页技术杂谈
Linux-ansible的使用
文章目录
ansible
介绍
Ansible是一个开源的自动化工具,可以帮助您自动化部署、配置和管理计算机系统。在Linux中,Ansible是一种常用的工具,它使用SSH协议来连接远程服务器,并通过编写playbook(剧本)来实现自动化管理。
运维工具:ansible、puppet、salt
云计算、docker、大数据、运维等
ansible:简单、轻量级(使用python写的)
它可以在一台ansible机器上,操控别的服务器,进行一些文本传输、指令执行等批量任务
ansible基于python开发,依赖于:paramiko,PyYaml和jinja三个关键组件
ansible的组成
在Linux中,Ansible由以下几个组件组成:
-
Ansible Core:Ansible的核心组件,它包含了用于管理和自动化IT基础设施的各种功能和工具。
-
Inventory:Ansible使用一个称为“Inventory”的清单来管理目标主机。清单包含了主机名、IP地址、主机组等信息,可以手动编写或从现有系统中动态生成。
-
Playbook:Playbook是一组命令,用于定义对主机或主机组执行的任务,包括配置管理、部署、应用程序安装等。
-
Modules:模块是Ansible的另一个核心组件,它们是Ansible用来执行任务的工具。每个模块都是一个可执行的脚本,可以在远程主机上执行命令、复制文件、管理用户等。
-
Plugins:插件是Ansible用于扩展和自定义其行为的方式。插件可以用来定义新的模块、清单插件、插件过滤器等。
-
API:Ansible API是一个Python库,可以通过编程方式使用Ansible的核心功能。它提供了一种将Ansible功能与其他工具集成的方法。
ansible组成:
1、host inventory --#定义客户机, 可以对客户机进行分类:db类,web类。。。等等
2、playbook --#剧本 让主机按照我给定的剧本去完成一些事情
3、module --#模块 实现一个个功能的程序
4、pluging --#插件 实现一些额外的小功能
实验前提
安装ansible
yum install epel-release
yum install ansible
实验环境
a: 192.168.77.132 (ansible)
c: 192.168.77.133
b: 192.168.77.134
实验前提,做好免密码认证,详见 ssh服务
a -->b ,a–>c a可以免密码登陆到b和c
配置目录:
/etc/ansible/ansible.cfg
ansible的主配置文件,此文件主要定义了roles_path的路径,主机清单路径,连接清单中的主机方式等等
/etc/ansible/hosts
这个配置文件就是默认的主机清单配置文件, 可以通过ansible.cfg 重新定义
添加主机:
备份原本的hosts文件,防止意外
[root@localhost ansible]# cp hosts{,.bak}
[root@localhost ansible]# >hosts 清空文件
编辑hosts文件,添加监控主机
[root@localhost ansible]# vim hosts
使用
选项
Ansible是一个功能丰富的自动化工具,提供了多种选项来控制其行为。以下是一些常用的选项:
-i INVENTORY, --inventory-file=INVENTORY
:指定Ansible使用的主机清单文件路径。默认为/etc/ansible/hosts
。-u REMOTE_USER, --user=REMOTE_USER
:指定远程主机登录用户名。-k, --ask-pass
:提示用户输入远程主机登录密码。-K, --ask-become-pass
:提示用户输入sudo或su特权密码。-c CONNECTION, --connection=CONNECTION
:指定连接类型,如ssh
、local
、docker
等。-m MODULE_NAME, --module-name=MODULE_NAME
:指定要执行的模块名称。-a MODULE_ARGS, --args=MODULE_ARGS
:指定传递给模块的参数。-f FORKS, --forks=FORKS
:指定Ansible在多少个主机上并行执行任务。-t TIMEOUT, --timeout=TIMEOUT
:指定连接超时时间。-v, --verbose
:增加输出详细程度。可以多次使用以增加详细程度。-e EXTRA_VARS, --extra-vars=EXTRA_VARS
:指定额外的变量,可以在Ansible Playbook中使用。-l SUBSET, --limit=SUBSET
:指定要操作的主机子集。
实例
在所有主机上创建一个目录/tmp/sc
[root@localhost ansible]# ansible all -m shell -a "mdkir /tmp/sc"
在没有登录自己主机的情况
ansible 管理
root@192.168.242.131:22 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname 192.168.242.131:22: Name or service not known",
"unreachable": true
}
yandonghao@192.168.242.129 | FAILED | rc=127 >>
/bin/sh: 1: mdkir: not foundnon-zero return code
[root@localhost ansible]# ssh root@192.168.242.131
由于自己进入自己没有免密码登录,需要自己登录自己,然后退出
[root@localhost ansible]# ansible all -m shell -a "mkdir /tmp/sc2"
[WARNING] Ansible is being run in a world writable directory (/etc/ansible), ignoring it as an ansible.cfg source. For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
[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.
root@192.168.242.131 | CHANGED | rc=0 >>
yandonghao@192.168.242.129 | CHANGED | rc=0 >>
>>>>>>>>>>>>>>
rc -- return code 返回状态码,
>返回0就是执行成功了,非0,就是执行失败
模块
copy
copy
是 Ansible 中的一个常用模块,用于将文件或者文本内容复制到远程主机上。下面是该模块的详细介绍和使用方法:
介绍
copy
模块可以将本地文件复制到远程主机上,也可以将文本内容写入远程主机上的文件中。该模块支持设置文件的权限和所有者、组、目录等。
使用
以下是使用 copy
模块复制文件的基本语法:
ansible <host-pattern> -m copy -a "src=<source> dest=<destination>"
其中,<host-pattern>
表示要操作的主机,可以是单个主机名、IP 地址,也可以是主机名的列表或通配符;
-a
:指定模块的参数
src= 源文件路径
dest= 目标路径
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
以下是使用 copy
模块将文本内容写入远程主机文件的基本语法:
ansible <host-pattern> -m copy -a "content=<content> dest=<destination>"
其中,content
表示要写入远程主机文件的文本内容。
除了以上基本用法,copy
模块还支持以下参数:
mode
:设置文件的权限,如mode=0644
owner
:设置文件的所有者,如owner=root
group
:设置文件的所属组,如group=users
directory_mode
:设置目录的权限,如directory_mode=0755
backup
:设置备份文件的后缀,如backup=yes
或backup=.bak
以下是使用 copy
模块的几个例子:
-
将本地文件复制到远程主机上:
ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf"
-
将本地文件复制到远程主机上,并设置文件权限和所有者:
ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf mode=0644 owner=root"
-
将文本内容写入远程主机文件:
ansible web -m copy -a "content='Hello world!' dest=/tmp/hello.txt"
-
将文本内容写入远程主机文件,并设置文件权限和所属组:
ansible web -m copy -a "content='Hello world!' dest=/tmp/hello.txt mode=0644 group=users"
执行在hosts的主机,将/lianxi/sad.txt,复制到/lianxi/sad-copy.txt,同时将复制的文件命名为sad-copy.txt,设置文件的权限为777,设置属主和数组。
[root@localhost lianxi]# ansible all -m copy -a "src=/lianxi/sad.txt dest=/lianxi/sad-copy.txt mode=777 owner=sanchuang group=sanchuang"
在使用 copy
模块时,需要确保远程主机上的目录和文件存在,否则会出现错误。如果需要创建目录,可以使用 file
模块。
fetch
fetch
模块是 Ansible 的一个模块,用于从远程主机上复制文件到控制节点上。
以下是 fetch
模块的使用示例:
ansible <host-pattern> -m fetch -a "src=<remote_file_path> dest=<local_file_path>"
其中,各个参数的含义如下:
<host-pattern>
:目标主机的模式,可以是单个主机的 IP 地址或主机名,也可以是一个用逗号分隔的主机列表,还可以是一个包含多个主机的组名。例如,all
表示所有主机。<remote_file_path>
:需要从远程主机上复制的文件路径,可以是文件的绝对路径,也可以是相对路径。<local_file_path>
:本地文件保存的路径,可以是文件的绝对路径,也可以是相对路径。
下面是一个示例:
ansible webserver -m fetch -a "src=/var/log/nginx/access.log dest=/tmp/"
上述示例的含义是,从名为 webserver
的主机上复制 /var/log/nginx/access.log
文件到本地的 /tmp/
目录中。
在使用 fetch
模块时,需要确保控制节点有权限读取远程主机上的文件,否则会出现权限不足等错误。
将hosts中所有主机下的/etc/group 复制到当前主机中的/opt/ansible/group中
[root@localhost ansible]# ansible all -m fetch -a "src=/etc/group dest=/opt/ansible/group"
[root@localhost ansible]# cd /opt/ansible
[root@localhost ansible]# ls
group
按主机划分
[root@localhost ansible]# tree
.
└── group
├── root@192.168.242.131
│ └── etc
│ └── group
└── yandonghao@192.168.242.129
└── etc
└── group
shell
shell
是 Ansible 中的一个模块,它允许在远程主机上执行 shell 命令或脚本。
使用 shell
模块,您可以执行任何 shell 命令,比如常见的 ls
,cp
,rm
等。示例:
ansible all -m shell -a "ls /home"
上面的命令将在所有远程主机上执行 ls /home
命令,显示 /home
目录下的所有文件和文件夹。
您也可以使用 shell
模块执行复杂的 shell 命令或脚本。比如,假设您有一个 shell 脚本 backup.sh
,您可以使用以下命令在所有远程主机上执行它:
ansible all -m shell -a "/path/to/backup.sh"
使用 -a
参数指定要在远程主机上执行的命令或脚本。您还可以使用其他一些常见的参数,例如 -u
指定远程主机的用户名,-b
使用特权模式运行命令等。
[root@localhost ansible]# ansible all -m shell -a "free -m"
该命令用于查看当前系统的内存使用情况。执行结果将会返回每个主机执行命令的输出信息
file
Ansible是一个自动化工具,可用于部署、配置和管理远程主机。在Ansible中,file模块可用于管理文件系统上的文件和目录。
file模块的基本语法如下:
- name: Example of using the file module
file:
path: /path/to/file
owner: owner_name
group: group_name
mode: "0644"
state: present
其中,path参数是必需的,指定文件或目录的路径。其他参数是可选的:
- owner:指定文件或目录的所有者。
- group:指定文件或目录的组。
- mode:指定文件或目录的权限模式。
- state:指定文件或目录的状态,可以是present(默认)、absent、directory、link或hard。
下面是一些示例:
- 创建一个空文件
- name: Create an empty file
file:
path: /path/to/file
state: touch
- 创建一个目录
- name: Create a directory
file:
path: /path/to/directory
state: directory
[root@localhost ansible]# ansible all -m file -a "path=/tmp/sanchuang state=directory"
- 更改文件的所有者和组
- name: Change owner and group of a file
file:
path: /path/to/file
owner: owner_name
group: group_name
- 更改文件的权限
- name: Change mode of a file
file:
path: /path/to/file
mode: "0644"
- 删除文件
- name: Delete a file
file:
path: /path/to/file
state: absent
[root@localhost ansible]# ansible all -m file -a "path=/tmp/sanchuang state=absent"
- 创建符号链接
- name: Create a symbolic link
file:
src: /path/to/source
dest: /path/to/link
state: link
- 创建硬链接
- name: Create a hard link
file:
src: /path/to/source
dest: /path/to/link
state: hard
cron
在Ansible中,cron模块可用于管理Linux系统上的crontab任务。
cron是Linux系统中的一个后台服务,可定期运行指定的命令或脚本。使用Ansible的cron模块可以轻松地添加、修改和删除crontab任务。
cron模块的基本语法如下:
- name: Example of using the cron module
cron:
name: "Task name"
minute: "*/5"
hour: "*"
day: "*"
month: "*"
weekday: "*"
user: user_name
job: /path/to/command
state: present
其中,name参数是任务的名称,minute、hour、day、month、weekday参数用于指定任务运行的时间。其他参数是可选的:
- user:指定任务所属的用户,默认为root用户。
- job:指定任务要运行的命令或脚本。
- state:指定任务的状态,可以是present(默认)、absent 删除 (基于name)、reboot、present-with-comment或absent-with-comment。
下面是一些示例:
- 添加一个crontab任务
- name: Add a cron job
cron:
name: "Task name"
minute: "*/5"
hour: "*"
day: "*"
month: "*"
weekday: "*"
user: user_name
job: /path/to/command
[root@localhost ansible]# ansible all -m cron -a "minute=*/3 job='date>>/tmp/time.txt' name=cron_ansible state=present"
查看是否生成新的计划任务
[root@localhost tmp]# crontab -l
#Ansible: cron_ansible
*/3 * * * * date>>/tmp/time.txt
- 修改一个crontab任务
- name: Modify a cron job
cron:
name: "Task name"
minute: "0"
hour: "1"
day: "*"
month: "*"
weekday: "*"
user: user_name
job: /path/to/new_command
- 删除一个crontab任务
- name: Remove a cron job
cron:
name: "Task name"
state: absent
[root@localhost ansible]# ansible all -m cron -a "minute=*/3 job='date>>/tmp/time.txt' name=cron_ansible state=absent"
查看是否删除成功
[root@localhost tmp]# crontab -l
[root@localhost tmp]#
ntp服务,是一个时间管理服务器
在 centos 8 中, ntp 已经被 chrony 代替。
之前的版本:yum install -y ntp
centos8:yum install chrony
每三分钟输出当前时间,到/tmp/time.txt文件
[root@b ~]# ansible all -m cron -a "minute=*/3 job='date >>/tmp/time.txt' name=date_test state=present"
每天凌晨1点 检查/etc/passwd 文件是否被修改,并且生成检查报告
实现ansible node节点服务器备份 备份/var/log/messages 备份到/backup目录下,并且取名2020-11-25-01-log.tar.gz,每一个小时执行一次
ansible web -m cron -a "minute=*/1 job='tar -czf /tmp/sc/$(date +%Y-%m-%d-%H)-log.tar.gz /var/log/messages' name=date_test state=present"
yum
在Ansible中,yum模块可用于在Linux系统上管理软件包。yum是一种软件包管理器,用于自动下载、安装、更新和删除软件包及其依赖项。
yum模块的基本语法如下:
- name: Example of using the yum module
yum:
name: package_name
state: present
其中,name参数是必需的,指定要安装或卸载的软件包名称。state参数是可选的,指定软件包的状态,可以是present(默认)、absent或latest。
除了安装和卸载软件包,yum模块还支持更新和检查软件包状态的功能。
下面是一些示例:
- 安装一个软件包
- name: Install a package
yum:
name: package_name
state: present
安装wget
[root@b ~]# ansible all -m yum -a "name=wget state=installed"
- 卸载一个软件包
- name: Remove a package
yum:
name: package_name
state: absent
删除
[root@b ~]# ansible all -m yum -a "name=wget state=absent"
- 更新所有软件包
- name: Update all packages
yum:
name: "*"
state: latest
- 检查软件包状态
- name: Check the state of a package
yum:
name: package_name
state: query
除了以上示例,yum模块还有其他一些参数和用法。可以查看官方文档来了解更多详细信息。
service
在Ansible中,service模块可用于管理Linux系统上的系统服务,例如启动、停止、重启服务等。
service模块的基本语法如下:
- name: Example of using the service module
service:
name: service_name
state: started
其中,name参数是必需的,指定要管理的服务的名称。state参数是可选的,指定服务的状态,可以是started(默认)、stopped、restarted、reloaded等。
除了管理服务的状态,service模块还支持检查服务的状态、启用或禁用服务、重载服务配置等功能。
下面是一些示例:
- 启动一个服务
- name: Start a service
service:
name: service_name
state: started
- 停止一个服务
- name: Stop a service
service:
name: service_name
state: stopped
[root@localhost ansible]# ansible all -m service -a "name=firewalld state=stopped "
- 重启一个服务
- name: Restart a service
service:
name: service_name
state: restarted
- 重载一个服务的配置
- name: Reload a service
service:
name: service_name
state: reloaded
vsftpd
介绍
vsftpd是一种高度安全且可靠的FTP服务器软件,全称为Very Secure FTP Daemon。它是一个免费的开源软件,可以在Linux和其他UNIX系统上运行。
vsftpd具有许多安全特性,例如支持SSL / TLS加密传输、防止用户访问根目录、限制用户访问、限制IP访问等。此外,它还提供了一些高级功能,例如虚拟用户、虚拟IP、上传/下载速度限制等。
vsftpd的配置相对简单,它的默认配置文件位于/etc/vsftpd.conf。通过编辑该文件可以配置FTP服务器的各种参数和选项。
一些常见的配置选项包括:
- 匿名用户访问:anonymous_enable=YES
- 限制用户登录:local_enable=YES,write_enable=YES
- SSL / TLS支持:ssl_enable=YES,ssl_ciphers=HIGH
- 限制IP访问:tcp_wrappers=YES,设置/etc/hosts.allow和/etc/hosts.deny
安装和配置vsftpd可以帮助用户快速搭建FTP服务器,从而实现文件传输和共享。
使用
关闭vsftpd服务
[root@b ~]# ansible all -m service -a "name=vsftpd state=stopped"
开启vsftpd服务
[root@b ~]# ansible all -m service -a "name=vsftpd state=started"
使用ansible 部署web服务
安装nginx, 修改nginx的配置文件 /etc/nginx/conf.d/sc.conf
传递index.html文件 到 /opt/dist目录下
index里面的内容: this is index
启动服务
测试能不能访问
server {
listen 80 ;
server_name www.sc.com;
root /opt/dist;
access_log /var/log/nginx/sc_access.log main;
location / {
}
location =/api {
}
}
script
在Ansible中,script模块可以用于在目标主机上运行任意的本地脚本或命令。该模块将本地脚本复制到目标主机上并在目标主机上执行。
script模块的基本语法如下:
- name: Example of using the script module
script: path/to/local_script.sh
其中,path/to/local_script.sh是要在目标主机上运行的本地脚本的路径。
除了运行本地脚本,script模块还支持传递参数给脚本、设置脚本超时时间、以及处理脚本的标准输出和错误输出等功能。
下面是一些示例:
- 运行本地脚本
- name: Run a local script
script: path/to/local_script.sh
- 运行本地脚本并传递参数
- name: Run a local script with arguments
script: path/to/local_script.sh arg1 arg2
[root@b ~]# cat test.sh
#!/bin/bash
echo "test ansible" >> /tmp/ansible.txt
[root@b ~]# ansible all -m script -a "/root/test.sh" -f 6
这个命令表示使用 Ansible 的 script 模块,在所有的目标主机上执行 /root/test.sh
脚本,并将并发度设置为 6。 -f
参数用于指定 Ansible 在同时运行的任务数上的限制。默认情况下,Ansible使用5个并发线程运行任务,您可以使用 -f
参数增加或减少这个数值。
- 运行本地脚本并设置超时时间
- name: Run a local script with timeout
script:
script: path/to/local_script.sh
timeout: 60
- 运行本地脚本并处理输出
- name: Run a local script and handle output
script:
script: path/to/local_script.sh
register: script_output
debug:
var: script_output.stdout_lines
scp
scp
是一种在Linux系统中进行安全文件传输的命令行工具。它使用SSH协议加密传输数据,并且在远程主机上必须安装SSH服务。
以下是一些常用选项:
选项
-P port
:指定SSH端口号。-r
:递归复制整个目录。-C
:开启压缩传输。-v
:详细输出传输进程信息。
实例
例如,以下命令将使用SSH端口号2222从本地主机上传文件到远程主机:
scp -P 2222 /path/to/local/file remote_user@remote_host:/path/to/remote/file。
以下是使用scp
命令进行文件传输的一般语法:
scp [options] [source] [destination]
其中options
是可选的,它们可以用来指定传输的参数,例如端口号、递归模式等。source
是要传输的文件或目录的路径,destination
是文件或目录传输到的位置。在传输文件时,可以在文件名前加上用户名和主机名来指定远程主机,格式如下:
[username@]host:[path]
以下是几个常见的使用情况:
- 从远程主机下载文件到本地主机:
scp remote_user@remote_host:/path/to/remote/file /path/to/local/file
这将从远程主机下载文件到本地主机。
- 从本地主机上传文件到远程主机:
scp /path/to/local/file remote_user@remote_host:/path/to/remote/file
这将从本地主机上传文件到远程主机。
- 从远程主机下载整个目录到本地主机:
scp -r remote_user@remote_host:/path/to/remote/directory /path/to/local/directory
这将从远程主机下载整个目录到本地主机。
- 从本地主机上传整个目录到远程主机:
scp -r /path/to/local/directory remote_user@remote_host:/path/to/remote/directory
这将从本地主机上传整个目录到远程主机。
5.将对象的/etc/passwd 复制到当前目录下
[root@localhost ansible]# scp yandonghao@192.168.242.129:/etc/passwd ./
passwd 100% 1870 975.7KB/s 00:00
[root@localhost ansible]# ls
ansible.cfg hosts hosts.bak passwd roles
6.将 需要 转送的文件复制到对象的家目录(也可以在对象ip后面加路径)
[root@localhost ansible]# scp ansible.cfg yandonghao@192.168.242.129:
ansible.cfg 100% 20KB 8.9MB/s 00:00
yandonghao@ydh:~$ ls
ansible.cfg '~index.html' ssh yandonghao 表单.html
paramiko
ansible:使用python写的简单、轻量级的运维工具
它可以在一台ansible机器上,操控别的服务器。进行一些文本传输,指令执行等批量任务
Paramiko是一个Python模块,可用于在Linux系统中通过SSH(Secure Shell)进行远程控制和文件传输。以下是在Linux中使用Paramiko的详细介绍和使用步骤:
- 安装Paramiko
要安装Paramiko,可以使用pip命令:
pip install paramiko
- 连接到远程主机
要使用Paramiko连接到远程主机,请使用SSHClient类:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='remote_server', username='username', password='password')
在此示例中,使用SSHClient类创建一个SSH连接,指定远程服务器的主机名、用户名和密码。
- 远程执行命令
要在远程主机上执行命令,请使用SSHClient的exec_command()
方法:
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())
在此示例中,使用exec_command()
方法在远程主机上执行ls -l
命令,并使用stdout.read().decode()
方法将输出作为字符串打印。
- 上传和下载文件
要上传文件,请使用SFTPClient类的put()
方法:
sftp = ssh.open_sftp()
sftp.put('/local/file/path', '/remote/file/path')
sftp.close()
在此示例中,使用SFTPClient的put()
方法将本地文件上传到远程服务器。
要下载文件,请使用SFTPClient类的get()
方法:
sftp = ssh.open_sftp()
sftp.get('/remote/file/path', '/local/file/path')
sftp.close()
在此示例中,使用SFTPClient的get()
方法将远程服务器上的文件下载到本地系统。
paramiko的SSHClient
Paramiko是一个用Python编写的SSH(Secure Shell)工具包,可以用于远程控制和文件传输。Paramiko中包含了SSH客户端类SSHClient,可用于与远程服务器进行SSH通信。以下是Paramiko中SSHClient的基本用法:
- 导入Paramiko模块
在使用Paramiko中的SSHClient之前,需要先导入Paramiko模块:
import paramiko
- 创建SSHClient对象
要创建SSHClient对象,需要使用SSHClient()构造函数。在创建SSHClient对象之前,应该设置MissingHostKeyPolicy,以避免连接未知主机时出现问题:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
在此示例中,使用AutoAddPolicy()指定自动添加新主机的策略。
- 连接远程主机
要使用SSHClient连接到远程主机,可以使用SSHClient的connect()
方法。connect()
方法接受主机名、用户名、密码等参数:
ssh.connect(hostname='remote_host', username='user', password='password')
在此示例中,使用connect()
方法连接到远程主机,并指定主机名、用户名和密码。
- 执行命令
要在远程主机上执行命令,请使用SSHClient的exec_command()
方法:
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())
在此示例中,使用exec_command()
方法在远程主机上执行ls -l
命令,并使用stdout.read().decode()
方法将输出作为字符串打印。
- 上传和下载文件
要上传文件,请使用SFTPClient类的put()
方法:
sftp = ssh.open_sftp()
sftp.put('/local/file/path', '/remote/file/path')
sftp.close()
在此示例中,使用SFTPClient的put()
方法将本地文件上传到远程服务器。
要下载文件,请使用SFTPClient类的get()
方法:
sftp = ssh.open_sftp()
sftp.get('/remote/file/path', '/local/file/path')
sftp.close()
在此示例中,使用SFTPClient的get()
方法将远程服务器上的文件下载到本地系统。
总之,SSHClient是Paramiko中的一个核心组件,可用于连接远程主机,执行命令以及上传和下载文件。它为Python程序员提供了一种使用SSH进行远程控制和文件传输的强大工具。
实例
[root@sc-server python-test]# cat paramiko-test.py
import paramiko
# 实例化SSHClient
ssh_client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接 ,此方法必须放在connect方法的前面
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证 ,调用connect方法连接服务器
ssh_client.connect(hostname='192.168.227.137', port=22, username='sanchuang', password='123456')
# 打开一个Channel并执行命令 结果放到stdout中,如果有错误将放到stderr中
stdin, stdout, stderr = ssh_client.exec_command('touch aa')
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
#打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient连接
ssh_client.close()
pssh
pssh是一个用于在多台远程主机上并行执行命令的工具。pssh允许您通过ssh连接到多台远程主机,然后在这些主机上同时执行相同的命令。pssh还提供了许多高级功能,例如在远程主机上复制文件,使用自定义选项执行命令等。
使用pssh之前,您需要在本地主机和所有远程主机之间建立ssh连接。确保您可以通过ssh连接到所有远程主机,无需输入密码。您可以使用ssh-keygen命令生成公钥和私钥,然后将公钥复制到所有远程主机的~/.ssh/authorized_keys文件中。
安装pssh
pssh是一个Python模块,可以使用pip安装:
pip install pssh
[root@localhost 4-11]# yum install pssh -y
或者,您也可以在Debian或Ubuntu系统上使用apt-get安装pssh:
sudo apt-get install pssh
使用pssh
使用pssh非常简单,只需执行以下命令即可:
pssh -h hosts.txt command
在上面的命令中,hosts.txt是包含所有远程主机的主机列表文件,command是要在远程主机上执行的命令。
例如,如果您要在名为hosts.txt的主机列表文件中列出的所有主机上执行df命令,可以执行以下命令:
pssh -h hosts.txt df
pssh会同时在所有远程主机上执行df命令,并将结果输出到本地终端。如果您只想在某些主机上执行命令,您可以在主机列表文件中列出这些主机的IP地址或主机名。
在pssh命令中,您还可以使用许多选项来自定义操作:
-
-l user:指定用于ssh连接的用户名,默认为当前用户名。
-
-p num:指定要使用的ssh端口号,默认为22。
-
-i identity_file:指定要使用的私钥文件,默认为~/.ssh/id_rsa。
-
-t timeout:指定ssh连接的超时时间,默认为60秒。
-
-o option:指定要传递给ssh的其他选项,例如-o “StrictHostKeyChecking=no”。
-
-O option:指定要传递给pssh的其他选项,例如-O “ConnectTimeout=30”。
-
-v:启用详细输出模式。
除了执行命令之外,pssh还支持在远程主机上复制文件,使用自定义选项执行命令等高级功能。您可以通过运行以下命令来获取pssh的完整文档:
man pssh
或者,您可以在命令行中运行以下命令来查看pssh的帮助:
pssh --help
实例
在当前主机上执行pssh命令,使用ip.txt文件中列出的所有IP地址或主机名建立ssh连接,然后在所有这些远程主机上执行df -Th命令。df -Th命令用于列出所有文件系统的磁盘空间使用情况,以可读格式显示大小。
[root@localhost 4-11]# vim ip.txt
[root@localhost 4-11]# cat ip.txt
root@192.168.242.131:22
yandonghao@192.168.242.129
[root@localhost 4-11]# pssh -h ip.txt "df -Th"
[1] 14:40:24 [SUCCESS] root@192.168.242.131:22
[2] 14:40:24 [SUCCESS] yandonghao@192.168.242.129
playbook
自动化执行
如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象
语法 yaml 格式配置
介绍
Ansible Playbook 是一个声明式的配置管理工具,它使用 YAML 格式的文件来定义一组任务和操作,用于自动化管理和配置 Linux 主机。Playbook 提供了一种简单而强大的方法来组织多个任务和操作,以实现复杂的部署和配置需求。
1、playbook的核心元素
hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
2、playbook运行方式
ansible-playbook --check 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml 语法检测
ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务
ansible-playbook playbook.yaml 运行
yaml 格式
大小写敏感
使用缩进表示层级表示,不要大tab,只能用空格缩颈
相同层级的元素左对齐
字符串可以不用引号标注
号单行注释
使用
- 先定义a.ymal
[root@localhost python-test]# cat a.ymal
class:
mjh:
- chenli
- tangyuzhi
- xiangding
twg:
- liuxiaoxiao
- quanyan
调用a.ymal
[root@localhost tmp]# python3
Python 3.11.2 (main, Apr 7 2023, 13:38:16) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> with open("/opt/python-test/a.ymal") as fp:
... data = yaml.load(fp,Loader=yaml.FullLoader)
... print(data)
... print(data)
...
{'class': {'mjh': ['chenli', 'tangyuzhi', 'xiangding'], 'twg': ['liuxiaoxiao', 'quanyan']}}
{'class': {'mjh': ['chenli', 'tangyuzhi', 'xiangding'], 'twg': ['liuxiaoxiao', 'quanyan']}}
- 定义b.yaml ,这是执行复制文件的操作
[root@localhost python-test]# cat b.yaml
- hosts: all
remote_user: root
tasks:
- name: up file
copy: src=/etc/passwd dest=/tmp/passwd_tmp
- name: down file
fetch: src=/etc/passwd dest=/opt
执行文件
[root@localhost python-test]# ansible-playbook b.yaml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [root@192.168.242.137]
TASK [up file] *****************************************************************
changed: [root@192.168.242.137]
TASK [down file] ***************************************************************
changed: [root@192.168.242.137]
PLAY RECAP *********************************************************************
root@192.168.242.137 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
template的使用
template 基于jinja2模板语法去解析
根据一定的条件灵活的设置要复制文件中的部分关键内容,可以使用template模块
模板文件必须以j2结尾
模版语法
编写sc_template.conf.j2
[root@scmysql opt]# cat sc_template.conf.j2
server {
listen {{ listen_port }} ; //这里需要填入的
server_name www.sc.com;
root /opt/dist;
access_log /var/log/nginx/sc_access.log main;
location / {
}
location =/api {
}
}
编写测试剧本
[root@scmysql opt]# cat template_test.yaml
- hosts: web
tasks:
- name: template test
template: src=/opt/sc_template.conf.j2 dest=/tmp/sc.conf
执行playbook, 指定listen_port变量的值
[root@scmysql opt]# ansible-playbook template_test.yaml -e "listen_port=8080"
也可以在hosts文件中 指定每一台主机的变量
[root@scmysql ansible]# cat hosts
[web]
192.168.77.133:22 listen_port=81
192.168.77.134 listen_port=666
一个完整流程
1.创建文本
[root@localhost python-test]# cat sc_template.conf.j2
server {
listen {{ listen_port }} ;
server_name www.sc.com;
root /opt/dist;
access_log /var/log/nginx/sc_access.log main;
location / {
}
location =/api {
}
}
2.写一个页面
[root@localhost python-test]# cat index.html
this is index.html
hello,world
3.写一个剧本
[root@localhost python-test]# cat web_playbook.yaml
- hosts: all
tasks:
- name: yum nginx
yum: name=nginx state=installed
- name: create dir /opt/dist
shell: mkdir /opt/dist
- name: template sc.conf
template: src=/opt/python-test/sc_template.conf.j2 dest=/etc/nginx/conf.d/sc.conf
- name: copy index.html
copy: src=/opt/python-test/index.html dest=/opt/dist/
- name: start nginx
service: name=nginx state=started
指定端口号号,执行文件
[root@localhost python-test]# ansible-playbook web_playbook.yaml -e "listen_port=8080"
>也可以在hosts文件中 单独指定每一台主机的变量
>[root@scmysql ansible]# cat hosts
>[web]
>192.168.77.133:22 listen_port=81
>192.168.77.134 listen_port=666
[nginx]
192.168.77.111
gin
gin的配置文件:
server {
listen 80 ;
server_name www.sc.com;
root /opt/dist;
access_log /var/log/nginx/sc_access.log main;
location / {
}
location =/api {
}
}
使用playbook去部署web服务
hosts: all
remote_user: root
tasks:
- name: yum nginx
yum: name=nginx state=installed
- name: copy sc.conf
copy: src=/lianxi/sc.conf dest=/etc/nginx/conf.d/sc.conf
- name: copy index
copy: src=/lianxi/index.html dest=/opt/dist/
- name: start nginx
service: name=nginx state=started