首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ansible中从YAML文件(使用include_vars)加载环境变量

在Ansible中从YAML文件(使用include_vars)加载环境变量
EN

Stack Overflow用户
提问于 2022-10-15 12:47:10
回答 1查看 153关注 0票数 0

我正在尝试从YAML文件中加载变量,以便在同一本剧本的以后任务中用作环境变量。这就是我要做的:

  1. 模板YAML格式的vars:

代码语言:javascript
复制
- name: builtin | template | template host variables file
  ansible.builtin.template:
    src: templates/django/hostvars.j2
    dest: "host_vars/{{ inventory_hostname_short }}.yml"
    mode: 0640
    output_encoding: "utf-8"
  delegate_to: localhost

这将产生以下文件:

代码语言:javascript
复制
--
# Host variables to be set as environment variables in tasks that need it
POSTGRES_PASSWORD: "<password>"
POSTGRES_USER: "dbuser"
POSTGRES_DB: "dbname"
POSTGRES_HOST: "dbhost"
POSTGRES_PORT: 5432
POSTGRES_SSLMODE: "verify-full"
POSTGRES_SSLCA: "/etc/ssl/certs/ISRG_Root_X1.pem"
POSTGRES_APPNAME: "myproject"
DJANGO_SITE_NAME: "mysite"
DJANGO_SITE_PASSWORD: "mypassword"
DJANGO_SITE_USER: "myuser"
DJANGO_SITE_ID: 2
DJANGO_SECRET_KEY: "<very-long-and-random-secret>"
[..]

  1. 使用include_vars将vars加载到剧本:

中。

代码语言:javascript
复制
- name: builtin | include_vars | load host vars
  ansible.builtin.include_vars:
    file: "host_vars/{{ inventory_hostname_short }}.yml"
    name: envvars

  1. 在后面的剧本中,检查变量是否存在:

代码语言:javascript
复制
- name: builtin | debug | print variable 'envvars'
  ansible.builtin.debug:
    var: envvars

这显然是按预期工作的,并且正在打印一个键列表: value变量,例如:

