Ansible:我可以从命令行执行角色吗?

Ansible:我可以从命令行执行角色吗?,ansible,ansible-role,Ansible,Ansible Role,假设我有一个名为“apache”的角色 现在我想从Ansible主机的命令行在主机192.168.0.10上执行该角色 ansible-playbook -i "192.168.0.10" --role "path to role" 有没有办法做到这一点?我不知道这个功能,但是你可以使用标签从剧本中运行一个角色 roles: - {role: 'mysql', tags: 'mysql'} - {role: 'apache', tags: 'apache'} ansibl

假设我有一个名为“apache”的角色

现在我想从Ansible主机的命令行在主机192.168.0.10上执行该角色

ansible-playbook -i  "192.168.0.10" --role  "path to role"

有没有办法做到这一点?

我不知道这个功能,但是你可以使用标签从剧本中运行一个角色

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"

Ansible中没有这样的东西,但如果这是您经常使用的用例,请尝试此脚本。
将其放在您可搜索路径的某个位置,名称为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
#/bin/bash
如果[$#<2]];然后
cat您还可以检查存储库。它将允许您使用

ansible角色——主机192.168.0.10——聚集——用户centos——成为我的角色

我编写了一个小型Ansible插件,名为
auto_tags
,它可以为剧本中的每个角色动态生成一个同名的标签。你可以找到它

安装后(上面的要点中有说明),您可以执行以下特定角色:


ansible剧本-i“192.168.0.10”--使用ansible 2.7标记“角色名称”

,您可以执行以下操作:

$ 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>"
}
$cd/path/to/ansible/
$ansible localhost-m include_role-a名称=
localhost | SUCCESS=>{
“更改”:错误,
“包含变量”:{
“名称”:”
}
}
localhost | SUCCESS=>{
“msg”:”
}
这将从/path/到/ansible/roles或配置的角色路径运行角色

请在此处阅读更多信息:

因为在ansible 2.4中有两个选项可用:
导入角色
包含角色

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
}


你试过了吗?超级酷。我使用“更新操作系统”而不是“apache”角色来给出一个更有意义的示例。我在我的
/
中有一个名为
/roles/update os/
的角色,我添加了一个名为
/role update os.yml
的文件,它看起来像:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os
使此文件可执行(
chmod+x角色更新os.yml
)。现在,您可以运行并限制库存中的任何内容
/update-os.yml-i inventory dev--limit 192.168.0.10
您还可以传递组名的限制

  • --限制web、db
    >web和db是在您的库存中定义的组
  • ——限制192.168.0.10192.168.0.201

请注意,您可以将ssh密钥和sudoers策略配置为无需键入密码即可执行-这是自动化的理想选择,这会带来安全隐患。因此,您必须分析您的环境,看看它是否合适。

是的,
import\u角色
是一个ansible模块,因此可以通过
ansible
命令调用它。下面在
myu服务器上执行角色
pki

ansible my_server -m import_role \
                  -a "name=pki tasks_from=gencert" \
                  -e cn=etcdctl \
                  -e extended_key_usage=clientAuth

我已经创建了一个“创建ansible角色”工具提案,我们将看到:看起来它已经在ansible 2.7中实现了:是的,请尝试
ansible localhost-m include_role-a name=myrole
-适合我<代码>ansible localhost-m include_role-a name=myrole
自ansible 2.8以来已中断。它只是记录一些神秘的错误信息,比如
“error!”async_val'不是IncludeRole的有效属性。
这并不能真正回答问题,因为没有对外部角色YAML file@kari的引用,该角色已实现并希望包含。我有同样的问题。然而,读完这个答案后,我只知道它是可行的。我只是不知道怎么做。希望我已经澄清了答案@KolaThis在Ansible 2.8中被破坏了。它只是记录一些神秘的错误信息,比如
“error!”async_val'不是IncludeRole的有效属性。
此解决方案似乎适用于ansible 2.8.2。向原始角色中包含的其他角色公开变量似乎存在问题(在剧本中这不是问题)。我尝试更改为
-a“name=public=yes”
,但这没有帮助。为了理解-m和-a基本上看到了什么,这就是如何从命令行(
-m
)以key=value对作为参数(
-a key=value
)启动模块
ansible my_server -m import_role \
                  -a "name=pki tasks_from=gencert" \
                  -e cn=etcdctl \
                  -e extended_key_usage=clientAuth