web-dev-qa-db-fra.com

comment créer un playbook Ansible pour obtenir les versions OS des hôtes distants?

Je suis nouveau chez ansible. J'ai une exigence qui m'oblige à extraire la version du système d'exploitation pour plus de 450 serveurs Linux hébergés dans AWS. AWS ne fournit pas cette fonctionnalité - il nous suggère plutôt de l'obtenir auprès d'une marionnette ou d'un chef.

J'ai créé quelques playbooks simples qui ne fonctionnent pas

---
- 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 devrait produire un fichier texte avec le nom d'hôte et la version du système d'exploitation. Toute idée à ce sujet sera très appréciée.

9
AmigoSe

Utilisez l'une des expressions Jinja2 suivantes:

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

où:

  • hostvars et ansible_... sont intégrés et collectés automatiquement par Ansible
  • ansible_distribution est l'hôte en cours de traitement par Ansible

Par exemple, en supposant que vous exécutez le rôle Ansible test_role contre l'hôte Host.example.com exécutant une distribution CentOS 7:

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

te donnera:

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"
}
10
Gabriel Petrovay

De manière structurée:

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

Crée un fichier séparé par des virgules nommé distro.csv dans le dossier playbook. Vous pouvez utiliser toutes les variables que vous souhaitez modifier line:.

3
user3178743

Pour quelques instances 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 }}"

donne:

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

}

1
Straff

Ansible fournit déjà beaucoup d'informations sur l'hôte distant dans la variable "hostvars" qui est automatiquement disponible.

Pour voir les informations de votre hôte nommé "my_remote_box_name", par exemple faire

- debug: var=hostvars['my_remote_box_name']

Certaines informations sur le système d'exploitation se trouvent dans

hostvars['my_remote_box_name']['ansible_lsb']

Ce qui, pour l'un de mes hôtes Ubuntu, serait long:

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

Vous pouvez simplement utiliser ces variables dans vos playbooks et modèles, en utilisant la notation "{{variable_name}}".

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

production:

"msg": "My release is 16.04"
1
Matthias Bloch
- name: obtain OS version
  Shell: Redhat-release
  register: result

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

"AWS ne fournit pas cette fonctionnalité" - vous pouvez vérifier le fichier /etc/os-release pour obtenir des détails sur l'instance aws.

Par exemple

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