【问题标题】:how to create Ansible playbook to obtain OS versions of the remote hosts?如何创建 Ansible playbook 以获取远程主机的操作系统版本?
【发布时间】:2020-06-24 07:42:23
【问题描述】:

我是 ansible 的新手。我有一个要求,要求我为 AWS 中托管的 450 多个 linux 服务器提取操作系统版本。 AWS 不提供此功能——而是建议我们从 puppet 或 chef 那里获得它。

我创建了一些无法运行的简单剧本

---
- hosts: testmachine
user: ec2-user
sudo: yes
tasks:
- name: Update all packages to latest
yum: name=* state=latest

task:
- name: obtain OS version
shell: Redhat-release

playbook 应该输出一个带有主机名和操作系统版本的文本文件。对此的任何见解都将受到高度赞赏。

【问题讨论】:

标签: linux amazon-web-services amazon-ec2 ansible ansible-playbook


【解决方案1】:

使用以下 Jinja2 表达式之一:

{{ hostvars[inventory_hostname].ansible_distribution }}
{{ hostvars[inventory_hostname].ansible_distribution_major_version }}
{{ hostvars[inventory_hostname].ansible_distribution_version }}

地点:

  • hostvarsansible_... 是内置的,由 Ansible 自动收集
  • ansible_distribution 是 Ansible 正在处理的主机

例如,假设您在运行 CentOS 7 发行版的主机 host.example.com 上运行 Ansible 角色 test_role

---
- debug:
    msg: "{{ hostvars[inventory_hostname].ansible_distribution }}"
- debug:
    msg: "{{ hostvars[inventory_hostname].ansible_distribution_major_version }}"
- debug:
    msg: "{{ hostvars[inventory_hostname].ansible_distribution_version }}"

会给你:

TASK [test_role : debug] *******************************************************
ok: [host.example.com] => {
    "msg": "CentOS"
}

TASK [test_role : debug] *******************************************************
ok: [host.example.com] => {
    "msg": "7"
}

TASK [test_role : debug] *******************************************************
ok: [host.example.com] => {
    "msg": "7.5.1804"
}

【讨论】:

  • 你好 Gabriel,不应该是“inventory_hostname 是 Ansible 正在处理的主机”而不是 ansible_distribution
  • 或者ansible_facts['distribution'] 返回操作系统名称,就像{{ hostvars[inventory_hostname].ansible_distribution }}
  • {{ ansible_distribution }} 现在已经足够了,不需要显式使用主机变量
【解决方案2】:

以结构化的方式:

- hosts: all
  become: no
  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'
            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 }}"
          # Tries to prevent concurrent writes.
          throttle: 1
      delegate_to: localhost

在执行文件夹中创建一个名为 os.csv 的逗号分隔文件。你可以使用任何你想编辑的变量line:

【讨论】:

    【解决方案3】:

    Ansible 已经在自动可用的“hostvars”变量中提供了大量有关远程主机的信息。

    查看名为“my_remote_box_name”的主机的信息,例如做

    - debug: var=hostvars['my_remote_box_name']
    

    一些操作系统信息在

    hostvars['my_remote_box_name']['ansible_lsb']
    

    对于我的一位 ubuntu 主机来说,这将是:

    {
      "hostvars['my_remote_box_name']['ansible_lsb']": {
        "codename": "xenial", 
        "description": "Ubuntu 16.04.1 LTS", 
        "id": "Ubuntu", 
        "major_release": "16", 
        "release": "16.04"
    }
    

    您可以在剧本和模板中使用这些变量,使用“{{ variable_name }}”表示法。

    - debug: msg="My release is {{ansible_lsb.release}}"
    

    输出:

    "msg": "My release is 16.04"
    

    【讨论】:

      【解决方案4】:

      对于几个 Windows 实例:

          - debug:
              msg:
              - "ansible_distribution {{ hostvars[inventory_hostname].ansible_distribution }}"
              - "major version {{ hostvars[inventory_hostname].ansible_distribution_major_version }}"
              - "version {{ hostvars[inventory_hostname].ansible_distribution_version }}"
      

      给予:

      ok: [server1] => {
      "msg": [
          "ansible_distribution Microsoft Windows Server 2008 R2 Standard ",
          "major version 6",
          "version 6.1.7601.65536"
      ]
      

      }

      ok: [server2] => {
      "msg": [
          "ansible_distribution Microsoft Windows Server 2016 Standard",
          "major version 10",
          "version 10.0.14393.0"
      ]
      

      }

      【讨论】:

        【解决方案5】:

        “AWS 不提供此功能” - 您可以查看文件 /etc/os-release 以获取 aws 实例的详细信息。

        例如

        [ec2-user@ip-xx-xx-xx ~]$ cat /etc/os-release
        NAME="Amazon Linux AMI"
        VERSION="2016.03"
        ID="amzn"
        ID_LIKE="rhel fedora"
        VERSION_ID="2016.03"
        PRETTY_NAME="Amazon Linux AMI 2016.03"
        ANSI_COLOR="0;33"
        CPE_NAME="cpe:/o:amazon:linux:2016.03:ga"
        HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
        

        【讨论】:

        • 感谢 Vor 的回复,但是,如果我要登录 450 个 redhat 服务器并 cat /etc/redhat-release .. 我很可能会在几个小时内发疯......我想使用 ansible 自动执行此操作的原因。这里有 Ansible 专家吗?
        • 您还需要使用 debug 从您的cat 命令打印标准输出
        【解决方案6】:
        - name: obtain OS version
          shell: Redhat-release
          register: result
        
        - name: print OS version
          debug: var=result.stdout
        

        【讨论】:

        • 感谢 smiller171 我尝试了以下任务: - 名称:收集远程主机 shell 的操作系统版本:cat /etc/redhat-release - 名称:Pring 操作系统版本调试:var=result.stdout 任务 [打印操作系统版本] *********************************************** ********* 好的:[IP] => {“result.stdout”:“变量未定义!” var未定义出现
        • 再看我的例子。注册你的 shell 命令的结果很重要。
        猜你喜欢
        • 2021-11-04
        • 1970-01-01
        • 2010-10-08
        • 2016-06-29
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2021-01-17
        相关资源
        最近更新 更多