1
  • I'm trying to write a correct command line that will ping to all hosts that are detailed in my inventory file
  • my dockerfile:
FROM centos:7

RUN yum check-update; \
    yum install -y gcc libffi-devel python3 epel-release; \
    yum install -y python3-pip; \
    yum install -y wget; \
    yum clean all

RUN pip3 install --upgrade pip; \
    pip3 install "ansible"; \
    wget -q https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt; \
    pip3 install -r requirements-azure.txt; \
    rm requirements-azure.txt; \
    ansible-galaxy collection install azure.azcollection \

WORKDIR /github
CMD ["/usr/sbin/init"]
  • All hosts are Windows OS hosts
  • Below my Ansible library structure
C:.
└───bla_product
    └───core
        ├───ansible
        │   ├───inventories
        │   │   ├───production
        │   │   ├───staging
        │   │   └───test
        │   │       ├───cloud
        │   │       └───onpremis
        │   │           └───domain.com
        │   │               │   lab_x.yml
        │   │               │
        │   │               └───group_vars
        │   │                       windows.yml
        │   │
        │   ├───playbooks
        │   └───roles
  • my inventory file lab_x.yml looks like this:
---
all:
  children:
    root:
      children:
        center:
          children:
            appservers:
              hosts:
                centeriis.domain.com:
                  ansible_host: 200.10.0.100
            qservers:
              hosts:
                centerq.domain.com:
                  ansible_host: 200.10.0.101
            dbservers:
              hosts:
                centerdb.domain.com:
                  ansible_host: 200.10.0.102
        serverfarms:
          hosts:
          children:
            gateways:
              hosts:
        south:
          children:
            brooklyn:
              hosts:
                  srv1.domain.com:
                    ansible_host: 200.10.0.103
              children:
                endpoints:
                  hosts:
                    client1.domain.com:
                      ansible_host: 200.10.0.105
                    client2.domain.com:
                      ansible_host: 200.10.0.106
        north:
          children:
            newyork:
              hosts:
                srv2.domain.com:
                  ansible_host: 200.10.0.104
              children:
                endpoints:
                  hosts:
                    client3.domain.com:
                      ansible_host: 200.10.0.107
  • The windows.yml file include connection details that refers to all hosts, since they are all Windows OS hosts:
---
ansible_connection: winrm
ansible_user: domain\user
ansible_password: password
  • Run the following command ansible all -i lab_r.yml -m win_ping results:
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC
 4.8.5 20150623 (Red Hat 4.8.5-44)]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
centeriis.domain.com | UNREACHABLE! => {
    "changed": false,
    "msg": "[Errno None] Unable to connect to port 22 on 200.10.0.100",
    "unreachable": true
}
  • trying this one ansible windows.yml -i lab_r.yml -m win_ping gives:
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC
 4.8.5 20150623 (Red Hat 4.8.5-44)]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
[WARNING]: Could not match supplied host pattern, ignoring: windows.yml
[WARNING]: No hosts matched, nothing to do
  • What am I missing in this "story"?
  • Is the problem with files OR commands?
  • What is the reason that Ansible uses port 22 instead using WinRM protocol?
  • Can win_ping command can works in this phase OR must I hold a playbook and role (task) files in order it to be worked?
  • How do I make this whole business work (a command that uses the files within Inventories and group_vars folder)?
Hiddai
  • 67
  • 2
  • 10

1 Answers1

1

None of the hosts in your inventory is in a group called "windows", so your windows.yml is never used and Ansible falls back to the default protocol, which is ssh.

If you only have Windows servers the easiest solution would be to put the connection information into all.yml.

Gerald Schneider
  • 19,757
  • 8
  • 52
  • 79
  • I add the following line to my dockerfile: ```pip3 install "pywinrm>=0.2.2" ```. also change the file to ```all.yml```. executing the command with explicit path of the inventory file like this: ```ansible all -i inventories/test/onpremis/domain.com/lab_r.yml -m win_ping``` succeed then. – Hiddai Jun 30 '21 at 21:58