Ansible 在不同主机上执行每个角色

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

我的目的是在不同的主机中执行每个角色。我正在执行一项在每个主机中下载文件的简单任务。我有一个主机文件,看起来像这样

[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
3个回答
16
投票

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

1
投票

我不确定是否在与剧本中指定的主机不同的主机上执行角色,但您可以在不同的主机上执行任务

举个例子。 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
       

0
投票

我尝试了其他答案建议的方法,但无法让它们发挥作用。 缩进/对齐似乎混淆了 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 个主要角色,分别执行以下操作:

  1. 添加远程主机
  2. 调试该行以确保它仍在上下文中
  3. 在新的远程主机上调用 powershell 脚本

“/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 交互。

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