Ansible功能
1.批量执行远程命令可以对远程的多台主机同时进行命令的执行
2.批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
3.编排高级的企业级复杂的架构任务,Ansible的Playbook和role可以轻松实现大型的IT复杂架构
4.提供自动化运维工具的开发API,有很多运维工具如jumpserver就是基于ansible实现自动化管理功能
Ansible特性
1.基于Python语言实现
2.模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
3.部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
4.安全,基于OpensSHH
5.幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
6.支持playbook编排任务,YAML格式,编排任务支持丰富的数据结构
7.较强大的多层解决方案role
# rpm包安装: EPEL源
yum install ansible
# 编译安装:
yum -y install python-jinja2 PyYAML python-paramiko python-babel
python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
# Git方式:
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
# pip安装: pip是安装Python包的管理器,类似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
# 确认安装:
ansible --version
参考博客: ansible离线安装
当前的python环境版本为2.7.5
pyhon离线下载第三方库,网址为: https://pypi.org/
离线安装的第三方库有:
pywinrm-0.4.2
ntlm-auth-1.1.0.tar.gz
requests_ntlm-1.1.0.tar.gz
xmltodict-0.12.0-py2.py3-none-any.whl
相关的版本信息如下:
链接:https://pan.baidu.com/s/1vqUSk3B_XKLAvzFGAr0HIw
提取码:3844
使用相关的命令进行安装:
# 安装包解压
tar -xzvf ansible-2.4-rpms.el7.tar.gz
# 进入安装包
cd ansible-2.4-rpms.el7
# 安装ansible依赖内容
rpm -ivh PyYAML*rpm libyaml*rpm python-babel*rpm python-backports*rpm python-backports-ssl_match_hostname*rpm python-cffi*rpm python-enum34*rpm python-httplib2*rpm python-idna*rpm python-ipaddress*rpm python-jinja2*rpm python-markupsafe*rpm python-paramiko*rpm python-passlib*rpm python-ply*rpm python-pycparser*rpm python-setuptools*rpm python-six*rpm python2-cryptography*rpm python2-jmespath*rpm python2-pyasn1*rpm sshpass*rpm --nodeps --force
# 安装ansible
rpm -ivh ansible-2.4.2.0-2.el7.noarch.rpm
安装完成后查看ansible的版本信息:
另外一种ansible的安装方式时使用 包装好 一个yum源进行安装,未尝试。
Inventory 主机清单
- ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
- 默认的inventory file为 /etc/ansible/hosts
- inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
官网说明:How to build your inventory — Ansible Documentation
修改主机清单内容
# 添加以下内容
$ sudo vim /etc/ansible/hosts
查看主机清单内容
# 查看主机清单
$ sudo cat /etc/ansible/hosts
Linux的主机清单如下所示:
# 查看所有的主机列表
ansible all --list-hosts
# 查看分组的主机列表
ansible servers --list-hosts
# 设置被管理的机器
[servers] # aliyun组
aliyun ansible_ssh_host=139.198.167.214 ansible_connection=ssh ansible_user=root ansible_password=xxxxx
用于匹配被控制的主机的列表
1.All:表示所有Inventory中的所有主机
范例:
ansible -m ping
2.*:通配符
# *通配符
ansible "*" -m ping
# 192.168.1.*
anible 192.168.1.* -m ping
# srvs
ansible "srvs" -m ping
# 192.168.1.1 192.168.1.2
ansible "192.168.1.1 192.168.1.2" -m ping
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
3.或关系
# 在websrvs组并且在dbsrvs组中的主机
ansible "192.168.1.1:192.168.1.2" -m ping
ansible "websrvs:dbservs" -m ping
4.逻辑与
# 在websrvs组并且在dbsrvs组中的主机
ansible "websrvs:&dbservs" -m ping
5.逻辑非
# 在websrvs组并且在dbsrvs组中的主机
ansible "websrvs:!dbservs" -m ping
ansible-doc --help
# 查看ping模块
ansible-doc ping
# 查询git模块信息
ansible-doc git
# 查询不存在模块简要信息
ansible-doc -s win_git
# 简要查看模块信息
ansible-doc -s ping
# 查看所有的模块信息
ansible-doc -l
常用github:geerlingguy/ansible-for-devops: Ansible for DevOps examples. (github.com)
中文网站: 快速学习视频 — 国内最专业的Ansible中文官方学习手册
常用模块官网:Ansible.Builtin — Ansible Documentation
# 探测是否能够连接远程主机, 检查是否可以连通
ansible all -m ping
功能:在远程主机执行命令,此为默认模块,可忽略-m选项注意.
此命令不支持$VARNAME < > 1;&等,可能用shell模块实现
注意:此模块不具有幕等性
范例:
# 创建目录
ansible servers -m command -a 'mkdir /home/work'
# 复制文件
ansible servers -m command -a 'cp /home/work/log.txt /home'
# 删除文件
ansible servers -m command -a 'rm -rf /home/work'
[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.
在这个提示中,有一个warning:Consider using file module with state=absent rather than running rm
这个的意思是让我们使用file模块 然后设置state=absent就可以删除文件。
ansible all -m shell -a "ps -ef |grep httpd"
# 1、修改文件属性
ansible all -m file -a "path=/root/test.sh owner=test group=test"
# 2、生成链接文件
ansible all -m file -a "src=/root/test.sh dest=/root/testlink.sh owner=root group=root state=link"
# 3、创建空文件
ansible all -m file -a "path=/root/testtouch.sh state=touch"
# 4、创建空目录
ansible all -m file -a "path=/root/testdirectory state=directory"
# 5、删除目录或文件,强制执行
ansible all -m file -a "path=/root/testdirectory state=absent force=yes"
playbook创建目录:
- name: Creates directory
file:
path: /src/www
state: directory
功能:从ansible服务器主控端复制文件到远程主机
注意:src-file如果是没指明路径,则为当前目录或当前目录下的files目录下的filex件
# 复制/etc目录自身,注意/etc/后面没有/
ansible websrvs-m copy-a"src=/etc dest=/backup"
# 复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/
ansible servers -m copy -a 'src=/home/work/ dest=/home/'
[root@iZuf67uguykg2mgmg6p2xcZ ~]# ansible servers -m copy -a 'src=/home/work/ dest=/home/'
139.198.167.214 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/home/log1.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1635073187.275066-7303-166917367750812/source",
"state": "file",
"uid": 0
}
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
范例:
ansible all -m fetch -a 'src=/srv/fect_file dest=/data/os'
功能:用于将文件或软件从http、https或ftp下载到本地节点上或被管理机节点上
常用参数:
dest= : 下载到哪里(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称。
owner:指定g属主
group:指定属组
mode:指定权限
force : 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件。
others : [file]模块接受的所有参数也可以在这里工作
sha256sum : 如果将SHA-256校验和传递给此参数,目标文件的摘要将在下载后计算,以确保其完整性
url : HTTP,HTTPS或FTP URL(http | https | ftp)
url_password : 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用`url_password'参数。
url_username : 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'使用。
use_proxy : 如果是no,它将不使用代理,即使在目标主机上的环境变量中定义了一个代理。
validate_certs :如果“no”,SSL证书将不会被验证。 这只能使用自签名证书在个人控制的网站上使用。
示例:
ansible all -m get_url -a "url=https://gitee.com/naumy/ansible_for_develop.git dest=/root/"
windows支持:Windows Support — 国内最专业的Ansible中文官方学习手册
ansible-windows模块介绍:
Windows modules — Ansible Documentation
github示例网址:
https://github.com/ansible-collections/ansible.windows
# 判断主机连接是否成功, 查看是否ping通
ansible all -m wisn_ping
# 测试windows组是否连同
ansible windows -m win_ping
# 这样是不能够执行的
ansible windows -m ansible.windows.win_ping
连接成功:
如果不能够连通,请检查,或者请查看我的踩坑记录是否有踩过坑。
Copy-Item (Microsoft.PowerShell.Management) - PowerShell | Microsoft Docs
# 远程执行cmd 命令
ansible windows -m win_shell -a 'ipconfig'
目前我的桌面上存在两个文件夹,A文件夹下面存放了 demo.txt 文件:
# 复制文件
ansible windows -m win_shell -a 'copy D:\Users\ywwei\Desktop\A\demo.txt D:\Users\ywwei\Desktop\B'
# 移动文件
ansible windows -m win_shell -a 'move D:\Users\ywwei\Desktop\A\demo.txt D:\Users\ywwei\Desktop\B'
# 修改文件名称
ansible windows -m win_shell -a 'ren D:\Users\ywwei\Desktop\A\demo.txt demo1.txt'
# 修改文件名称
ansible windows -m win_shell -a 'ren D:\Users\ywwei\Desktop\A\demo.txt demo1.txt'
# 使用cmd clone代码
# clone command
git clone http://192.168.91.237:8929/test/python.git D:\Users\ywwei\Desktop\python
# ansible commond
ansible windows -m win_shell -a 'git clone http://192.168.91.237:8929/test/python.git D:\Users\ywwei\Desktop\python'
# 删除文件
ansible windows -m win_file -a 'dest=D:\Users\ywwei\Desktop\demo2.txt state=absent'
# 删除文件
ansible windows -m win_file -a 'path=D:\Users\ywwei\Desktop\demo2.txt state=absent'
# 删除目录
ansible windows -m win_file -a 'dest=c:\test state=absent'
# 创建文件夹
ansible windows -m win_file -a 'dest=C:/test state=directory'
# -vvv or -vvvv 输出详细信息
ansible all -m ping -vvv
尝试一:从网络磁盘中复制文件到本地硬盘
Copy-Item -Path "D:\Users\ywwei\Desktop\ansible\A\*" -Destination "D:\Users\ywwei\Desktop\ansible\B" -Recurse
尝试二:从本地磁盘复制文件到网络磁盘
Copy-Item -path "\\192.168.91.241\amr\User\ywwei\ansible\*" -Destination "D:\Users\ywwei\Desktop" -Recurse
尝试三:使用ansible 复制本地磁盘文件到本地磁盘
ansible windows -m win_shell -a 'Copy-Item -Path "D:\Users\ywwei\Desktop\ansible\A\*" -Destination "D:\Users\ywwei\Desktop\ansible\B" -Recurse'
尝试四:使用ansible 复制网络磁盘文件到本地磁盘
# 尝试使用
ansible windows -m win_shell -a 'Copy-Item -path "\\192.168.91.241\amr\User\ywwei\ansible\*" -Destination "D:\Users\ywwei\Desktop" -Recurse'
发现没有文件,但是显示成功!!
# 传输文件到windows
ansible windows -m win_copy -a 'src=/etc/hosts dest=c:\test\hosts.txt'
# 创建用户
ansible 192.168.11.149 -m win_user -a "name=user1 passwd=123456"
# 重启
ansible windows -m win_reboot
# 也可以使用powersheel命令进行重启操作
ansible windows -m win_shell -a 'shutdown -r -t 0'
参考:Ansible操作windows - 知乎 (zhihu.com)
1.改powerShell的策略为remotesigned,否则运行不了powerShell脚本文件。
PS C:\Users\huangp> get-executionpolicy
Restricted
PS C:\Users\huangp> set-executionpolicy remotesigned
PS C:\Users\huangp> get-executionpolicy
RemoteSigned
2.如果Powshell版本不对,执行如下命令更新powshell的版本
目前我是用的是 powershell版本为 5.1.14393
# 查看windows的PowerShell的版本的方法
PS C:\Users\ywwei> hosts
所以我的版本不需要更新。
下面是更新版本信息命令。
#更新PowerShell 2.0到3.0的脚本:
#https://github.com/ansible/ansible/blob/devel/examples/scripts/upgrade_to_ps3.ps1
#调用的命令可以如下
PS C:\Users\huangp> & "E:/temp/upgrade_ps3.ps1"
#或者
PS C:\> powershell.exe -ExecutionPolicy RemoteSigned -file "C:\p test.ps1"
3.配置远程控制
下载并运行https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
如果嫌弃Github下载速度太慢:我上传了到了自己的阿里云盘 链接:https://www.aliyundrive.com/s/opYkwmSnQk5
# 进入我我自己的桌面
PS C:\Users\ywwei> cd C:\Users\ywwei\Desktop
# 执行下载后的powershell脚本
PS C:\Users\ywwei\Desktop> .\ConfigureRemotingForAnsible.ps1
4.在PowerShell中执行:
# 启动winrm
winrm qc
# 设置相关的配置
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
5.查看winrm配置信息
# 查看winrm配置信息
winrm get winrm/config
简单介绍:
1.playbook剧本是由一个或多个"play"组成的列表.
2.play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。
3.Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
4.playbook文件是采用YAML语言编写的
创建一个目录名称为 playbook
# playbook语法检查
ansible-playbook --syntax-check auto_deploy_code.yml
# 会尝试运行,然后进行语法检查
ansible-playbook -C auto_deploy_code.yml
# 执行playbook
ansible-playbook auto_deploy_code.yml
使用ansible-playbook运行playbook文件,输出的内容为JSON格式。并且由不同颜色组成,便于识别。一般而言,输出内容中,每个颜色表示的含义如下。
1.绿色代表执行成功,但系统保持原样。
2.黄色代表系统状态发生改变,也就是执行的操作生效。
3.红色代表执行失败,会显示错误信息。
- hosts: all
tasks:
- name: Ensure connectivity
ping:
执行结果:
---
- hosts: all
remote_user: root
tasks:
- name: "Creates directory"
file:
path: /home/work
state: directory
- name: "mkdir file"
file:
path: /home/work/log.txt
state: touch
- name: "copy file"
command: cp /home/work/log.txt /home
yaml不能使用tab键进行缩进。
---
- hosts: all
remote_user: root
tasks:
- name: "安装Apache"
yum: name=httpd yum模块:安装httpd
- name: "复制配置文件"
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/ copy模块: 拷贝文件
- name: "复制配置文件"
copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
- name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes service模块: 启动服务
# 编写安装httpd 开启httpd服务,并且关闭防火墙,和写一个httpd网页
- hosts: 47.100.34.199
remote_user: root
vars:
- user:
tasks:
# 关闭防火墙
- name: stop firewalld
service: name=firewalld state=stopped
# 安装 httpd
- name: install httpd
yum: name=httpd
# 启动 httpd- hosts: control-node
remote_user: root
vars:
- pkg: httpd
tasks:
- name: "install httpd package."
yum: name={{ pkg }} state=installed
- name: "copy httpd configure file to remote host."
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: "boot httpd service."
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
- name: start httpd
service: name=httpd state=started
# 创建 index 文件, 修改页面显示内容
- name: touch index
copy: content="this is httpd test, SUCCESS!!" dest=/var/www/html/index.html
访问地址:
47.100.34.199
在需要被监控的任务(tasks)中定义一个notify,只有当这个任务被执行时,才会触发notify对应的handlers去执行相应操作。
- hosts: control-node
remote_user: root
vars:
- pkg: httpd
tasks:
- name: "install httpd package."
yum: name={{ pkg }} state=installed
- name: "copy httpd configure file to remote host."
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: "boot httpd service."
service: name=httpd state=started
# 在需要被监控的任务(tasks)中定义一个notify,只有当这个任务被执行时,才会触发notify对应的handlers去执行相应操作。
handlers:
- name: restart httpd
service: name=httpd state=restarted
在使用handlers的过程中,有以下几点需要注意:
- handlers只有在其所在的任务被执行时,都会被运行;
- handlers只会在Play的末尾运行一次;如果想在一个Playbook的中间运行handlers,则需要使用meta模块来实现,例如:
- meta: flush_handlers
。- 如果一个Play在运行到调用handlers的语句之前失败了,那么这个handlers将不会被执行。我们可以使用mega模块的
--force-handlers
选项来强制执行handlers,即使在handlers所在Play中途运行失败也能执行。
tags用于让用户选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。
ansible的标签(Tags)功能可以给角色(Roles)、文件、单独的任务,甚至整个Playbook打上标签,然后利用这些标签来指定要运行Playbook中的个别任务,或不执行指定的任务.
ansible-playbook yaml/httpd.yaml --tags start_httpd
- hosts: windows
tasks:
- name: Ensure connectivity
win_ping:
- name: test win_file module
hosts: windows
tasks:
- name: Create directory structure
ansible.windows.win_file:
path: C:\Temp\folder\subfolder
state: directory
- name: Update burner version
hosts: windows
vars:
- burner_version: HiTrend_Flash_Programmer_int_v2.72.exe
tasks:
- name: Delete old burner
win_file:
path: D:\Jenkins\HFP.exe
state: absent
- name: Copy new burner
win_copy:
src: /home/user/work/ansible/burner/{{burner_version}}
dest: D:\Jenkins\HFP.exe
# 主要功能:实现自动化部署python代码的playbook
- name: Auto ansible code
# WEB code information of Automation Department
hosts: windows
vars:
- user_name: ywwei
- password: w6253108310
- repo_url: 192.168.91.237:8929/test/python.git
- temporary_directory: D:\Jenkins\python
- project_name: HPLC点对点-弱电板
- release_version: 稳定版
tasks:
# clone remote repo
- name: clone gitlab
win_command: "git clone http://{{user_name}}:{{password}}@{{repo_url}} {{temporary_directory}}"
# set public dir
- name: Set the owner of root directory
win_owner:
path: "{{temporary_directory}}"
user: Users
recurse: no
# Replace profile information
- name: Replace config dir
win_shell: Copy-Item
-Path "D:\Jenkins\project\{{project_name}}\{{release_version}}\python\RegressionTest\config"
-Destination "{{temporary_directory}}\RegressionTest" -Recurse -Force
# Delete old code version
- name: Delete old code version
win_file:
path: D:\Jenkins\project\{{project_name}}\{{release_version}}\python
state: absent
when: result|succeeded
# Replace profile information
- name: del directory structure
win_shell: Move-Item
-Path {{temporary_directory}}
-Destination D:\Jenkins\project\{{project_name}}\{{release_version}} -Force
# Delete temporary directory
- name: del directory structure
win_file:
path: "{{temporary_directory}}"
state: absent
when: result|succeeded
获取ansible tower的安装包以及解压
(正常下载可能出现网速问题等等不好用,可以直接用下载软件下载到本地,然后放到虚拟机中)
下载好的安装包 : 链接:https://www.aliyundrive.com/s/PJGPaPY3QCa 版本:ansible-tower-setup-3.8.4-1
# 安装一些相关的软件
yum -y install vim curl postgresql
# 创建下载目录
mkdir /tmp/tower && cd /tmp/tower
# 下载安装包 目前的我下载的是 ansible-tower-setup-3.8.4-1,破解方法只在当前版本试过
curl -k -O https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz
# 下载版本3.2.6 :目前没有尝试破解,只记录下载版本信息
wget https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-3.2.6-1.el7.tar.gz
# 解压
tar xvf ansible-tower-setup-latest.tar.gz
# 进入到安装目录
cd ansible-tower-setup*/
# 这个是密码,可以自己设定,我这里是123456
sed -i "s#password=''#password='123456'#g" inventory
# 这里就是127.0.0.1,不写这个的话还会报错
sed -i "s#host=''#host='127.0.0.1'#g" inventory
sed -i "s#port=''#port='5432'#g" inventory
# 添加tower的日志目录否则报错
mkdir -p /var/log/tower
# 在解压后的文件夹中,运行安装命令
./setup.sh
# 开始正常安装,安装时间比较长,如果网络较快,速度会相对快点
参考地址:Ansible Tower 3.8.3 破解 - 玩脱了的奶鱼 (milkfish.site)
前提:页面可以正常打开,没有任何报错。
该文件位于:
/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/utils/licensing.py
该文件内的方法是负责License验证的核心,将其用你熟悉的编辑器打开
找到validate方法,该方法就负责License的验证,在我这其位于该文件的409行。行数可能随着版本的升级或修改不一定准确,以方法名为主。
该方法原文如下:
def validate(self):
# Return license attributes with additional validation info.
attrs = copy.deepcopy(self._attrs)
type = attrs.get('license_type', 'none')
if (type == 'UNLICENSED' or False):
attrs.update(dict(valid_key=False, compliant=False))
return attrs
attrs['valid_key'] = True
if Host:
current_instances = Host.objects.active_count()
else:
current_instances = 0
available_instances = int(attrs.get('instance_count', None) or 0)
attrs['current_instances'] = current_instances
attrs['available_instances'] = available_instances
free_instances = (available_instances - current_instances)
attrs['free_instances'] = max(0, free_instances)
license_date = int(attrs.get('license_date', 0) or 0)
current_date = int(time.time())
time_remaining = license_date - current_date
attrs['time_remaining'] = time_remaining
if attrs.setdefault('trial', False):
attrs['grace_period_remaining'] = time_remaining
else:
attrs['grace_period_remaining'] = (license_date + 2592000) - current_date
attrs['compliant'] = bool(time_remaining > 0 and free_instances >= 0)
attrs['date_warning'] = bool(time_remaining < self.SUBSCRIPTION_TIMEOUT)
attrs['date_expired'] = bool(time_remaining <= 0)
return attrs
将其改成这个样子即可:
def validate(self):
# Return license attributes with additional validation info.
attrs = copy.deepcopy(self._attrs)
attrs['license_type'] = 'enterprise' # 设置License类型为企业版
attrs['instance_count'] = MAX_INSTANCES # 设置Host数量为MAX_INSTANCES,即9999999。扛不住就改成自己需要的数。
attrs['license_date'] = '2567433600' # 设置License过期日期为”2051-05-12 00:00:00“,Unix时间戳,有需要自己改
attrs['subscription_name'] = 'mxd' # 你猜
type = attrs.get('license_type', 'none')
# 注释掉下面的判断
#if (type == 'UNLICENSED' or False):
#attrs.update(dict(valid_key=False, compliant=False))
#return attrs
attrs['valid_key'] = True # 直接将 valid_key 设为 true
if Host:
current_instances = Host.objects.active_count()
else:
current_instances = 0
available_instances = int(attrs.get('instance_count', None) or 0)
attrs['current_instances'] = current_instances
attrs['available_instances'] = available_instances
free_instances = (available_instances - current_instances)
attrs['free_instances'] = max(0, free_instances)
license_date = int(attrs.get('license_date', 0) or 0)
current_date = int(time.time())
time_remaining = license_date - current_date
attrs['time_remaining'] = time_remaining
if attrs.setdefault('trial', False):
attrs['grace_period_remaining'] = time_remaining
else:
attrs['grace_period_remaining'] = (license_date + 2592000) - current_date
attrs['compliant'] = bool(time_remaining > 0 and free_instances >= 0)
attrs['date_warning'] = bool(time_remaining < self.SUBSCRIPTION_TIMEOUT)
attrs['date_expired'] = bool(time_remaining <= 0)
return attrs
# 运行”ansible-tower-service restart”重启服务
ansible-tower-service restart
地址:Ansible Tower | DASHBOARD
用户名:admin
密码:123456
项目是通过gitee进行同步代码仓库。
创建项目
覆盖:在变量更新的时候会进行变量更新
更新项目更新:就是在项目进行更新的时候,使用新的变量
执行结果:
目前的Linux服务器可以进行连接,但是window服务器连接不上,符合预期。
运行work folw
有网络的情况下安装命令: pip install pywinrm
下载第三方库,网址为: https://pypi.org/
离线安装的第三方库有:
pywinrm-0.4.2
ntlm-auth-1.5.0.tar.gz \ ntlm_auth-1.0.1-py2.py3-none-any.whl (建议使用)
requests_ntlm-1.1.0.tar.gz
xmltodict-0.12.0-py2.py3-none-any.whl
安装第三方库时候出现的坑:
1.Error in ntlm-auth setup command: Invalid environment marker: python_versions"2.7"
解决方案:
使用下载的 ntlm_auth-1.0.1-py2.py3-none-any.whl 方式进行安装,这是因为我使用的是ntlm_auth-1.0.1-py2.py3-none-any.whl安装方式进行安装的。使用另外一种方式安装后,成功。
2.but you’ ll have requests 2.6.0 which is incompatible
在安装的过程中出现这些提示信息,需要使用相应的安装包版本进行安装,版本太低或者太高都不行。
3.Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError (' spip._vendor. ur11ib3. connection. HTTPSConnection object at 0x7f024a55c590x: Failed to establish a new connection: [ Errno 101] Network is unreachable',)': /simple/six/E
这个原因是因为在内网进行的安装,不能够连接到外部网络,所以会出现这个错误,所以可以进行使用 ntlm-auth-1.5.0.tar.gz 的方式安装第三方库,然后进行查看具体的信息,需要依赖于其他的什么的第三方库。
4.提示信息:不能找到相应的文件目录
尝试使用以下命令进行设置:
添加相应的 --target 信息
Error: 由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行。 将网络连接类型更改为域或专用,然后再次尝试。
打开以太网设置后
将网络设置为专用后就可以了,重新执行相关命令。
1.“msg”: “plaintext: the specified credentials were rejected by the server”,
# 编辑主机的配置文件,添加以下字段
ansible_winrm_transport=ntlm
2.'msg‘: "ssl: the specified credentials were rejected by the server"
这个是因为在主机清单中缺少 ansible_ssh_port=5985 ,请仔细检查主机清单中的配置信息
3.连接超时
这个可能用户名或者密码写错了。
在cmd中运行的命令,并不能保证在powershell中可以运行。
出现的Error:139.198.167.214 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host’s fingerprint to your known_hosts file to manage this host."
}
# 仅需开启ansible中的 host_key_checking = False
[root@m01 ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False