我的目的是在不同的主机中执行每个角色。我正在执行一项在每个主机中下载文件的简单任务。我有一个主机文件,看起来像这样
[groupa]
10.0.1.20
[groupb]
10.0.1.21
下面是我的 main_file.yml 文件
---
- hosts: local
connection: local
gather_facts: no
roles:
- oracle
- apache
我的角色结构
main_file.yml
roles
|-- oracle
| |-- tasks
| |-- main.yml
| |-- download_file.yml
|-- apache
| |-- tasks
| |-- main.yml
| |-- download_file.yml
oracle/main.yml
---
- name: downloading a file in groupa
hosts: groupa
tasks:
- include: tasks/download_file.yml
oracle/download_file.yml
---
- name: download file
shell: wget http://dummyurl.com/random.sh
对于 Apache 角色,除了“groupb”之外,遵循相同的步骤。但是当我执行 main_file.yml 时,我收到以下错误
ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.
The error appears to have been in '/etc/ansible/roles/oracle/tasks/main.yml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
---
- name: downloading a file
^ here
ansible中有两个级别,一个是playbook级别,另一个是task级别。在剧本级别上,您可以指定要在哪些主机上运行任务,但在任务级别下,这不再可能,因为主机已经指定。角色包含在任务级别,因此您不能在其中包含主机声明。
您应该从 main.yml 中删除主机,并且只包含以下内容:
---
- name: downloading a file in groupa
include: download_file.yml
由于角色基本上是特定主机的模板,因此如果您希望它们在特定主机上运行,只需将它们相应地包含在您的剧本中即可。例如,在您的
main_file.yml
中,您可以编写以下内容:
---
- hosts: groupa
roles:
- oracle
- hosts: groupb
roles:
- apache
- hosts: local
connection: local
tasks:
- { debug: { msg: "Tasks to run locally" } }
我不确定是否在与剧本中指定的主机不同的主机上执行角色,但您可以在不同的主机上执行任务
举个例子。 playbook 指定在 app_servers 组主机上执行任务。 但是里面的任务在 db_servers 组上执行
- name: play 1
hosts: app_servers
tasks:
- name: task 1
mysql_db:
name: rails
state: present
delegate_to: db_servers
我尝试了其他答案建议的方法,但无法让它们发挥作用。 缩进/对齐似乎混淆了 VS Code 编辑器以及运行时评估。
我的问题类似:对于运行剧本的许多主机的清单,在不在清单中的主机上运行角色。 这是我如何让它发挥作用的。
该场景是将值填充为带有分隔符的一行文本,然后将该字符串传递给 powershell 脚本以将该行写入 Windows 共享上的文件。 它需要忽略当前 ansible_host 的操作系统。
填充“compiled_text”后调用角色的 Playbook 部分:
- name: call role for writing to file
ansible.builtin.include_role:
name: ../roles/write_text_to_win_share
vars:
any_text: "{{ compiled_text }}"
角色内部有 3 个主要角色,分别执行以下操作:
“/roles/write_text_to_win_share/tasks/main.yml”相关内容:
- name: add host to use in reporting role
ansible.builtin.add_host:
name: <winserver.domain.com>
ansible_user: "{{ custom_credential_username }}"
ansible_password: "{{ custom_credential_password }}"
ansible_port: <SSL port>
ansible_connection: winrm
ansible_winrm_transport: kerberos
ansible_winrm_server_cert_validation: ignore
- name: logit text_to_write
ansible.builtin.debug:
var: any_text
- name: call powershell script, pass text
ansible.windows.win_powershell:
script: >
\infraauto\automation\projects\Patch_Engineering\build_comp_out\Set-AnsiWriteToFile.ps1
-write_file testfileAdam.txt
-write_text "{{ any_text | regex_replace('\"', '') }}"
register: script_output
delegate_to: <winserver.domain.com>
vars:
ansible_become: yes
ansible_become_method: runas
ansible_become_user: "{{ custom_credential_username }}"
ansible_become_password: "{{ custom_credential_password }}"
ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only
当我使用另一种方法创建新的“主机”块时,我遇到了其他问题。 例如,主机变量的上下文发生了变化。 因此,当我运行 add_host 时,我必须将“any_text”变量作为主机变量传递。 通过这个“delegate_to”方法,所有相关的上下文都会被维护,并且当它从角色返回时,不会与当前的 ansible_host 发生混淆。
希望这可以帮助别人。 请随意提供建议,尤其是改进 ansible > windows 交互。