如何在Ansible中的任务之间访问任务变量?

时间:2018-06-18 20:39:25

标签: ansible

我有一个像波纹管这样简单的剧本,其中包括一些任务。在剧本之上,我从提供的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 }}

1 个答案:

答案 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