簡體   English   中英

如何使用 Ansible 讀取先前任務中使用 shell 模塊設置的環境變量

[英]How to read environment variable set with shell module in previous task with Ansible

編輯:我想設置的環境變量SYSTEM_VERSION不能在任務執行前設置。 它是在任務期間創建的(例如通過讀取僅在劇本執行期間更新的文件)

我有各種任務,其中一項設置了一個環境變量,例如:

- name: Set current version
  shell: export SYSTEM_VERSION=$(cat system_version.txt)
  register: version_result

然后我希望讀取同一主機的環境變量,例如:

- name: Get the version name
  command: echo $SYSTEM_VERSION
  register: get_version_result

- name: Print variable
  debug:
    msg: "The operating system is {{ get_version_result.stdout }}"

但這總是返回一個空結果。 為什么? 即使這不是正確的方法,我以后如何在同一主機的另一個任務中讀取我在一個任務中使用 shell 設置的變量?

問: 通過讀取在劇本執行期間更新的文件來設置環境變量 SYSTEM_VERSION。

A:你可以在一場戲、角色、街區或任務中設置環境 請參閱手冊關鍵字 如果您必須在劇本執行期間讀取該值,請將環境設置為一個塊。 例如,劇本

- hosts: test_11
  gather_facts: false
  tasks:
    - file:
        state: directory
        path: system-versions
    - shell: uname -sr > system_version.txt
    - fetch:
        src: system_version.txt
        dest: system-versions
    - block:
        - command: 'echo $SYSTEM_VERSION'
          register: result
        - debug:
            var: result.stdout
      environment:
        SYSTEM_VERSION: "{{ lookup('file', system_version_path) }}"
      vars:
        system_version_path: "system-versions/{{ inventory_hostname}}/system_version.txt"

創建將存儲文件的字典系統版本 下一個任務在遠程主機上創建文件system_version.txt

shell> ssh admin@test_11 cat system_version.txt
FreeBSD 13.0-RELEASE

下一個任務獲取文件並將其存儲在目錄system-versions/test_11 中

shell> cat system-versions/test_11/system_version.txt 
FreeBSD 13.0-RELEASE

該塊然后在 controller 讀取此文件並為塊中的任務設置環境

TASK [debug] *********************************************
ok: [test_11] => 
  result.stdout: FreeBSD 13.0-RELEASE

下一個選項是在第一次播放中獲取文件並在第二次播放中使用它們。 例如,給定遠程主機上的文件
shell> ssh admin@test_11 cat system_version.txt System A
shell> cat system-versions/test_11/system_version.txt 
System A

劇本

- hosts: test_11,test_12 gather_facts: false tasks: - file: state: directory path: system-versions run_once: true - fetch: src: system_version.txt dest: system-versions - hosts: test_11,test_12 gather_facts: false vars: system_version_path: "system-versions/{{ inventory_hostname}}/system_version.txt" environment: SYSTEM_VERSION: "{{ lookup('file', system_version_path) }}" tasks: - command: 'echo $SYSTEM_VERSION' register: result - debug: var: result.stdout

在第一次播放中獲取文件

shell> cat system-versions/test_11/system_version.txt System A
 shell> cat system-versions/test_12/system_version.txt System B

並在第二個播放中設置環境。 給(刪節)

 TASK [debug] *********************************************** ok: [test_11] => result.stdout: System A ok: [test_12] => result.stdout: System B

筆記

  • 有關 Ansible 的工作原理,請參閱Ansible 架構 報價:

Ansible 通過連接到您的節點並向它們推送名為“Ansible 模塊”的腳本來工作。 大多數模塊接受描述系統所需 state 的參數。 Ansible 然后執行這些模塊(默認超過 SSH),並在完成后刪除它們。 ...

  • 您可以查看模塊在什么環境中工作。例如,給定清單
shell> cat hosts [test] test_11 [test:vars] ansible_connection=ssh ansible_user=admin

劇本

shell> cat playbook.yml - hosts: test_11 gather_facts: false tasks: - command: '/bin/sh -c set' register: result - debug: var: result.stdout

啟用連接調試時給出 (-vvvv)

 shell> ansible-playbook -i hosts playbook.yml -vvvv

