Add 2 CLI options --list-tasks-json and --list-tasks-with-path

I would like to add a couple of CLI options to “ansible-playbook” to help with some integration:

Reasoning:
For some integration, we would like to have a unique way to identify every task in an ansible playbook, however, the names/action are not guaranteed to be unique across playbooks / files, but by integrating the file name and line number there will be a unique identifier. In addition, with a JSON output it is easier to traverse than a raw string.

Currently there only exists a --list-tasks:

From help menu (ansible-playbook --help):
–list-tasks list all tasks that would be executed

CLI Output:

ansible-playbook --list-tasks playbook.yml

playbook: playbook.yml

play #1 (localhost): This is play 1 TAGS:
tasks:
common : aaa TAGS:
common : bbb TAGS:
common : ccc TAGS:
common : ddd TAGS:
common : eee TAGS:
Set fact upgrade_flow as false TAGS:
debug TAGS:
Set fact upgrade_zones TAGS:

play #2 (localhost): This is play 2 TAGS:

Desired added behavior:

Help Menu:

–list-tasks list all tasks that would be executed
–list-tasks-json list all tasks that would be executed in JSON format
–list-tasks-with-path
list all tasks that would be executed along with its
absolute path and line number

CLI Output:

ansible-playbook --list-tasks-with-path playbook.yml

playbook: playbook.yml

play #1 (localhost): This is play 1 TAGS: PATH: /tmp/ansible/playbooks/playbook.yml:4]
tasks:
common : aaa TAGS: PATH: [/tmp/ansible/playbooks/roles/common/tasks/main.yml:4]
common : bbb TAGS: PATH: [/tmp/ansible/playbooks/roles/common/tasks/main.yml:8]
common : ccc TAGS: PATH: [/tmp/ansible/playbooks/roles/common/tasks/main.yml:14]
common : ddd TAGS: PATH: [/tmp/ansible/playbooks/roles/common/tasks/main.yml:20]
common : eee TAGS: PATH: [/tmp/ansible/playbooks/roles/common/tasks/main.yml:26]
Set fact upgrade_flow as false TAGS: PATH: [/tmp/ansible/playbooks/aws-configure-infra-nodes.yml:15]
debug TAGS: PATH: [/tmp/ansible/playbooks/aws-configure-infra-nodes.yml:20]
Set fact upgrade_zones TAGS: PATH: [/tmp/ansible/playbooks/aws-configure-infra-nodes.yml:22]

play #2 (localhost): This is play 2 TAGS: PATH: [/tmp/ansible/playbooks/playbook.yml:5]

ansible-playbook --list-tasks-json playbook.yml

{
“playbook_dir”: “tmp/ansible/playbooks”,
“plays”: [
{
“tasks”: [
{
“action”: “fail”,
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/roles/common/tasks/main.yml”,
“_line_number”: 4
},
“name”: “aaa”,
“tags”:
},
{
“action”: “set_fact”,
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/roles/common/tasks/main.yml”,
“_line_number”: 8
},
“name”: “bbb”,
“tags”:
},
{
“action”: “set_fact”,
“_ds”: {
“_data_source”: “/tmp/roles/common/tasks/main.yml”,
“_line_number”: 14
},
“name”: “ccc”,
“tags”:
},
{
“action”: “set_fact”,
“_ds”: {
“_data_source”: “/tmp/roles/common/tasks/main.yml”,
“_line_number”: 20
},
“name”: “ddd”,
“tags”:
},
{
“action”: “set_fact”,
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/roles/common/tasks/main.yml”,
“_line_number”: 26
},
“name”: “eee”,
“tags”:
},
{
“action”: “set_fact”,
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/aws-configure-infra-nodes.yml”,
“_line_number”: 15
},
“name”: “Set fact upgrade_flow as false”,
“tags”:
},
{
“action”: “debug”,
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/aws-configure-infra-nodes.yml”,
“_line_number”: 20
},
“name”: “”,
“tags”:
},
{
“action”: “set_fact”,

“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/aws-configure-infra-nodes.yml”,
“_line_number”: 22
},
“name”: “Set fact upgrade_zones”,
“tags”:
}
],
“_ds”: {
“_data_source”: “/tmp/ansible/playbooks/aws-configure-infra-nodes.yml”,
“_line_number”: 4
},
“name”: “This is a master playbook to invoke all the playbooks which configure the infra nodes in aws”,
“tags”:
},
{
“tasks”: [
{


}
]
“_ds”: {
“_data_source”: “/tmp/playbook.ymll”,
“_line_number”: 5
},
“name”: “This is play 2”,
“tags”:
},

“playbook”: “playbook.yml”

}

Good idea, and the same for --list-hosts and --list-tags.

We have some scripts that build a reverse mapping from IP back to playbooks and a catalog of tags per playbook.

Having that output as JSON would make parsing the output much easier.