[英]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 模塊”的腳本來工作。 大多數模塊接受描述系統所需 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
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: ''
- 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.