具有 include_role 的 delegate_to 组在本地机器上运行命令?

时间:2021-01-11 22:05:33

标签: ansible

我正在尝试调试我编写的剧本,该剧本使用几个角色来启动并配置 AWS 实例。

基本结构是一个剧本 (new-server.yml) 导入两个角色 - roles/ec2_instanceroles/start_env。 ec2_instance 角色应该使用我的 AWS 令牌在 localhost 上运行,然后 start_env 角色在由第一个角色生成的服务器上运行。

我的剧本 new-server.yml 是这样开始的:

- name: provision new instance
  include_role:
    name: ec2_instance
    public: yes
  vars:
    instance_name: "{{ item.host_name }}"
    env: "{{ item.git_branch }}"
    env_type: "{{ item.env_type }}"
  loop:
    - { host_name: 'prod', git_branch: 'master', env_type: 'prod' }
    - { host_name: 'test', git_branch: 'test', env_type: 'devel'}

此角色构建一个 ec2 实例,更新路由 53,使用 add_host 将主机添加到 just_created 组中的内存清单。

接下来,我在 new_server.yml 剧本中有这个。我的两个 IP 都显示在这里就好了。我的本地主机没有显示在这里。

- name: debug just_created group
  debug: msg="{{ groups['just_created'] }}"

最后,再次在 new_server.yml 中,我尝试进行最后一英里配置并在新实例上启动我的应用程序:

- name: Configure and start environment on new instance
  include_role:
    name: start_env
    apply:
      become: yes
      delegate_to: "{{ item }}"
  with_items:
    - "{{ groups['just_created'] }}"

但是,任务似乎没有正确委派,因为我在 roles/start_env/main.yml 中有此任务:

- name: debug hostname
  debug: msg="{{ ansible_hostname }}"

我在输出中看到的是

TASK [start_env : debug hostname]   ************************************************************************************************************************************
Monday 11 January 2021  12:00:05 -0800 (0:00:00.111)       0:00:37.374 ********
ok: [localhost -> 10.20.15.225] => {
    "msg": "My-Local-MBP"
}

TASK [start_env : debug hostname]     ************************************************************************************************************************************
Monday 11 January 2021  12:00:05 -0800 (0:00:00.043)       0:00:37.417 ********
ok: [localhost -> 10.20.31.35] => {
    "msg": "My-Local-MBP"
}

今天早上我已经阅读了很多关于 delegate_to、include_role 和循环的内容。当您想要组合这些东西时,听起来 Ansible 使事情变得非常复杂,但似乎我试图调用这些东西的方式应该是正确的。知道我做错了什么(或者是否有更聪明的方法来做到这一点?我找到了 this,虽然它是一个聪明的解决方法,但它不太适合我所看到的,我想要避免在我的角色中创建另一个任务文件。这不完全是我想要的管理方式。我一直在使用的大部分信息都是这个线程https://github.com/ansible/ansible/issues/35398

1 个答案:

答案 0 :(得分:0)

我猜这是一个已知问题...输出显示 [localhost -> 10.20.31.35] 表示它正在从 localhost 委托给 10.20.31.35,但这仅适用于连接。任务定义中完成的任何模板都使用循环中主机的值,即 localhost

我用自己的方式想出了一些办法,让我可以保持我已经写过的东西不变。我修改了我的 add_host 任务以使用 instance_name var 作为主机名,使用 ec2 IP 作为 ansible_host 实例 var,然后将我的最后一个任务更新为

角色/aws.yml:

- name: Add new instance to inventory
  add_host:
    hostname: "{{ instance_name }}"
    ansible_host: "{{ ec2_private_ip }}"
    ansible_user: centos
    ansible_ssh_private_key_file: ../keys/my-key.pem
    groups: just_created

new_servers.yml:

tasks:

- name: provision new instance
  include_role:
    name: ec2_instance
    public: yes
  vars:
    instance_name: "{{ item.host_name }}"
    env: "{{ item.git_branch }}"
    env_type: "{{ item.env_type }}"
  loop:
    - { host_name: 'prod', git_branch: 'master', env_type: 'prod' }
    - { host_name: 'test', git_branch: 'test', env_type: 'devel'}
- name: Configure and start environment on new instance
  include_role:
    name: start_env
    apply:
      become: yes
      delegate_to: "{{ item }}"
  vars:
    instance_name: "{{ item }}"
  with_items:
    - "{{ groups['just_created'] }}"

不漂亮,但它运行得足够好,让我避免在后续包含的角色中重复代码。