Search code examples
ansibleconcourseconcourse-pipeline

Ansible with Concourse


I am trying to run ansible playbooks within Concourse for remote hosts, however i cannot do that. Below are my steps:-

Concourse Yaml File:-

---
resource_types:
- name: ansible-playbook
  type: docker-image
  source:
    repository: troykinsella/concourse-ansible-playbook-resource
    tag: latest

resources:
- name: ansible
  type: ansible-playbook
  source:
    debug: true
    user: cloud_user
    ssh_private_key: ((ssh-key))
    verbose: vvv

- name: source-code
  type: git
  source:
    uri: ((git-repo))
    branch: master
    private_key: ((ssh-key))

jobs:
  - name: ansible-concourse
    plan:
    - get: source-code # git resource
    - put: ansible
      params:
        check: true
        diff: true
        become: true
        become_user: root
        inventory: inventory/hosts
        playbook: site.yml
        path: source-code

Host File:-

[test]
localhost

Inside the Container:-

I intercepted the container and i can ssh to any IP inside, however i am not able to make ssh-login.

Ansible Playbook:-

---
- name: "Running Current Working Directory"
  hosts: test
  gather_facts: no

  tasks:
     - name: "Current Working Directory"
       shell: pwd
       register: value

     - debug:
          msg: "The Current Working Directory {{value.stdout_lines}}"

Output Coming in Concourse:-

ansible-playbook       -i inventory/hosts --private-key /tmp/ansible-playbook-resource-ssh-private-key   --user cloud_user   -vvv site.yml
ansible-playbook 2.9.0
  config file = /tmp/build/put/source-code/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.6.8 (default, Oct  7 2019, 12:59:55) [GCC 8.3.0]
Using /tmp/build/put/source-code/ansible.cfg as config file
host_list declined parsing /tmp/build/put/source-code/inventory/hosts as it did not pass its verify_file() method
script declined parsing /tmp/build/put/source-code/inventory/hosts as it did not pass its verify_file() method
auto declined parsing /tmp/build/put/source-code/inventory/hosts as it did not pass its verify_file() method
Parsed /tmp/build/put/source-code/inventory/hosts inventory source with ini plugin

PLAYBOOK: site.yml *************************************************************
1 plays in site.yml

PLAY [Running Current Working Directory] ***************************************
META: ran handlers

TASK [Current Working Directory] ***********************************************
task path: /tmp/build/put/source-code/site.yml:7
Monday 18 November 2019  12:38:49 +0000 (0:00:00.084)       0:00:00.085 ******* 
<localhost> ESTABLISH SSH CONNECTION FOR USER: cloud_user
<localhost> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/tmp/ansible-playbook-resource-ssh-private-key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="cloud_user"' -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/dc52b3112c localhost '/bin/sh -c '"'"'echo ~cloud_user && sleep 0'"'"''
<localhost> (255, b'', b'')
fatal: [localhost]: UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ",
    "unreachable": true
}

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

Monday 18 November 2019  12:38:49 +0000 (0:00:00.029)       0:00:00.114 ******* 
=============================================================================== 
Current Working Directory ----------------------------------------------- 0.03s
/tmp/build/put/source-code/site.yml:7 -----------------------------------------

Solution

  • localhost is normally accessed through the local connection plugin (unless you are trying to do something really special and you have configured access through ssh which does not seem to be the case from your above error message).

    If you don't declare it in you inventory, localhost is implicit, uses the local connection and is not matched in the all group.

    However, if you declare localhost explicitly in your inventory, the default connection plugin becomes ssh and the all group matches this host too. You have to set the connection back to local yourself in that case.

    You have two options to make your current test work:

    1. Delete your inventory (or use one that does not explicitly declare localhost) and modify your playbook to target localhost directly => hosts: localhost
    2. Keep your playbook as is and modify your inventory
      [test]
      localhost ansible_connection=local