代码语言:javascript
复制
TASK [builtin | debug | print variable 'envvars'] ***************************************************************
ok: [django1.mydomain.com] => {
    "envvars": {
        "DJANGO_DEBUG": 0,
        "DJANGO_LOGS_DIR": "/opt/django/logs",
        "DJANGO_MEDIA_BASE": "/opt/django/media",
        "DJANGO_SECRET_KEY": "<very-long-and-random-secret>",
        [..]

  1. 使用django_manage更新数据库架构:

代码语言:javascript
复制
- name: community.general | django_manage | update database schema
  community.general.django_manage:
    command: migrate
    settings: myproject.settings
    project_path: "/opt/django/src"
    virtualenv: "/opt/django/venv"
  become: true
  become_user: django
  become_method: su
  environment: "{{ envvars }}"

不幸的是,这种情况正在失败。Django抱怨它找不到SECRET_KEY环境变量,它应该基于上述列表中的一个变量(特别是DJANGO_SECRET_KEY)构建这个变量。

顺便说一句,如果我运行以下任务,则不会输出任何内容:

代码语言:javascript
复制
- name: print environment variables
  ansible.builtin.command: env
  become: true
  become_user: django
  become_method: su
  environment: "{{ envvars }}"

我不明白为什么。我尝试过使用-vvv进行调试,它们是由Ansible通过SSH连接发送的(至少看起来是这样的)。

对我做错了什么有什么暗示吗?

编辑1

我已经将使用django_manage的任务列表文件更改为以下代码:

代码语言:javascript
复制
- name: builtin | shell | capture DJANGO_ environment variables
  debugger: on_failed
  ansible.builtin.shell:
    cmd: "env | grep DJANGO_"
  register: out
  environment: "{{ envvars }}"
  become: true
  become_user: django
  become_method: su

- name: builtin | debug | pinrt content of out.stdout
  ansible.builtin.debug:
    var: out.stdout

- name: builtin | debug | print variable 'envvars'
  ansible.builtin.debug:
    var: envvars

- name: community.general | django_manage | populate the static subdirectory
  community.general.django_manage:
    command: collectstatic
    clear: yes
    project_path: "/opt/django/src"
    virtualenv: "/opt/django/venv"
  become: true
  become_user: django
  become_method: su
  environment: "{{ envvars }}"

第二个和第三个任务都打印变量的值(第一个来自通过env | grep DJANGO_命令通过shell发送的变量,第二个是通过environment:指令发送的envvars变量的值。

这是最后一个任务的错误:

代码语言:javascript
复制
TASK [builtin | shell | capture DJANGO_ environment variables] *************************************************************************************************************
changed: [django1.donmain.com]

TASK [builtin | debug | pinrt content of out.stdout] ***********************************************************************************************************************
ok: [django1.django.com] => {
    "out.stdout": "DJANGO_SITE_USER=mysite\nDJANGO_MEDIA_BASE=/opt/django/media\nDJANGO_SITE_NAME=mysite\nDJANGO_SITE_ID=2\nDJANGO_SECRET_KEY=<very-secret-key>\nDJANGO_LOGS_DIR=/opt/django/logs\nDJANGO_SETTINGS_MODULE=myproject.settings.production\nDJANGO_DEBUG=0\nDJANGO_STATIC_BASE=/opt/django/static\nDJANGO_SITE_PASSWORD=mypassword\nDJANGO_SITE_VERSION=57a2f3c168d86243f03809e5d02a0f50a8fa892e"
}

TASK [builtin | debug | print variable 'envvars'] **************************************************************************************************************************
ok: [django1.domain.com] => {
    "envvars": {
        "DJANGO_DEBUG": 0,
        "DJANGO_LOGS_DIR": "/opt/django/logs",
        "DJANGO_MEDIA_BASE": "/opt/django/media",
        "DJANGO_SECRET_KEY": "<very-secret-key>",
        "DJANGO_SETTINGS_MODULE": "myproject.settings.production",
        "DJANGO_SITE_ID": 2,
        "DJANGO_SITE_NAME": "mysite",
        "DJANGO_SITE_PASSWORD": "mypassword",
        "DJANGO_SITE_USER": "myuser",
        [..]
    }
}

TASK [community.general | django_manage | populate the static subdirectory] ************************************************************************************************
fatal: [django1.domain.com]: FAILED! => {"changed": false, "cmd": ["./manage.py", "collectstatic", "--noinput", "--clear"], "msg": "\n:stderr: Traceback (most recent call last):\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/core/management/__init__.py\", line 204, in fetch_command\n    app_name = commands[subcommand]\nKeyError: 'collectstatic'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/opt/django/src/./manage.py\", line 22, in <module>\n    execute_from_command_line(sys.argv)\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/core/management/__init__.py\", line 381, in execute_from_command_line\n    utility.execute()\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/core/management/__init__.py\", line 375, in execute\n    self.fetch_command(subcommand).run_from_argv(self.argv)\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/core/management/__init__.py\", line 211, in fetch_command\n    settings.INSTALLED_APPS\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/conf/__init__.py\", line 57, in __getattr__\n    self._setup(name)\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/conf/__init__.py\", line 44, in _setup\n    self._wrapped = Settings(settings_module)\n  File \"/opt/django/venv/lib/python3.9/site-packages/django/conf/__init__.py\", line 107, in __init__\n    mod = importlib.import_module(self.SETTINGS_MODULE)\n  File \"/usr/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n  File \"<frozen importlib._bootstrap>\", line 1030, in _gcd_import\n  File \"<frozen importlib._bootstrap>\", line 1007, in _find_and_load\n  File \"<frozen importlib._bootstrap>\", line 986, in _find_and_load_unlocked\n  File \"<frozen importlib._bootstrap>\", line 680, in _load_unlocked\n  File \"<frozen importlib._bootstrap_external>\", line 790, in exec_module\n  File \"<frozen importlib._bootstrap>\", line 228, in _call_with_frames_removed\n  File \"/opt/django/src/black_pearl/settings/production.py\", line 3, in <module>\n    from black_pearl.settings.common import *\n  File \"/opt/django/src/black_pearl/settings/common.py\", line 301, in <module>\n    path_app = import_module(app).__path__\n  File \"/usr/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\nModuleNotFoundError: No module named 'None'\n", "path": "/opt/django/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "syspath": ["/tmp/ansible_community.general.django_manage_payload_l53eeo4g/ansible_community.general.django_manage_payload.zip", "/usr/lib/python39.zip", "/usr/lib/python3.9", "/usr/lib/python3.9/lib-dynload", "/usr/local/lib/python3.9/dist-packages", "/usr/lib/python3/dist-packages"]}

PLAY RECAP *****************************************************************************************************************************************************************
django1.domain.com    : ok=14   changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-10-15 14:13:11

问:“什么都没有打印出来。”

A:如果你想看输出,就注册它。例如

代码语言:javascript
复制
- hosts: localhost
  tasks:
    - command: echo $DJANGO_DEBUG
      register: out
      environment:
        DJANGO_DEBUG: 0
    - debug:
        var: out.stdout

给予(删节)

代码语言:javascript
复制
  out.stdout: '0'

这应该对你有用。一步一步地增加代码的复杂性,并隔离问题。例如,下面的剧本应该在远程主机上显示环境。

代码语言:javascript
复制
- hosts: test_11

  vars:

    env:
      DJANGO_DEBUG: 0
      DJANGO_SITE_NAME: mysite
      DJANGO_SITE_PASSWORD: mypassword
      DJANGO_SITE_USER: myuser
      DJANGO_SITE_ID: 2

  tasks:
    - shell: env | grep DJANGO_
      register: out
      environment: "{{ env }}"
    - debug:
        var: out.stdout
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74079578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档