Yaml 变量似乎未在Ansible剧本中定义

Yaml 变量似乎未在Ansible剧本中定义,yaml,ansible,ansible-playbook,ansible-2.x,Yaml,Ansible,Ansible Playbook,Ansible 2.x,以下Ansible playbook用于为Laravel应用程序设置服务器,效果良好: --- - name: Set up a standard Laravel install hosts: localhost vars_prompt: - name: "domain" prompt: "Domain name" private: no - name: "dbname" prompt: "Database name" pr

以下Ansible playbook用于为Laravel应用程序设置服务器,效果良好:

---
- name: Set up a standard Laravel install
  hosts: localhost
  vars_prompt:
    - name: "domain"
      prompt: "Domain name"
      private: no
    - name: "dbname"
      prompt: "Database name"
      private: no
    - name: "dbuser"
      prompt: "Database username"
      private: no
    - name: "dbpassword"
      prompt: "Database password"
      private: yes 
  roles:
    - create_droplet
    - create_domain
- name: Install dependencies
  hosts: launched
  roles:
    - upgrade
    - utilities
    - users
    - nginx-php
    - composer
    - nginx_firewall
    - redis
    - postgres
    - git
以下用于设置Wordpress安装的类似方法不适用:

---
- name: Set up Wordpress with Apache, Memcached and Varnish
  hosts: localhost
  vars_prompt:
    - name: "domain"
      prompt: "Domain name"
      private: no
    - name: "title"
      prompt: "Wordpress title"
      private: no
    - name: "email"
      prompt: "Wordpress email"
      private: no
    - name: "user"
      prompt: "Admin username"
      private: no
    - name: "pass"
      prompt: "Admin password"
      private: yes 
  roles:
    - create_droplet
    - create_domain
- name: Install dependencies
  hosts: launched
  roles:
    - upgrade
    - utilities
    - users
    - apache
    - varnish
    - memcached
    - mysql
    - wordpress
两个剧本都使用
create_droplet
create_domain
角色在Digital Ocean上设置了一个新的droplet,并将其添加到
启动的
组中。但是,第二个剧本中提示的变量似乎没有定义,如以下错误消息所示:

TASK [wordpress : Add user "wordpress", belonging to group "wordpress" and having a home dir of /var/www] ***
fatal: [<IP_ADDRESS_REDACTED>]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'pass' is undefined\n\nThe error appears to have been in '/home/matthew/Projects/ansible-setup/playbooks/roles/wordpress/tasks/main.yml': line 28, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Add user \"wordpress\", belonging to group \"wordpress\" and having a home dir of /var/www\n  ^ here\nWe could be wrong, but this one looks like it might be an issue with\nunbalanced quotes.  If starting a value with a quote, make sure the\nline ends with the same set of quotes.  For instance this arbitrary\nexample:\n\n    foo: \"bad\" \"wolf\"\n\nCould be written as:\n\n    foo: '\"bad\" \"wolf\"'\n"}
TASK[wordpress:添加用户“wordpress”,属于“wordpress”组,其主目录为/var/www]***
致命:[]:失败!=>{“failed”:true,“msg”:"字段“args”有一个无效值,该值似乎包含一个未定义的变量。错误是:“pass”未定义\n\n错误似乎出现在“/home/matthew/Projects/ansible setup/playbooks/roles/wordpress/tasks/main.yml”:第28行第3列,但根据确切的语法问题,\n可能位于文件的其他位置。\n\n关闭结束行似乎是:\n\n\n-名称:添加用户\“wordpress\”,属于组\“wordpress\”如果home dir为/var/www\n^ here\n我们可能会错,但这一个看起来可能是引号不平衡的问题。如果以引号开始值,请确保\n行以相同的引号集结束。例如,这个任意的\n示例:\n\n foo:\“bad\”wolf\ \n\n可以写成:\n\n foo:“\”bad\“\”wolf\“\n”}
使用调试语句已经确认,在第二个剧本中调用的角色中,
变量似乎都没有定义。我不知道为什么会这样。但是,如果我删除创建液滴的部分并对现有液滴运行它,它似乎可以正常工作

有人能理解为什么这显示为未定义的吗?这与这些变量的范围有关吗

这与这些变量的范围有关吗

是的,您的变量是受播放限制的,因此它们可用于第一个播放(在您提示它们的地方),而不可用于第二个播放

如果需要变量在两次播放之间存活,则需要将其转换为主机事实。
例如,将
post_tasks
添加到您的第一个游戏中:

post_tasks:
  - set_fact:
      domain: '{{ domain }}'
    delegate_to: '{{ item }}'
    delegate_facts: true
    with_inventory_hostnames: launched
这将向
启动的
组中的每个主机添加
事实

这与这些变量的范围有关吗

是的,您的变量是受播放限制的,因此它们可用于第一个播放(在您提示它们的地方),而不可用于第二个播放

如果需要变量在两次播放之间存活,则需要将其转换为主机事实。
例如,将
post_tasks
添加到您的第一个游戏中:

post_tasks:
  - set_fact:
      domain: '{{ domain }}'
    delegate_to: '{{ item }}'
    delegate_facts: true
    with_inventory_hostnames: launched
这将向
启动的
组中的每个主机添加
事实