如何计算ansible_uptime_seconds并在操作系统中输出.csv

How to calculate ansible_uptime_seconds and output this in os.csv

提问人:JDFreez 提问时间:11/4/2022 最后编辑:ZeitounatorJDFreez 更新时间:7/20/2023 访问量:1259

问:

我正在尝试创建一个可用于查看某些系统详细信息的 csv 文件。其中一项是系统正常运行时间,它以 unix 秒为单位反映。但是在os.csv输出文件中,我希望将其视为天,HH:MM:SS。

在我的 yaml 脚本下方:

---
- name: playbook query system and output to file
  hosts: OEL7_systems 
  vars:
    output_file: os.csv
  tasks:
     - block:
         # For permisison setup.
         - name: get current user
           command: whoami
           register: whoami
           run_once: yes
 
         - name: clean_file
           copy:
             dest: "{{ output_file }}"
             content: 'hostname,distribution,version,release,uptime'
             owner: "{{ whoami.stdout }}"
           run_once: yes
 
         - name: fill os information
           lineinfile:
             path: "{{ output_file }}"
             line: "{{ ansible_hostname }},\
               {{ ansible_distribution }},\
               {{ ansible_distribution_version }},\
               {{ ansible_distribution_release }},\
               {{ ansible_uptime_seconds }}"
           # Tries to prevent concurrent writes.
           throttle: 1
       delegate_to: localhost

任何帮助都是值得赞赏的。

尝试了几次转换,但无法使其正常工作。

Ansible 正常运行时间

评论


答:

3赞 Zeitounator 11/4/2022 #1

实际上,在官方文档中有一个(有点难以找到)关于复杂数据操作的示例,这些操作完全符合您的要求(在页面底部查看)。

下面是一个完整的示例 playbook,用于在 localhost 上运行它

---
- hosts: localhost

  tasks:
    - name: Show the uptime in days/hours/minutes/seconds
      ansible.builtin.debug:
        msg: Uptime {{ now().replace(microsecond=0) - now().fromtimestamp(now(fmt='%s') | int - ansible_uptime_seconds) }}

这在我的机器上给出:

PLAY [localhost] ************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************
ok: [localhost]

TASK [Show the uptime in days/hours/minutes/seconds] ************************************************************************************************************
ok: [localhost] => {
    "msg": "Uptime 1 day, 3:56:34"
}

PLAY RECAP ******************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

评论

0赞 JDFreez 11/7/2022
tnx 进行回复。我理解了这部分,但我试图实现的是将该答案输出到输出文件中。我不知道该怎么做。因此,任务的结果(在本例中为“正常运行时间 1 天,3:56:34”)需要成为 csv 文件的一部分。有什么建议吗?
1赞 Zeitounator 11/7/2022
好吧,将示例中的调试任务更改为另一个将写入文件的任务,例如或.....lineinfilecopy
1赞 user22223187 7/14/2023 #2
- name: Show the uptime in days/hours/minutes/seconds
  set_fact:
    uptime: "{{ ansible_facts['facter_system_uptime']['uptime'] }}"

- name: fill os information
  lineinfile:
    path: "{{ output_file }}"
    line: "{{ ansible_hostname }},\
      {{ ansible_distribution }},\
      {{ ansible_distribution_version }},\
      {{ ansible_distribution_release }},\
      {{ ansible_facts.kernel }},\
      {{ uptime }}"
  throttle: 1 # to try to prevent concurrent writes
  delegate_to: localhost