【问题标题】:undefined variable when import_playbook is used使用 import_playbook 时未定义的变量
【发布时间】:2019-04-12 02:20:55
【问题描述】:

这是我的一些基本测试手册

---
- name: get username and password
  import_playbook: credentials.yaml

- name: Run some commands
  hosts:
    - qfx5100-48s
  roles:
    - Juniper.junos
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no

  tasks:
    - name: get uptime
      juniper_junos_command:
        commands:
          - show system uptime
        provider:
          host: "{{ ansible_host }}"
          port: 22
          user: "{{ username }}"
          passwd: "{{ password }}"
      register: uptime

- name: Run some other commands
  hosts:
    - ex3300-48t
  roles:
    - Juniper.junos
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no

  tasks:
    - name: get uptime
      juniper_junos_command:
            commands:
          - show system alarms
        provider:
          host: "{{ ansible_host }}"
          port: 22
          user: "{{ username }}"
          passwd: "{{ password }}"
      register: alarms

    - name: display uptime
      debug:
        var: uptime.stdout_lines

    - name: display alarms
      debug:
        var: alarms.stdout_lines

当我运行这个时,我得到这个错误:

""任务包含一个带有未定义变量的选项。错误是:“密码”未定义\n\n错误似乎出现在“/opt/ansible/commands2.yaml”中:第 15 行第 7 列,但可能\n在文件中的其他位置,具体取决于确切的语法问题.\n\n违规行似乎是:\n\n tasks:\n - name: get uptime\n ^ here\n"}"

credentials.yaml 文件是:

- name: Get username and password
  hosts: localhost
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no
  vars_prompt:
    - name: username
      prompt: Junos Username
      private: no
    - name: password
      prompt: Junos Password
      private: yes

由于有两个播放,我试图避免在每个播放运行时让用户两次提示他们的用户名和密码...

我是 ansible 的新手,很有可能我正在接近这个错误,但希望在这里得到一些指导。

谢谢!

【问题讨论】:

    标签: ansible


    【解决方案1】:

    在游戏的varsvars_promptvars_files 部分中设置的变量仅限于该游戏:它们将在后续游戏中不可用。例如

    ---
    - hosts: localhost
      gather_facts: false
      vars:
        example: foo
    
    - hosts: localhost
      gather_facts: false
    
      tasks:
        - debug:
            var: example|default('<NOT SET>')
    

    将输出:

    TASK [debug] **********************************************************************************************************************************************************************************
    ok: [localhost] => {
        "example|default('<NOT SET>')": "<NOT SET>"
    }
    

    但是,如果您使用该变量在主机上设置了一个事实,那么它将在后续播放中作为主机变量使用。也就是这个:

    ---
    - hosts: localhost
      gather_facts: false
      vars:
        example: foo
    
      tasks:
        - set_fact:
            example: "{{ example }}"
    
    - hosts: localhost
      gather_facts: false
    
      tasks:
        - debug:
            var: example|default('<NOT SET>')
    

    将输出:

    TASK [debug] **********************************************************************************************************************************************************************************
    ok: [localhost] => {
        "example|default('<NOT SET>')": "foo"
    }
    

    在这个例子中,我可以引用{{ example }},因为事实是在localhost 上设置的,第二个游戏也在localhost 上运行。在您的示例中,您在 localhost 上的 credentials.yml 中运行该游戏,但尝试在另一台主机上运行的游戏中使用该值,您需要将其称为:

    {{ hostvars['localhost'].example }}
    

    为了完整起见,您的 credentials.yml 看起来像:

    ---
    - hosts: localhost
      gather_facts: false
      vars_prompt:
        - name: username
          prompt: Junos Username
          private: no
        - name: password
          prompt: Junos Password
          private: yes
    
      tasks:
        - set_fact:
            username: "{{ username }}"
            password: "{{ password }}"
    

    你的playbook.yml 看起来像:

    ---
    - name: get username and password
      import_playbook: credentials.yml
    
    - name: Run some commands
      hosts:
        - qfx5100-48s
      roles:
        - Juniper.junos
      vars:
        ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
      connection: local
      gather_facts: no
    
      tasks:
        - name: get uptime
          juniper_junos_command:
            commands:
              - show system uptime
            provider:
              host: "{{ ansible_host }}"
              port: 22
              user: "{{ hostvars['localhost'].username }}"
              passwd: "{{ hostvars['localhost'].password }}"
          register: uptime
    

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 2016-03-20
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多