ansible笔记3--playbook windows基础

1 介绍

笔者在前文 ansible笔记2–ansible windows基础 中已经介紹了Windows下的环境配置以及对应的 ansible 基础案例,本文将在其基础上通过 playbook 实现更加复杂的任务。

2 常见案例

  1. 调整 host 配置
    此处在windows中添加了 3 个 ip,因此通过 windows 指定主机的時候,可以同时匹配到这 3 台机器,如果需要同时控制更多机器,直接依次逐行加在这里即可。
[windows]
10.202.21.137
10.202.21.138
10.202.21.139
[windows:vars]
ansible_ssh_user="Administrator"
ansible_ssh_pass="qwer;1234"
ansible_connection="winrm"
ansible_ssh_port=5985
ansible_winrm_server_cert_validation=ignore
  1. 初始化目录 & 更新数据
    此处主要是初始化后续实例的目录,拷贝脚本和可执行程序包(暂时不包括安装运行环境)。
- hosts: windows
serial: 2
gather_facts: False
tasks:
- name: mkdir xg
ansible.windows.win_file:
path: C:\xg
state: directory
- name: copy dmqw files
ansible.windows.win_copy:
src: ./xg/dmqw
dest: C:\xg
- name: copy train_script files
ansible.windows.win_copy:
src: ./xg/train_script
dest: C:\xg

- name: mkdir client_training_01
ansible.windows.win_file:
path: C:\xg\client_training_01
state: directory
- name: cp test-client-1.bat
ansible.windows.win_copy:
src: ./xg/test-client-1.bat
dest: C:\xg\client_training_01\test-client.bat
- name: cp test-training-1.bat
ansible.windows.win_copy:
src: ./xg/test-training-1.bat
dest: C:\xg\client_training_01\test-training.bat
- name: cp dmqw dir
ansible.windows.win_shell: 'xcopy /y /c /h /r /s /d C:\xg\dmqw C:\xg\client_training_01\dmqw\'
- name: cp train_script dir
ansible.windows.win_shell: 'xcopy /y /c /h /r /s /d C:\xg\train_script C:\xg\client_training_01\train_script\'

- name: mkdir client_training_02
ansible.windows.win_file:
path: C:\xg\client_training_02
state: directory
- name: cp test-client-2.bat
ansible.windows.win_copy:
src: ./xg/test-client-2.bat
dest: C:\xg\client_training_02\test-client.bat
- name: cp test-training-2.bat
ansible.windows.win_copy:
src: ./xg/test-training-2.bat
dest: C:\xg\client_training_02\test-training.bat
- name: cp dmqw dir
ansible.windows.win_shell: 'xcopy /y /c /h /r /s /d C:\xg\dmqw C:\xg\client_training_02\dmqw\'
- name: cp train_script dir
ansible.windows.win_shell: 'xcopy /y /c /h /r /s /d C:\xg\train_script C:\xg\client_training_02\train_script\'
# 如果需要更多训练或者操作,按顺序添加到此处即可,实际项目中可能同时跑 10-20 组实例,此处为了減少篇幅只使用了2 组案例
  1. 启动训练任务
    此处启动两组训练任务,每组包括一个基础客戶端和一个 python 训练客戶端;此处为了防止程序被放在后台运行,使用执行定时任务的方式启动一組训练实例,因此需要手动或者通过 ansible 批量新建好对应的服务。
    如果程序可以放在后台执行,则直接执行对应的启动脚本,不需要单独建立相应的定时任务。
- hosts: windows
gather_facts: False
tasks:
- name: start start-client-u13701
ansible.windows.win_shell: 'SCHTASKS /RUN /TN start-client-u13701'
vars:
display: true
- name: sleep 10 seconds
ansible.windows.win_shell: 'Start-Sleep -s 10'
- name: start start-train-u13701
ansible.windows.win_shell: 'SCHTASKS /RUN /TN start-train-u13701'
vars:
display: true

- name: start start-client-u13702
ansible.windows.win_shell: 'SCHTASKS /RUN /TN start-client-u13702'
vars:
display: true
- name: sleep 10 seconds
ansible.windows.win_shell: 'Start-Sleep -s 10'
- name: start start-train-u13702
ansible.windows.win_shell: 'SCHTASKS /RUN /TN start-train-u13702'
vars:
display: true
# 实际中一个机器可能同时起10组或者更多的训练实例,此处为了节省篇幅,只使用了2 组案例;若实际中有需要,那么依次追加在这里即可。
  1. 关闭训练任务
    笔者训练的程序在进程目录中名称为 python.exe 和 client.exe,因此只需要关闭这 2 个相关的所有程序即可。如果有复杂的名称或者特定的退出脚本,则在win_shell 制定调整对应的名称或者执行相应脚本即可。
- hosts: windows
gather_facts: False
tasks:
- name: stop train program
ansible.windows.win_shell: 'taskkill /f /t /im python.exe'
vars:
display: true
- name: sleep 10 seconds
ansible.windows.win_shell: 'Start-Sleep -s 10'
- name: stop client program
ansible.windows.win_shell: 'taskkill /f /t /im client.exe'
vars:
display: true
  1. 初始化运行环境
    初始化运行环境主要包括安裝项目运行的各种程序,配置各项环境变量,此处笔者只测试了一部分,暂未全部测试完成,暂时不贴,后续抽空补上。
    其基本思路就是合理使用​ansible笔记2–ansible windows基础 中的 安裝软件和配置环境变量 2 个操作。

3 注意事项

  1. 由于 ansible 执行的脚本默认会被放在后台执行,因此如果需要將任务放在前台,则可以考虑使用定时任务的方式启动服务(笔者只想到这个方法,若有其它好方法,欢迎在留言区补充)。
    下图是笔者新建的几个定时任务,主要是 start-client 和 start-train,触发该任务的时候会去执行指定的启动脚本:
  2. ansible笔记3--playbook windows基础_playbook

  3. 该图是新建任务的基础选项,此处设置只有处于用戶登录状态才可以执行,而且取消了下面的Hidden 选项(如果开启则会导致服务重启后被丟到后台执行)。
  4. ansible笔记3--playbook windows基础_playbook_02

  5. playbook 中的 serial 可以控制并行的数量,如果需要同时在多个机器执行则调大该值即可。如果是滚动更新的场景,则可以考虑使用 serial 为 1, 从而能避免同时多个节点更新异常的情況。

4 说明

​Ansible.Windows 常见模块​