ansible 远程windows

官方文档查看:https://docs.ansible.com/ansible/latest/user_guide/windows.html

Ansible 从1.7+版本开始支持Windows,但前提是管理机必须为Linux系统,远程主机的通信方式也由SSH变更为PowerShell,同时管理机必须预安装Python的Winrm模块,方可和远程Windows主机正常通信,但PowerShell需3.0+版本且Management Framework 3.0+版本。
简单总结如下:
(1)管理机必须为Linux系统且需预安装Python Winrm模块
(2) 底层通信基于PowerShell,版本为3.0+,Management Framework版本为3.0+
(3) 远程主机开启Winrm服务

一、windows主机上的配置

1. 查看powershell执行策略

get-executionpolicy

在这里插入图片描述
常见执行策略有一下几种:
Unrestricted:权限最高,可以不受限制执行任何脚本。
Default:为Powershell默认的策略:Restricted,不允许任何脚本执行。
AllSigned:所有脚本都必须经过签名才能在运行。
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。

2、更改powershell策略为remotesigned

set-executionpolicy remotesigned

在这里插入图片描述

3、查看powershell版本,如果是3.0不用升级

在这里插入图片描述

4、设置Windows远端管理(WS-Management,WinRM)

(1)winrm service 默认都是未启用的状态,先查看状态;如无返回信息,则是没有启动;

winrm enumerate winrm/config/listener

在这里插入图片描述
(2)针对winrm service 进行基础配置:
此过程还具有打开所需端口的防火墙并启动WinRM服务的额外好处
针对http

winrm quickconfig

在这里插入图片描述
对于https服务配置,使用

winrm quickconfig -transport:https

(3)查看winrm service listener:

winrm e winrm/config/listener

在这里插入图片描述
(4)修改winrm配置,启用远程连接认证
为winrm service 配置auth:

winrm set winrm/config/service/auth '@{Basic="true"}'

等效命令

Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true

在这里插入图片描述
为winrm service 配置加密方式为允许非加密:
AllowUnencrypted: 此选项定义WinRM是否允许在没有消息加密的情况下在HTTP上运行的通信。只有当Ansible_winrm_Transfer为NTLM、Kerberos或Credit ssp时,才有可能进行消息级加密。默认情况下,这是false,只应在调试WinRM消息时设置为true。这只应用于开发和调试目的,因为从Ansible发送的任何内容都可以查看、操作,远程会话也可以被同一网络上的任何人完全接管。

winrm set winrm/config/service '@{AllowUnencrypted="true"}'

在这里插入图片描述
远程windows主机配置到此结束

二、CENTOS7 管理机上配置

1、配置hosts文件:

vim /etc/ansible/hosts

添加如下内容

[windows]
192.168.52.12 ansible_ssh_user="Administrator" ansible_ssh_pass="P@ssw0rd" ansible_ssh_port=5985 ansible_connection="winrm" ansible_winrm_server_cert_validation=ignore

192.168.52.12 为windows主机ip
ansible_winrm_server_cert_validation=ignore 不需要证书认证

查看是否ping通
在这里插入图片描述
出现该提示是因为需预安装Python Winrm模块

如果没有安装pip, 请先安装对应于你的Python版本的pip:

sudo easy_install pip

再安装winrm

pip install pywinrm

这个时候再执行

ansible 192.168.52.12 -m win_ping

可以看到是可以ping通了的
在这里插入图片描述

三、centos中远程操作windows

官方命令介绍:
https://docs.ansible.com/ansible/latest/modules/list_of_windows_modules.html#windows-modules

1、win_ping 查看windows是否存活

ansible windows -m win_ping

存活状态如下
在这里插入图片描述
windows管制状态如下:
在这里插入图片描述

执行命令成功,说明shell执行本身没有问题

ansible windows -m win_shell -a "get-executionpolicy"

在这里插入图片描述

2、win_copy—拷贝文件到远程Windows主机

https://docs.ansible.com/ansible/latest/modules/win_copy_module.html#win-copy-module

