我正在努力让我的 Ansible 角色变得可组合和可重用。
我有一个执行多个系列步骤的角色。根据应用于主机的其他角色,其他角色需要在每个步骤运行任务。
我正在使用 PostgreSQL 和 PostgreSQL 扩展管理,但为了简单起见,让我们使用一个 Web 服务器和一些在其上运行的应用程序的示例。
角色webserver:
该myapp角色需要能够向 Web 服务器的配置添加一些设置,这些设置必须在创建 Web 服务器的数据库之前应用。它还必须在首次声明网络服务器之前执行一些操作。
该myotherapp角色还需要在首次运行之前向网络服务器的配置添加一些设置,而不破坏myapp. 它还必须在网络服务器首次启动后执行一些操作,重新启动它,做更多的工作,然后再次重新启动它。
(这是人为的,但表达了我真实用例的所有需求,而没有深入了解您想了解的有关 PostgreSQL 内部结构的更多信息)。
我想我应该能够为此使用处理程序。只需在每个相关步骤中webserver触发notify,以便其他角色可以将这些通知挂起以附加到列表或将密钥添加到用于配置模板的哈希中,触发自己的任务等。拥有一个处理程序,restart_webserver可以myotherapp在每次想要发出通知时发出通知重新启动,而不必知道重新启动实际上是如何执行的。ETC。
然而:
如果有通知,则处理程序必须存在。Ansible 不允许可选处理程序。
如果通知有多个处理程序,Ansible 只会选择第一个处理程序并忽略其余所有处理程序。
通知仅在播放部分结束时触发。你不能立即解雇他们。有,meta: flush_handlers但它会刷新所有处理程序,即使是那些来自其他不相关角色和任务的处理程序,这些角色和任务可能不希望其处理程序提前运行。
附加到列表或向字典添加键是非常困难的。因此,如果不手动将配置与一些 yml 粘合在一起,就很难组合多个相关角色host_vars。
所以处理程序和通知似乎不是如何做到这一点的。
如何编写可组合的任务和角色?
我想用自行车车轮当锤子吗?难道你不打算以这种方式使用角色吗?看起来很符合角色的概念。
是否应该通过删除 Ansible 的任务/角色/变量/等系统并在 Python …
(与Ansible 角色中的回调或挂钩以及可重用的一系列任务相关):
Ansible 是否提供了一种只为一个处理程序刷新通知的方法?
就像meta: flush_handlers,但是对于单个命名处理程序?
或者在收到通知后立即解雇处理程序的方法?
我已经成功地在本地 linux 服务器上创建了一个到我们的云 postgresql 服务器的 SSH 隧道,使用以下命令:
ssh -N -f -L 5431:localhost:xxxx mycloudserver.com
Run Code Online (Sandbox Code Playgroud)
(其中 xxxx 是远程端口)
使用这个命令我可以通过端口 5431 访问远程 PostgreSQL 数据库,但只能在这个 linux 服务器上。
现在我想与网络上的其他PC“共享”此连接,以便我可以使用ODBC驱动程序连接到linux_server:5431并读取云数据库,而无需在客户端上安装任何SSH软件。使用 iptables 打开端口 5431 不起作用。
iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d 192.168.128.5 --dport 5431 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.128.5 --sport 5431 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
已经试过了
ssh -N -f -L 5431:0.0.0.0:xxxx mycloudserver.com
Run Code Online (Sandbox Code Playgroud)
也。隧道已成功构建并在服务器上运行,但我无法“看到”来自客户端的连接。
我正在测试 k8s 调试功能,包括调试 pod 和临时容器,但我无法弄清楚如何将“目标”pod 的文件系统正确映射到调试容器中。
我想使用递归绑定挂载 * 链接两个不相交的挂载命名空间,以便容器 A 将容器 B 的根视为容器 B 的根,/containerB反之亦然。包括所有卷和其他安装。
目标是让目标 pod 的完整文件系统树,包括映射到调试容器的子目录(例如 )的卷和其他挂载/run/target。如果目标容器挂载持久卷,则应映射这些挂载点,因此,例如,如果目标容器具有,/data则调试容器应具有已安装的/run/target/data.
或者,可以将调试容器文件系统树“注入”到目标容器中,因此可以在调试容器/run/debug时公开可用的调试容器根。nsenter包括它的像 procfs 这样的挂载,所以它的功能齐全。
我希望能够例如调试容器提供的gdb -p $target_pid位置。为此,必须能够从目标容器中找到进程可执行文件。gdbgdb
我探索了一些解决方法。但我真正想做的是将mount --rbind目标容器 FS 树转移到来宾上,反之亦然。给定一个定制的特权调试容器,例如:
apiVersion: v1
kind: Pod
metadata:
name: debugcontainer
namespace: default
spec:
nodeName: TARGET_NODE_NAME_HERE
enableServiceLinks: true
hostIPC: true
hostNetwork: true
hostPID: true
restartPolicy: Never
containers: …Run Code Online (Sandbox Code Playgroud) 有没有一种简单的、向后兼容的方法来使用 CPAN 静默安装 Perl 模块?
PERL_MM_USE_DEFAULT不适用于未检测到默认大陆的旧版本;CPAN 将在
对不起!由于您没有任何现有选择,因此您必须进行地理选择。
可以使用 Perl 片段来加载 CPAN 并对其进行配置,但这既冗长又丑陋。
(Debian 8)
我的 .pgpass 文件在我的主文件夹(管理员)
我并使用文档中指示的正确格式
hostname:port:database:username:password
Run Code Online (Sandbox Code Playgroud)
当明确地放入psql命令行时,我放在那里的相同字段工作得很好。(当然我必须手动输入密码)。
但是,单独运行 psql 会给我们一个错误:
psql: FATAL: role "admin" does not exist
Run Code Online (Sandbox Code Playgroud)
请注意,我的 postgres 用户名不是“admin”,这是我的 debian 用户名。
我究竟做错了什么?我的目标是psql无需使用复杂的命令行(包括主机/端口/用户名/数据库)即可访问
ansible ×2
postgresql ×2
cpan ×1
database ×1
debian ×1
docker ×1
kubernetes ×1
linux ×1
linux-kernel ×1
mount ×1
namespaces ×1
odbc ×1
perl ×1
silent ×1
ssh-tunnel ×1
unattended ×1