我有逻辑描述符文件,其内容是这样的
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 逐行顺序执行此文件中提到的操作。以下是读取文件的方法。
这是我想到的 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 个差异。主机,因此不能将一台主机置于父级别。
如何解决这个问题?
您将任务与剧本混淆了,因此从基础开始是有意义的。
如果您想拥有单独的剧本,则必须使用
import_playbook
代替,但它不能在任务级别上使用(因此它不能在循环中使用)。然后你会发现你的 logic_file_content
很难在戏剧之间分享。
老实说,我认为使用这些“逻辑描述符”作为输入是没有意义的,因为它们的格式给你的剧本带来了太多不必要的复杂性,即使对于最简单的操作来说,从头开始编写所有内容似乎会更快。
如果您仍然有充分的理由继续,您可以继续当前的方法,但您必须:
ansible_host
或inventory_hostname
)添加到每个任务的when
条件中。另外,我建议看一下 ansible 'raw'、'shell' 和 'command' 之间有什么区别? 和 Ansible 中“命令”或特定模块执行之间的区别。