我有一个像波纹管这样简单的剧本,其中包括一些任务。在剧本之上,我从提供的CSV文件创建YAML文件,但是如果我想在任务中定义变量,则此变量不在另一个任务中定义。那么Ansible变量的可见性和/或范围是什么?我知道如果我在hosts部分中定义变量将在所有任务中保持变量,但由于我将动态定义变量,这不是一个好方法。
- 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模块返回值以及动态计算的“password”变量值。
不幸的是,AWS iam模块不会返回密码。
模板非常简单,至于测试目的,我只想要一个任务中定义的'password'值的值。在这里。
{{ password }}
答案 0 :(得分:0)
总结@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