... <test_11> 為用戶建立 SSH 連接:admin <test_11> SSH:EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=mic,gssapispi-with- -keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="admin"' -o ConnectTimeout=10 -o ControlPath=/export/home/vlado.config/.ansible/cp/9d96571b11 -tt test_11 '/bin /sh -c '"'"'/usr/local/bin/python3.8 /home/admin/.ansible/tmp/ansible-tmp-1649217448.1346543-1545740-216049530990371/AnsiballZ_command.py && sleep 0'"'"' ' <test_11> (0, b'\r\n{"已更改": true, "stdout": "BLOCKSIZE=K\nHOME=/home/admin\nIFS=$' \\t\n'\nLANG=C .UTF-8\nLOGNAME=admin\nMAIL=/var/mail/admin\nMM_CHARSET=UTF-8\nOPTIND=1\nPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local /sbin:/usr/local/bin:/home/admin/bin\nPPID=26056\nPS1='$'\nPS2='> '\nPS4='+ '\nPWD=/home/admin\nSHELL=/bin /sh\nSSH_CLIENT='10.1.0.184 50874 22'\nSSH_CONNECTION='10.1.0.184 50874 10.1.0.61 22'\nSSH_TTY =/dev/pts/0\nTERM=xterm-256color\nUSER=admin", "stderr": "", "rc": 0, "cmd": ["/bin/sh", "-c", "設置”],“開始”:“2022-04-06 03:57:29.500158”,“結束”:“2022-04-06 03:57:29.516366”,“增量”:“0:00:00.016208”, “msg”:“”,“invocation”:{“module_args”:{“_raw_params”:“/bin/sh -c set”,“_uses_shell”:false,“warn”:false,“stdin_add_newline”:true,“ strip_empty_ends": true, "argv": null, "chdir": null, "executable": null, "creates": null, "removes": null, "stdin": null}}}\r 'OpenSSH_8.2p1 Ubuntu-4ubuntu0.2, OpenSSL 1.1.1f 2020 年 3 月 31 日\r\ndebug1:讀取配置數據 /home/vlado/.ssh/config\r\ndebug1:讀取配置數據 /etc/ssh/ssh_config\r \ndebug1: /etc/ssh/ssh_config 第 2 行:為 *\r\ndebug1 應用選項:auto-mux:嘗試現有的 master\r\ndebug2:fd 3 設置 O_NONBLOCK\r\ndebug2:mux_client_hello_exchange:master 版本 4\r\ ndebug3:mux_client_forwards:請求轉發:0 個本地,0 個遠程\r\ndebug3:mux_client_r equest_session:進入\r\ndebug3:mux_client_request_alive:進入\r\ndebug3:mux_client_request_alive:完成pid = 1545744\r\ndebug3:mux_client_request_session:session請求已發送\r\ndebug3:mux_client_read_packet:讀取失敗881855380806從主 0 接收到退出狀態\r\n到 test_11 的共享連接已關閉。\r\n')

 result.stdout: |- BLOCKSIZE=K HOME=/home/admin IFS=$' \t ' LANG=C.UTF-8 LOGNAME=admin MAIL=/var/mail/admin MM_CHARSET=UTF-8 OPTIND=1 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin PPID=26008 PS1='$ ' PS2='> ' PS4='+ ' PWD=/home/admin SHELL=/bin/sh SSH_CLIENT='10.1.0.184 50834 22' SSH_CONNECTION='10.1.0.184 50834 10.1.0.61 22' SSH_TTY=/dev/pts/0 TERM=xterm-256color USER=admin
  • 或者,您可以讓 Ansible 收集事實
shell> cat playbook.yml - hosts: test_11 gather_facts: true tasks: - debug: var: ansible_env

 ansible_env: BLOCKSIZE: K HOME: /home/admin LANG: C.UTF-8 LOGNAME: admin MAIL: /var/mail/admin MM_CHARSET: UTF-8 PATH: /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin PWD: /home/admin SHELL: /bin/sh SSH_CLIENT: 10.1.0.184 51008 22 SSH_CONNECTION: 10.1.0.184 51008 10.1.0.61 22 SSH_TTY: /dev/pts/0 TERM: xterm-256color USER: admin

例如,劇本

- hosts: test_11 gather_facts: false tasks: - shell: 'echo $SHELL' register: result - debug: var: result.stdout - shell: 'export MYVAR1=test; echo $MYVAR1' register: result - debug: var: result.stdout - shell: 'echo $MYVAR1' register: result - debug: var: result.stdout

TASK [shell] ******************************************************** changed: [test_11] TASK [debug] ******************************************************** ok: [test_11] => result.stdout: /bin/sh TASK [shell] ******************************************************** changed: [test_11] TASK [debug] ******************************************************** ok: [test_11] => result.stdout: test TASK [debug] ******************************************************** changed: [test_11] TASK [debug] ******************************************************** ok: [test_11] => result.stdout: ''
  • 你可以看到環境變量沒有被永久設置。 每個模塊都會創建一個新的登錄名。 解決方案是使用關鍵字environment 例如
- hosts: test_11 gather_facts: false environment: MYVAR1: test tasks: - shell: 'echo $MYVAR1' register: result - debug: var: result.stdout

給出預期

 result.stdout: test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM