Ansible playbook 根据外部部署文件顺序执行任务

问题描述 投票:0回答:1

我有逻辑描述符文件,其内容是这样的

UI|create_dir|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0
UI|create_dir|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/ttt
UI|create_dir|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/Application
UI|create_dir|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/ServicesManager
UI|Copy|configuration_47.0.0.xml|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/Application/
Batch|Copy,Execute|sqlFile.sql|/tmp/aml_work/
UI|Copy|services_47.0.0.xml|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/ServicesManager/
UI|Copy|filtering.zip|/opt/aaaHome/sdlc_test/configuration/bbb_UI/47.0.0/ttt
UI|Copy|47.0.0.lst|/opt/aaaHome/sdlc_test/conf/importexport/
UI|Create_file|47.0.0.lst.flag|/opt/aaaHome/sdlc_test/conf/importexport/
UI|Modify|base_config.properties|/opt/aaaHome/sdlc_test/conf|system.authentication=INTERNAL

我需要使用 ansible 逐行顺序执行此文件中提到的操作。以下是读取文件的方法。

  • 第一个分隔符是要执行任务的远程服务器(UI/批处理)的名称。
  • 第二个分隔符是要执行的操作 createDir/copyTheFile/copy&Execute/ModifyTheFile
  • 第三个分隔符是复制位置或要创建的目录名称
  • 第四个分隔符是修改操作时要修改的内容

这是我想到的 ansible 剧本流程

(1) main-playbook.yml

- name: Deployment
  hosts: all
  become: yes
  connection: local
  tasks:
    - name: Read lines from pilot file
      shell: cat logicDescriptor.txt
      register: logic_file_content
    - name: Execute actions based on logic.txt content
      include_tasks: "logic-deployment.yml"
      vars:
        logic_content: "{{ logic_file_content.stdout_lines }}"

(2) 逻辑部署.yml

- name: Execute actions based on logicDescriptor.txt content
  hosts: localhost
  tasks:
    - name: Include specific tasks based on logicDescriptor.txt content
      include_tasks: tasks/{{ item.split('|')[1] }}.yml
      loop: "{{ logic_content }}"
      loop_control:
        loop_var: item

(3)tasks/create_dir.yml、tasks/copy.yml、tasks/create_file.yml 等。 任务/create_dir.yml

- name: Create directory
  hosts: UI
  tasks:
    - name: Create directory
      file:
        path: "{{ item.split('|')[2] }}"
        state: directory
      with_items: "{{ logic_file_content.stdout_lines }}"
      when: "item.split('|')[1] == 'create_dir' and item.split('|')[0] == 'UI'"

任务/create_file.yml

- name: Create file
  hosts: UI
  tasks:
    - name: Create file
      file:
        path: "{{ item.split('|')[3] }}/{{ item.split('|')[2] }}"
        state: touch
      with_items: "{{ logic_file_content.stdout_lines }}"
      when: "item.split('|')[1] == 'Create_file' and item.split('|')[0] == 'UI'"

但是这不起作用。我在第二个 ansible 剧本上遇到错误

logic-deployment.yml

错误!冲突的操作语句:主机、任务`

我已经删除了

name, hosts, tasks
指令并尝试运行,然后我在第三个 ansible playbook
tasks/create_dir.yml
上遇到了相同的错误,但是这里我们需要
hosts
部分,因为我们需要在此特定主机上执行任务。并且在同一个
create_dir.yml
上可能有 2 个任务用于 2 个差异。主机,因此不能将一台主机置于父级别。

如何解决这个问题?

ansible architecture
1个回答
0
投票

您将任务与剧本混淆了,因此从基础开始是有意义的。

如果您想拥有单独的剧本,则必须使用

import_playbook
代替,但它不能在任务级别上使用(因此它不能在循环中使用)。然后你会发现你的
logic_file_content
很难在戏剧之间分享。

老实说,我认为使用这些“逻辑描述符”作为输入是没有意义的,因为它们的格式给你的剧本带来了太多不必要的复杂性,即使对于最简单的操作来说,从头开始编写所有内容似乎会更快。

如果您仍然有充分的理由继续,您可以继续当前的方法,但您必须:

  • 包括任务,而不是剧本;
  • 将目标主机的检查(通过
    ansible_host
    inventory_hostname
    )添加到每个任务的
    when
    条件中。

另外,我建议看一下 ansible 'raw'、'shell' 和 'command' 之间有什么区别?Ansible 中“命令”或特定模块执行之间的区别

© www.soinside.com 2019 - 2024. All rights reserved.