Ansible: Can I execute role from command line?

前端 未结 7 826
陌清茗
陌清茗 2020-12-07 14:22

Suppose I have a role called \"apache\"

Now I want to execute that role on host 192.168.0.10 from the command line from Ansible host

ansible-playbook         


        
相关标签:
7条回答
  • 2020-12-07 14:56

    I am not aware of this feature, but you can use tags to just run one role from your playbook.

    roles:
        - {role: 'mysql', tags: 'mysql'}
        - {role: 'apache', tags: 'apache'}
    
    ansible-playbook webserver.yml --tags "apache"
    
    0 讨论(0)
  • 2020-12-07 14:58

    I have written a small Ansible plugin, called auto_tags, that dynamically generates for each role in your playbook a tag of the same name. You can find it here.

    After installing it (instructions are in the gist above) you could then execute a specific role with:

    ansible-playbook -i "192.168.0.10" --tags "name_of_role"

    0 讨论(0)
  • 2020-12-07 14:59

    There is no such thing in Ansible, but if this is an often use case for you, try this script.
    Put it somewhere within your searchable PATH under name ansible-role:

    #!/bin/bash
    
    if [[ $# < 2 ]]; then
      cat <<HELP
    Wrapper script for ansible-playbook to apply single role.
    
    Usage: $0 <host-pattern> <role-name> [ansible-playbook options]
    
    Examples:
      $0 dest_host my_role
      $0 custom_host my_role -i 'custom_host,' -vv --check
    HELP
      exit
    fi
    
    HOST_PATTERN=$1
    shift
    ROLE=$1
    shift
    
    echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."
    
    export ANSIBLE_ROLES_PATH="$(pwd)/roles"
    export ANSIBLE_RETRY_FILES_ENABLED="False"
    ansible-playbook "$@" /dev/stdin <<END
    ---
    - hosts: $HOST_PATTERN
      roles:
        - $ROLE
    END
    
    0 讨论(0)
  • 2020-12-07 15:01

    You could also check ansible-toolbox repository. It will allow you to use something like

    ansible-role --host 192.168.0.10 --gather --user centos --become my-role
    
    0 讨论(0)
  • 2020-12-07 15:07

    With ansible 2.7 you can do this:

    $ cd /path/to/ansible/
    $ ansible localhost -m include_role -a name=<role_name>
    localhost | SUCCESS => {
        "changed": false,
        "include_variables": {
            "name": "<role_name>"
        }
    }
    localhost | SUCCESS => {
        "msg": "<role_name>"
    }
    

    This will run role from /path/to/ansible/roles or configured role path.

    Read more here: https://github.com/ansible/ansible/pull/43131

    0 讨论(0)
  • 2020-12-07 15:11

    in ansible 2.8 it works slightly different

    wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
     [WARNING]: No inventory was parsed, only implicit localhost is available
    
    localhost | CHANGED => {
        "changed": true, 
        "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
        "dest": "/root/.ssh/id_rsa.github", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
        "mode": "0600", 
        "owner": "root", 
        "size": 3389, 
        "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
        "state": "file", 
        "uid": 0
    }
    localhost | CHANGED => {
        "changed": true, 
        "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
        "dest": "/root/.ssh/config", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "f82552a9494e40403da4a80e4c528781", 
        "mode": "0644", 
        "owner": "root", 
        "size": 147, 
        "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
        "state": "file", 
        "uid": 0
    }
    
    
    0 讨论(0)
提交回复
热议问题