Ansible

Ansible

文章目录

  • Ansible
    • 1.linux安装ansible
      • 1.1linux在线安装ansible
      • 1.2linux离线安装ansible
        • 1.2.1python安装的第三方库
        • 1.2.2ansible压缩包离线安装
    • 2.主机清单inventory
      • 2.1主机清单内容
      • 2.2主机显示别名
      • 2.3ansible的Host-pattern
      • 2.4ansible执行流程
    • 3.查看文档的命令
      • 3.1查看模块信息
      • 3.2简要查看模块信息
      • 3.3查看所有的模块信息
    • 4.ansible常用模块
      • 4.1linux下常用模块
        • 4.1.1ping模块
        • 4.1.2command模块
        • 4.1.3sheel模块
        • 4.1.4file模块
        • 4.1.5copy模块
        • 4.1.6Fetch模块
        • 4.1.7get_url模块
      • 4.2Windows下常用模块
        • 4.2.1win常用模块url地址
        • 4.2.2win_ping模块
        • 4.2.3win_shell模块
        • 4.2.4win_file模块
          • 4.2.4.1删除文件
          • 4.2.4.2删除目录
          • 4.2.4.3创建文件夹
          • 4.2.4.4复制网络硬盘中的文件
        • 4.2.5win_copy模块
          • 4.2.5.1传输文件到windows
        • 4.2.6win_user模块
          • 4.2.6.1创建用户
        • 4.2.7win_reboot模块
    • 5.配置windows系统
    • 6.Ansible playbook
      • 6.1语法检查
      • 6.2linux playbook
        • 6.2.1基本格式
        • 6.2.2复制文件
        • 6.2.3playbook复制文件
        • 6.2.4httpd服务
        • 6.2.5Hander
        • 6.2.6tags
      • 6.3windows playbook
        • 6.3.1win_ping palybook
        • 6.3.2创建一个文件
        • 6.3.3更新烧写器版本
        • 6.3.4部署代码
    • 7.Ansible Tower \ AWX
      • 7.1安装Ansible Tower
        • 7.1.1下载压缩包
        • 7.1.2修改配置文件
        • 7.1.3安装
        • 7.1.4破解Ansible Tower
      • 7.2使用Ansible Tower
        • 7.2.1项目介绍
        • 7.2.2创建清单
        • 7.2.3创建模板
          • 7.2.3.1作业模板
          • 7.2.3.2工作流模板
    • 8.踩坑记录
      • 8.1离线安装python winrm模块
      • 8.2以太网设置
      • 8.3连接不上被管理机器
      • 8.4在cmd中可以运行windos命令,而playbook报错
      • 8.5ping的ssh key Error

简单介绍

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

Ansible_第1张图片

1.linux安装ansible

1.1linux在线安装ansible

# 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

1.2linux离线安装ansible

1.2.1python安装的第三方库

参考博客: ansible离线安装

当前的python环境版本为2.7.5

image-20211026183755052

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

相关的版本信息如下:

image-20211026185318597

image-20211026185236829

image-20211026185352548

image-20211026185423940

1.2.2ansible压缩包离线安装

链接: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的版本信息:

image-20211026185651783

另外一种ansible的安装方式时使用 包装好 一个yum源进行安装,未尝试。

2.主机清单inventory

2.1主机清单内容

Inventory 主机清单

  1. ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
  2. 默认的inventory file为 /etc/ansible/hosts
  3. 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

主机清单内容如下:
image-20211103102642946

2.2主机显示别名

# 设置被管理的机器
[servers]    # aliyun组
aliyun ansible_ssh_host=139.198.167.214 ansible_connection=ssh ansible_user=root ansible_password=xxxxx

Ansible_第2张图片

2.3ansible的Host-pattern

用于匹配被控制的主机的列表
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

2.4ansible执行流程

Ansible_第3张图片

3.查看文档的命令

ansible-doc --help

3.1查看模块信息

image-20211105102603746

# 查看ping模块
ansible-doc ping
# 查询git模块信息
ansible-doc git 
# 查询不存在模块简要信息 
ansible-doc -s win_git

Ansible_第4张图片

3.2简要查看模块信息

# 简要查看模块信息
ansible-doc -s ping

image-20211103094256495

3.3查看所有的模块信息

