cat位于Ansible中文件目录中的文件
这是我的角色结构:cat位于Ansible中文件目录中的文件,ansible,Ansible,这是我的角色结构: $ tree my_role . ├── my_role │ ├── defaults │ │ └── main.yml │ ├── files │ │ └── foo.conf │ ├── handlers │ │ └── main.yml │ ├── meta │ │ └── main.yml │ ├── README.md │ ├── tasks │ │ └── main.yml │ ├── templ
$ tree my_role
.
├── my_role
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ │ └── foo.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── playbook.yml
我想对tasks/main.yml中files文件夹中的foo.conf文件进行分类
我试图通过提供相关路径直接在tasks.yml中使用,但它表示找不到该文件。我猜您可以相对于
角色路径访问该文件,例如
$ echo hello > my_role/files/foo.conf
$ cat my_role/tasks/main.yml
---
- command:
cmd: cat "{{ role_path }}/files/foo.conf"
register: x
# This will never change anything on target.
changed_when: false
# This is safe to run also in --check mode to still have register available
check_mode: false
- debug:
var: x['stdout']
$ cat myplaybook.yml
---
- name: Playbook which includes the role
hosts: localhost
roles:
- my_role
$ ansible-playbook myplaybook.yml
PLAY [Playbook which includes the role] **************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [localhost]
TASK [my_role : command] *****************************************************************************************
ok: [localhost]
TASK [my_role : debug] *******************************************************************************************
ok: [localhost] => {
"x['stdout']": "hello"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我想您可以相对于角色路径
访问该文件,例如
$ echo hello > my_role/files/foo.conf
$ cat my_role/tasks/main.yml
---
- command:
cmd: cat "{{ role_path }}/files/foo.conf"
register: x
# This will never change anything on target.
changed_when: false
# This is safe to run also in --check mode to still have register available
check_mode: false
- debug:
var: x['stdout']
$ cat myplaybook.yml
---
- name: Playbook which includes the role
hosts: localhost
roles:
- my_role
$ ansible-playbook myplaybook.yml
PLAY [Playbook which includes the role] **************************************************************************
TASK [Gathering Facts] *******************************************************************************************
ok: [localhost]
TASK [my_role : command] *****************************************************************************************
ok: [localhost]
TASK [my_role : debug] *******************************************************************************************
ok: [localhost] => {
"x['stdout']": "hello"
}
PLAY RECAP *******************************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
我几乎可以肯定的是,它可以被重新表述为:
如何获取位于控制器上我的角色的files
文件夹中的文件内容,以便在任何主机上运行的任务中使用它
答案是使用:
-名称:文件查找演示
调试:
msg:“{lookup('file','foo.conf')}”
与shell
任务中的cat
相比,这有许多优点:
- 它提供您直接查找的内容,而无需运行单独的任务、注册结果并在其中获取特定密钥
- 无论目标主机是什么,它都会工作
- 我将处理位于中的任何文件,而无需指定其确切路径,以及定义该任务的任何位置(例如,在playbook direct
tasks
中,如果以前使用过您的角色…)
- 它尊重ansible的良好实践:当已经有一个模块或过滤器为您执行任务并且它是开箱即用的幂等函数时,它不使用
shell
如果我的上述假设是错误的,并且您仍然非常希望运行cat
,(尽管这是一种不好的做法),但只有在您直接从角色和本地主机上运行shell
任务的情况下,才会起作用,因为路径在任何其他远程目标上都不存在
在这种情况下,更好的选择是使用
-名称:管道查找演示
调试:
msg:{{lookup('pipe','cat'~role_path~'/files/foo.conf`)}
尽管这演示了如何轻松获得在控制器上运行的任何命令的结果,但在这种情况下,它与文件查找相比并没有明显的优势。例如,只有在您的角色中定义了任务,而不是从其他角色或剧本任务(因为使用了role\u path
magic变量)中定义了任务时,它才会起作用。我几乎可以肯定,可以将其重新表述为:
如何获取位于控制器上我的角色的files
文件夹中的文件内容,以便在任何主机上运行的任务中使用它
答案是使用:
-名称:文件查找演示
调试:
msg:“{lookup('file','foo.conf')}”
与shell
任务中的cat
相比,这有许多优点:
- 它提供您直接查找的内容,而无需运行单独的任务、注册结果并在其中获取特定密钥
- 无论目标主机是什么,它都会工作
- 我将处理位于中的任何文件,而无需指定其确切路径,以及定义该任务的任何位置(例如,在playbook direct
tasks
中,如果以前使用过您的角色…)
- 它尊重ansible的良好实践:当已经有一个模块或过滤器为您执行任务并且它是开箱即用的幂等函数时,它不使用
shell
如果我的上述假设是错误的,并且您仍然非常希望运行cat
,(尽管这是一种不好的做法),但只有在您直接从角色和本地主机上运行shell
任务的情况下,才会起作用,因为路径在任何其他远程目标上都不存在
在这种情况下,更好的选择是使用
-名称:管道查找演示
调试:
msg:{{lookup('pipe','cat'~role_path~'/files/foo.conf`)}
尽管这演示了如何轻松获得在控制器上运行的任何命令的结果,但在这种情况下,它与文件查找相比并没有明显的优势。例如,仅当任务是在您的角色内定义的,而不是从其他角色或剧本任务(因为使用了role\u path
magic变量)定义的时,它才会工作。您的意思是cat
将文件/foo.conf
文件的内容转换为标准输出吗,没错。你的意思是将cat
文件/foo.conf
文件的内容转换为标准输出吗?是的,没错。