我想在Python中运行Ansible而不通过(ANSIBLE_HOST)指定库存文件,但只是通过:
ansible.run.Runner(
module_name='ping',
host='www.google.com'
)
Run Code Online (Sandbox Code Playgroud)
我实际上可以轻松地在Fabric中执行此操作,但只是想知道如何在Python中执行此操作.另一方面,用于python的Ansible API的文档并不完整.
为了响应更改,我有多个应该运行的相关任务.如何编写具有多个任务的Ansible处理程序?
例如,我想要一个仅在已经启动时重启服务的处理程序:
- name: Restart conditionally
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Run Code Online (Sandbox Code Playgroud) 我在Ansible中注册了名为"network"的变量:
{
"addresses": {
"private_ext": [
{
"type": "fixed",
"addr": "172.16.2.100"
}
],
"private_man": [
{
"type": "fixed",
"addr": "172.16.1.100"
},
{
"type": "floating",
"addr": "10.90.80.10"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能获得类型="浮动"的IP地址("addr")做这样的事情?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
Run Code Online (Sandbox Code Playgroud)
我知道语法错了,但你明白了.
我可以通过其他角色通知处理程序吗?我该怎么做让ansible找到它?
用例是,例如我想配置一些服务,然后在更改时重新启动它.不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同.所以我想把它们放到不同的角色(因为文件格式可能不同,不能通过设置group_vars来完成).但重启服务的方式是相同的,使用service模块; 所以我想把处理程序放到common角色上.
无论如何要实现这一目标?谢谢.
我正在设计一种具有单独任务的剧本库
所以在通常的角色回购中,我有类似的东西:
roles
??? common
? ??? tasks
? ??? A.yml
? ??? B.yml
? ??? C.yml
? ??? D.yml
? ??? login.yml
? ??? logout.yml
? ??? save.yml
??? custom_stuff_workflow
? ??? tasks
? ??? main.yml
??? other_stuff_workflow
??? tasks
??? main.yml
Run Code Online (Sandbox Code Playgroud)
我在custom_stuff_workflow中的main.yml包含如下内容:
---
- include: login.yml
- include: A.yml
- include: C.yml
- include: save.yml
- include: logout.yml
Run Code Online (Sandbox Code Playgroud)
而这个在另一个工作流程中:
---
- include: login.yml
- include: B.yml
- include: A.yml
- include: D.yml
- include: save.yml
- include: logout.yml …Run Code Online (Sandbox Code Playgroud) 我可以使用shell getent和awk这样的组合来做到这一点:
getent passwd $user | awk -F: '{ print $6 }'
Run Code Online (Sandbox Code Playgroud)
作为参考,在Puppet中我可以使用自定义事实,如下所示:
require 'etc'
Etc.passwd { |user|
Facter.add("home_#{user.name}") do
setcode do
user.dir
end
end
}
Run Code Online (Sandbox Code Playgroud)
这使得用户的主目录可用作home_<user name>事实.
如何获取任意远程用户的主目录?
我正在使用Ansible 1.5.3和Git与ssh代理转发(https://help.github.com/articles/using-ssh-agent-forwarding).我可以登录到我使用Ansible管理的服务器并测试我与git的连接是否正确配置:
ubuntu@test:~$ ssh -T git@github.com
Hi gituser! You've successfully authenticated, but GitHub does not provide shell access.
Run Code Online (Sandbox Code Playgroud)
我也可以使用这个帐户克隆和更新我的一个repos,这样我的git配置看起来不错,当我直接通过ssh登录我的服务器时使用ssh转发.
问题:当我使用Ansible命令模块尝试上面显示的相同测试时.它以"Permission denied"失败.Ansible输出的一部分(详细日志记录)如下所示:
failed: [xxx.xxxxx.com] => {"changed": true, "cmd": ["ssh", "-T", "git@github.com"], "delta": "0:00:00.585481", "end": "2014-06-09 14:11:37.410907", "rc": 255, "start": "2014-06-09 14:11:36.825426"}
stderr: Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)
这是运行此命令的简单playbook:
- hosts: webservers
sudo: yes
remote_user: ubuntu
tasks:
- name: Test that git ssh connection is working.
command: ssh -T git@github.com
Run Code Online (Sandbox Code Playgroud)
问题:当我通过ssh手动登录并运行命令时,为什么一切正常,但是当同一个命令通过Ansible运行同一个命令时失败?
如果没有其他人打败我,我会很快发布答案.虽然我使用git来演示问题,但是任何依赖于ssh代理转发的模块都可能发生这种情况.它不是Ansible特有的,但我怀疑很多人会在这种情况下首先遇到问题.
我正在编写一个部署过程,该过程采用运行ansible脚本的用户名(例如tlau),并根据该用户名和当前日期/时间在远程系统上创建部署目录(例如tlau-deploy-2014-10 -15-16:52).
您可能认为这在ansible事实中可用(例如LOGNAME或SUDO_USER),但这些都设置为"root"或用于ssh到远程系统的部署ID.这些都不包含本地用户,即当前正在运行ansible进程的用户.
如何编写运行ansible进程的用户名并在我的playbook中使用它?
我想知道Ansible是否有办法访问本地环境变量.
该文档引用了访问目标机器上的变量:
{{ lookup('env', 'SOMEVAR') }}
Run Code Online (Sandbox Code Playgroud)
有没有办法在源计算机上访问环境变量?
我想允许任何人列出并读取目录树中的所有文件,但我不想让文件可执行:
dir
\subdir1
file1
\subdir2
file2
...
\subdirX
fileX
Run Code Online (Sandbox Code Playgroud)
以下任务使我的目录和文件可读,但它使所有文件也可执行:
- name: Make my directory tree readable
file:
path: dir
mode: 0755
recurse: yes
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我选择模式0644,那么我的所有文件都不可执行,但我无法列出我的目录.
是否可以为所有目录设置模式755,为目录树中的所有文件设置644?
谢谢.