how to create Ansible playbook to obtain OS versions of the remote hosts?

风格不统一 提交于 2020-01-12 14:30:14

问题


I'm new to ansible. I have a requirement that requires me to pull OS version for of more than 450 linux severs hosted in AWS. AWS does not provide this feature - it rather suggests us to get it from puppet or chef.

I created few simple playbooks which does not run

---
- 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 should output a text file with hostname and OS version. Any insight on this will be highly appreciated.


回答1:


Use one of the following Jinja2 expressions:

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

where:

  • hostvars and ansible_... are built-in and automatically collected by Ansible
  • ansible_distribution is the host being processed by Ansible

For example, assuming you are running the Ansible role test_role against the host host.example.com running a CentOS 7 distribution:

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

will give you:

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"
}



回答2:


In a structured way:

---
- hosts: all
  vars:
    dest: distro.csv
  tasks:
    - copy:
        content: ''
        dest: "{{ dest }}"
      run_once: yes
      delegate_to: 127.0.0.1
    - lineinfile:
        dest: "{{ dest }}"
        line: '{{ inventory_hostname }},{{ ansible_distribution }},{{ ansible_distribution_major_version }},{{ ansible_distribution_version }},{{ ansible_distribution_release }}'
      delegate_to: 127.0.0.1

Creates a comma separated file named distro.csv in playbook folder. You can use any variables you want editing line:.




回答3:


Ansible already provides a lot of information about the remote host in the "hostvars" variable that is automatically available.

To see information of your host named "my_remote_box_name", e.g. do

- debug: var=hostvars['my_remote_box_name']

Some OS information is in

hostvars['my_remote_box_name']['ansible_lsb']

Which, for one of my ubuntu hosts would be along:

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

You can just use those variables in your playbooks and templates, using the "{{ variable_name }}" notation.

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

output:

"msg": "My release is 16.04"



回答4:


For a couple of windows instances:

    - 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 }}"

gives:

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 does not provide this feature " - you can check file /etc/os-release to get details of aws instance.

For example

[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/"



回答6:


- name: obtain OS version
  shell: Redhat-release
  register: result

- name: print OS version
  debug: var=result.stdout


来源:https://stackoverflow.com/questions/38078247/how-to-create-ansible-playbook-to-obtain-os-versions-of-the-remote-hosts

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!