我正在尝试调试我编写的剧本,该剧本使用几个角色来启动并配置 AWS 实例。
基本结构是一个剧本 (new-server.yml
) 导入两个角色 - roles/ec2_instance
和 roles/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
答案 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'] }}"
不漂亮,但它运行得足够好,让我避免在后续包含的角色中重复代码。