ansible windows -m win_copy -a 'src=/root/windows-tranport/test.txt dest=E:\centosFile\test.txt'

在这里插入图片描述
报错:

Exception calling "Run" with "1" argument(s): "Exception calling "Invoke" with 
"0" argument(s): "Command execution stopped because the preference variable "ErrorActionPreference" 
or common parameter is set to Stop: Illegal characters in path.""
At line:47 char:5
+     $output = $entrypoint.Run($payload)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ScriptMethodRuntimeException

看不懂啥问题,
把目标文件名去掉就可以运行成功了,但是目录或者文件名只能用原始的,不能指定拷贝后文件的重命名。
试了几次,发现是目标路径的分隔符问题,用\会有问题,换成/ 或者\ 就OK

ansible 192.168.52.12 -m win_copy -a 'src=/root/windows-tranport/test.txt dest=E:\centosFile\'

在这里插入图片描述

192.168.52.12 | SUCCESS => {
    "changed": true, 
    "checksum": "04f29fd9c9d1b851a54d4199950b8d352fd48263", 
    "dest": "'E:\\centosFile\\test.txt'", 
    "operation": "file_copy", 
    "original_basename": "test.txt", 
    "size": 127, 
    "src": "/root/windows-tranport/test.txt"
}

返回结果

  • operation: “file_copy”—执行的操作为 file_copy;
  • original_basename: 文件名;
  • size: 文件大小 bytes。
  • src: 源路径
  • dest:目标路径
  • checksum:复制文件到远程主机,每次备份会产生一个md5sum,如果两次赋值文件的md5sum相同,那么就不会再次执行复制动作

win_copy的参数

2333
222333
参数可选参数作用
decryptyes / no,默认 yes 此选项控制使用vault的源文件的自动解密。
src要将文件复制到远程服务器的本地路径; 可以是绝对的或相对的。如果path是一个目录,它将被复制(包括源文件夹名称)递归到dest。如果path是一个目录并以“/”结尾,则只有该目录的内部内容被复制到目标。 否则,如果它不以“/”结尾,则复制具有所有内容的目录本身。如果path是一个文件并且dest以“”结尾,则该文件将被复制到具有相同文件名的文件夹中
dest文件应该复制到的远程绝对路径。 如果src是一个目录,它也必须是一个目录。在“双引号”中使用作\为路径分隔符或\。如果dest以\ source结尾,或者source的内容将被复制到目录而不重命名。如果dest是不存在的路径,那么只有当dest以“/”或“\”结尾,或者src是一个目录时才会创建它。如果src和dest是文件,并且dest的父目录不存在,则该任务将失败。
forceyes / no,默认 yes如果设置为yes,则只有在内容与目标不同时才会传输文件。如果设置为no,则仅在目标不存在时传输文件。如果设置为no,则不执行内容的校验,这可以帮助提高较大文件的性能。
remote_srcyes / no,默认 no如果为no,它将在原始/主机上搜索src,如果为yes,它将转到src的远程/目标拿取文件

在这里插入图片描述

四、Ansible主要命令的参数

参考:https://www.cnblogs.com/dachenzi/p/8916521.html

1、ansible 命令主要参数信息

-u : remote user,默认使用root用户登陆
-i : Inventory,指定主机,默认是/etc/ansible/hosts
-m :指定模块的名称(不指定-m,那么默认是command模块)
-a : 模块的参数(比如使用command模块,那么-a参数就是要执行的命令)
-k : 用来提示输入远程主机的密码(基于用户密码登录)
-f : 一次执行几个进程(并发数量),默认为5个
–sudo : 执行命令时使用 sudo 权限(需要用户具有sudo权限)
–key-file: 建立SSH链接的私钥文件
–list-hosts: 列出匹配到的服务器列表

2、Inventory文件

/etc/ansible/hosts:(默认的Inventory)
[test] # 用于定义主机组,all表示所有主机,所以尽量避免使用all作为组名
127.0.0.1 # 该组的主机列表,可以是主机名(dns解析)或者IP地址,或者用符号来表示连续的主机
192.168.1.[80:88] # 表示 192.168.1.80 - 192.168.1.88
[web:children] # 表示子组
nginx # nginx组
test # test组

配置文件中的变量及参数:

ansible_ssh_user : 用于指定管理远程主机的帐号
ansible_ssh_host : 用于指定被管理的主机
ansible_ssh_port :用于指定ssh的端口
ansible_ssh_private_key_file :指定key文件
host_key_checking=False :当第一次连接主机时,会提示yes/no,跳过此次环节
ansible_connection=“winrm” : windows的连接方式
ansible_winrm_server_cert_validation=ignore

3、file文件属性参数

参数
  • force: 在两种情况下会强制创建软连接,默认值为 no。 1、 源文件不存在但之后会建立的情况下;2、目标软连接已存在,需要先取消之前的软连,然后创建新的软链
  • group:定义文件的属组
  • mode:定义文件的权限
  • owner:定义文件的属主
  • path:必选项,定义文件的路径
  • recurse:递归设置文件的属性,只对目录生效(-R)
  • src:要被链接的源文件的属性,只应用于state=link的情况
  • dest:被链接到的路径,只应用与state=link的情况
  • state:
  • directory:如果目录不存在创建目录
  • file:即使文件不存在,也不会被创建
  • link:创建软连接
  • hard:创建硬链接
  • touch:如果文件不存在,则会创建一个新的文件,如果文件存在,则会更新其最后修改时间
  • absent:删除目录,文件或者取消链接文件

例子 test 为hosts配置的测试的主机组

ansible test -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link' -k       # 等于 ln -s /etc/fstab /tmp/fstab
ansible test -m file -a 'path=/tmp/fstab state=absent' -k                                           # 删除文件
ansible test -m file -a 'path=/tmp/lixin.txt state=touch owner=nobody group=nobody mode=666' -k     # 创建文件指定其属主,属组,权限

4、模块的返回值

Ansible通过模块来执行具体的操作,由于模块功能千差万别,所以执行模块操作后,Ansible会根据不同的需要返回不同的结果,Ansible中一些常见的返回值如下:

  • changed:几乎所有的Ansible模块都会返回该变量,表示模块是否对远程主机进行了操作
  • failed:如果模块未能执行完成,将返回failed和true msg:模块执行失败的原因,常见的错误如ssh连接失败,没有执行权限等
  • rc:与命令行相关的模块会返会rc,表示执行Linux名的返回码 stdout:与rc相似,返回的是标准输出的结果
  • stderr:与rc详细,返回的是标准差错误输出 backup_file:所有存在backup选项的模块,用来返回备份文件的路径
  • results:应用在Playbook中存在循环的情况,返回多个结果

5、setup 用于获取系统信息的一个模块
https://buji595.github.io/2019/05/27/Ansible%20Ad-hoc%E5%B8%B8%E7%94%A8Module/#setup

# 查看模块参数
[root@ansible ~]# ansible-doc -s setup

# 查看系统所有信息
[root@ansible ~]# ansible 192.168.1.31 -m setup

# filter 对系统信息进行过滤
[root@ansible ~]# ansible 192.168.1.31 -m setup -a 'filter=ansible_all_ipv4_addresses'

# 常用的过滤选项
ansible_all_ipv4_addresses         所有的ipv4地址
ansible_all_ipv6_addresses         所有的ipv6地址
ansible_architecture               系统的架构
ansible_date_time                  系统时间
ansible_default_ipv4               系统的默认ipv4地址
ansible_distribution               系统名称
ansible_distribution_file_variety  系统的家族
ansible_distribution_major_version 系统的版本
ansible_domain                     系统所在的域
ansible_fqdn                       系统的主机名
ansible_hostname                   系统的主机名,简写
ansible_os_family                  系统的家族
ansible_processor_cores            cpu的核数
ansible_processor_count            cpu的颗数
ansible_processor_vcpus            cpu的个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值