# 查看所有的模块信息
ansible-doc -l

4.ansible常用模块

4.1linux下常用模块

常用github:geerlingguy/ansible-for-devops: Ansible for DevOps examples. (github.com)

中文网站: 快速学习视频 — 国内最专业的Ansible中文官方学习手册

常用模块官网:Ansible.Builtin — Ansible Documentation

4.1.1ping模块

# 探测是否能够连接远程主机, 检查是否可以连通
ansible all -m ping

Ansible_第5张图片

4.1.2command模块

功能:在远程主机执行命令,此为默认模块,可忽略-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就可以删除文件。

4.1.3sheel模块

ansible all -m shell -a "ps -ef |grep httpd"

4.1.4file模块

# 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

4.1.5copy模块

功能:从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
}

4.1.6Fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

范例:

ansible all -m fetch -a 'src=/srv/fect_file dest=/data/os'

Ansible_第6张图片

4.1.7get_url模块

功能:用于将文件或软件从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/"

Ansible_第7张图片

4.2Windows下常用模块

4.2.1win常用模块url地址

windows支持:Windows Support — 国内最专业的Ansible中文官方学习手册

ansible-windows模块介绍:

Windows modules — Ansible Documentation

github示例网址:

https://github.com/ansible-collections/ansible.windows

4.2.2win_ping模块

# 判断主机连接是否成功,  查看是否ping通
ansible all -m wisn_ping
# 测试windows组是否连同
ansible windows -m win_ping

# 这样是不能够执行的
ansible windows -m ansible.windows.win_ping

连接成功:

Ansible_第8张图片

如果不能够连通,请检查,或者请查看我的踩坑记录是否有踩过坑。

4.2.3win_shell模块

Copy-Item (Microsoft.PowerShell.Management) - PowerShell | Microsoft Docs

# 远程执行cmd 命令
ansible windows  -m win_shell -a 'ipconfig'

目前我的桌面上存在两个文件夹,A文件夹下面存放了 demo.txt 文件:

image-20211028122927277

# 复制文件
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'

4.2.4win_file模块

4.2.4.1删除文件
# 删除文件
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'

image-20211103103432155

4.2.4.2删除目录
# 删除目录
ansible windows -m win_file -a 'dest=c:\test state=absent'
4.2.4.3创建文件夹
# 创建文件夹
ansible windows -m win_file -a 'dest=C:/test state=directory'
4.2.4.4复制网络硬盘中的文件
# -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'
image-20211103152341777

尝试四:使用ansible 复制网络磁盘文件到本地磁盘

# 尝试使用
ansible windows -m win_shell -a 'Copy-Item -path "\\192.168.91.241\amr\User\ywwei\ansible\*" -Destination "D:\Users\ywwei\Desktop" -Recurse'

image-20211103152612505

发现没有文件,但是显示成功!!

4.2.5win_copy模块

4.2.5.1传输文件到windows
# 传输文件到windows
ansible windows -m win_copy -a 'src=/etc/hosts dest=c:\test\hosts.txt'

4.2.6win_user模块

4.2.6.1创建用户
# 创建用户
ansible 192.168.11.149 -m win_user -a "name=user1 passwd=123456"

4.2.7win_reboot模块

# 重启 
ansible windows  -m win_reboot
# 也可以使用powersheel命令进行重启操作
ansible windows  -m win_shell -a 'shutdown -r -t 0'

5.配置windows系统

参考: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
Ansible_第9张图片

所以我的版本不需要更新。

下面是更新版本信息命令。

#更新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
Ansible_第10张图片

6.Ansible playbook

简单介绍:

Ansible_第11张图片

1.playbook剧本是由一个或多个"play"组成的列表.

2.play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。

3.Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

4.playbook文件是采用YAML语言编写的

6.1语法检查

创建一个目录名称为 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.红色代表执行失败,会显示错误信息。

6.2linux playbook

6.2.1基本格式

- hosts: all
  tasks:
    - name: Ensure connectivity
      ping:

执行结果:

Ansible_第12张图片

6.2.2复制文件

---
- 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

image-20211024202504795

yaml不能使用tab键进行缩进。

6.2.3playbook复制文件

---
- 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模块: 启动服务 

6.2.4httpd服务

# 编写安装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

