我有一个简单的剧本,比如波纹管,它由几个任务组成。在剧本之上,我正在从提供的 CSV 文件创建 YAML 文件,但如果我想在任务中定义一个变量,则不会在另一个任务中定义此变量。那么什么是 Ansible 变量的可见性或/和范围?我知道如果我在主机部分中定义变量,该变量将保留在所有任务中,但是由于我将动态定义变量,因此这不是一个好方法。
- name: Create IAM users
vars:
password: Sometestpassword123
iam:
iam_type: user
name: "{{ item.username }}"
password: "{{ password }}"
access_key_state: create
state: present
groups: "{{ item.group }}"
with_items:
- "{{ users.users }}"
register: user
- name: Create a file with user credentials
local_action: template src=template.j2 dest=./users_credentials.csv
因此,如果我在任务中定义密码,则此变量用作模块参数,但我无法在第二个任务中重用此变量,我想将注册变量中的第一个任务过滤输出与定义的变量连接起来,该变量将在循环的每次迭代中动态更改。
TASK [Create a file with user credentials] *********************************************************************************************************************************************************************
fatal: [localhost -> localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'password' is undefined"}
基本上,我想创建CSV文件,该文件由保存在注册变量"user"中的过滤iam模块返回值和"密码"变量的动态计算值组成。
遗憾的是,AWS IAM 模块不会返回密码。
模板非常简单,出于测试目的,我只需要任务中定义的"密码"值的值。来了。
{{ password }}
总结@imjoseangel提供的答案。 您可以使用set_fact定义变量,后续重头戏可以访问该变量。
示例片段:
---
- name : Test set_fact Variable
hosts : localhost
tasks:
- name : Set Password Variable
set_fact:
password : 'Abcd123'
- name : Copy Template
template :
src : template.j2
dest : ./template.csv
-
---
- name : Test set_fact Variable
hosts : localhost
tasks:
- name : Set Password Variable
set_fact:
password : 'Abcd123'
- name : Apply set_fact Variable
hosts : localhost
tasks:
- name : Copy Template
template :
src : template.j2
dest : ./template.csv