6.2.5Hander

在需要被监控的任务(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的过程中,有以下几点需要注意:

  1. handlers只有在其所在的任务被执行时,都会被运行;
  2. handlers只会在Play的末尾运行一次;如果想在一个Playbook的中间运行handlers,则需要使用meta模块来实现,例如:- meta: flush_handlers
  3. 如果一个Play在运行到调用handlers的语句之前失败了,那么这个handlers将不会被执行。我们可以使用mega模块的--force-handlers选项来强制执行handlers,即使在handlers所在Play中途运行失败也能执行。

6.2.6tags

tags用于让用户选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

ansible的标签(Tags)功能可以给角色(Roles)、文件、单独的任务,甚至整个Playbook打上标签,然后利用这些标签来指定要运行Playbook中的个别任务,或不执行指定的任务.

ansible-playbook yaml/httpd.yaml --tags start_httpd

6.3windows playbook

6.3.1win_ping palybook

- hosts: windows
  tasks:
    - name: Ensure connectivity
      win_ping:

6.3.2创建一个文件

- name: test win_file module
  hosts: windows
  tasks:
    - name: Create directory structure
      ansible.windows.win_file:
        path: C:\Temp\folder\subfolder
        state: directory

6.3.3更新烧写器版本

- 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

6.3.4部署代码

# 主要功能:实现自动化部署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

7.Ansible Tower \ AWX

7.1安装Ansible Tower

7.1.1下载压缩包

获取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*/ 

7.1.2修改配置文件

# 这个是密码,可以自己设定,我这里是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

7.1.3安装

# 添加tower的日志目录否则报错
 mkdir -p /var/log/tower
# 在解压后的文件夹中,运行安装命令
./setup.sh
# 开始正常安装,安装时间比较长,如果网络较快,速度会相对快点

7.1.4破解Ansible Tower

参考地址: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

7.2使用Ansible Tower

地址:Ansible Tower | DASHBOARD

用户名:admin
密码:123456

Ansible_第13张图片

7.2.1项目介绍

项目是通过gitee进行同步代码仓库。

创建项目

Ansible_第14张图片

Ansible_第15张图片

覆盖:在变量更新的时候会进行变量更新

更新项目更新:就是在项目进行更新的时候,使用新的变量

7.2.2创建清单

Ansible_第16张图片

Ansible_第17张图片

7.2.3创建模板

7.2.3.1作业模板

Ansible_第18张图片

执行结果:

目前的Linux服务器可以进行连接,但是window服务器连接不上,符合预期。

Ansible_第19张图片

7.2.3.2工作流模板

Ansible_第20张图片

Ansible_第21张图片

运行work folw

image-20211103185653739

8.踩坑记录

8.1离线安装python winrm模块

有网络的情况下安装命令: 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"

image-20211026181917740

解决方案:

使用下载的 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

image-20211026183300994

在安装的过程中出现这些提示信息,需要使用相应的安装包版本进行安装,版本太低或者太高都不行。

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 信息

image-20211026184823265

8.2以太网设置

Error: 由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行。 将网络连接类型更改为域或专用,然后再次尝试。

image-20211026141951983

打开以太网设置后

Ansible_第22张图片

将网络设置为专用后就可以了,重新执行相关命令。

Ansible_第23张图片

8.3连接不上被管理机器

1.“msg”: “plaintext: the specified credentials were rejected by the server”,

Ansible_第24张图片

# 编辑主机的配置文件,添加以下字段
ansible_winrm_transport=ntlm

2.'msg‘: "ssl: the specified credentials were rejected by the server"

Ansible_第25张图片

这个是因为在主机清单中缺少 ansible_ssh_port=5985 ,请仔细检查主机清单中的配置信息

3.连接超时

Ansible_第26张图片

这个可能用户名或者密码写错了。

8.4在cmd中可以运行windos命令,而playbook报错

在cmd中运行的命令,并不能保证在powershell中可以运行。

Ansible_第27张图片

image-20211028151646039

8.5ping的ssh key Error

出现的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."
}

image-20211023181321619

# 仅需开启ansible中的 host_key_checking = False
[root@m01 ~]# vim /etc/ansible/ansible.cfg 
host_key_checking = False

你可能感兴趣的:(运维工具,linux,运维,centos)