当ansible变量不是寄存器/未定义时,我正在寻找一种执行任务的方法,例如
-- name: some task
command: sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print $2}'
when: (! deployed_revision) AND ( !deployed_revision.stdout )
register: deployed_revision
Run Code Online (Sandbox Code Playgroud) 我必须检查文件是否存在/etc/.如果该文件存在,那么我必须跳过该任务.这是我正在使用的代码:
- name: checking the file exists
command: touch file.txt
when: $(! -s /etc/file.txt)
Run Code Online (Sandbox Code Playgroud)
如果file.txt存在则我必须跳过任务.
现在我在ansible中使用一个shell脚本,如果它在多行上会更加可读
- name: iterate user groups
shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
with_items: "{{ users }}"
Run Code Online (Sandbox Code Playgroud)
只是不确定如何在Ansible shell模块中允许多行脚本
我有一个ansible任务,在ubuntu 12.04上创建一个新用户;
- name: Add deployment user
action: user name=deployer password=mypassword
Run Code Online (Sandbox Code Playgroud)
它按预期完成,但当我以该用户身份登录并尝试使用我设置的密码sudo时,它总是说它不正确.我究竟做错了什么?
是否有一个ansible变量,它具有正在执行的当前ansible-playbook的绝对路径?
一些上下文:
我正在运行/创建一个ansible脚本localhost来配置一个mysql docker并希望相对于ansible脚本挂载数据卷.
例如,假设我已经将存储库签出~/branch1/,然后运行ansible-playbook dev.yml我认为它应该将卷保存到~/branch1/.docker_volume/.如果我~/branch2从那时开始运行它应该将卷配置为~/branch2/.docker_volume/.
只有当前剧本的主持人不属于某个组时,我才能运行一个ansible任务.在半伪代码中:
- name: my command
command: echo stuff
when: "if {{ ansible_hostname }} not in {{ ansible_current_groups }}"
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
假设我执行以下操作.
$ cat test.sh
#!/bin/bash
echo Hello World
exit 0
$ cat Hello.yml
---
- hosts: MyTestHost
tasks:
- name: Hello yourself
script: test.sh
$ ansible-playbook Hello.yml
PLAY [MyTestHost] ****************************************************************
GATHERING FACTS ***************************************************************
ok: [MyTestHost]
TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]
PLAY RECAP ********************************************************************
MyTestHost : ok=2 changed=0 unreachable=0 failed=0
$
Run Code Online (Sandbox Code Playgroud)
我确信它是成功的.
在远程主机(MyTestHost)上我的脚本在哪里/如何看到"Hello World"回显/打印?还是脚本的返回/退出代码?
我的研究表明,我可以编写一个插件来拦截模块执行回调或者那些行上的东西并编写一个日志文件.我宁愿不浪费我的时间.
例如下面的stdout(注意我运行的是ansible而不是ansible-playbook):
$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
"rc": 0,
"stderr": "",
"stdout": "Hello World\n"
}
$
Run Code Online (Sandbox Code Playgroud) 根据Ansible文档,Playbook 是:
...真正简单的配置管理和多机器部署系统的基础,与已有的系统不同,非常适合部署复杂的应用程序.
而且,根据那些相同的文档,角色 是:
...基于已知文件结构自动加载某些vars_files,任务和处理程序的方法.按角色对内容进行分组还可以轻松与其他用户共享角色.
但是,这些与不同用例之间的区别对我来说并不是很明显.例如,如果我将我的/etc/ansible/hosts文件配置为:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
Run Code Online (Sandbox Code Playgroud)
......那么这个" [databases]"条目是什么......一个角色?或者某个剧本YAML文件的名称?或者是其他东西?!?
如果有人可以向我解释这些差异,我对Ansible的理解会大大提升!
[databases]和类似的条目/etc/ansible/hostsansible.cfgAnsible服务器上的生活,如何使用可用的Playbooks/Roles添加/配置Ansible?例如,当我跑步时ansible-playbook someplaybook.yaml,Ansible如何知道在哪里找到该剧本?这是我正在使用的剧本片段(server.yml):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Run Code Online (Sandbox Code Playgroud)
我的主机文件有不同的服务器组,例如
[web]
x.x.x.x
[droplets]
x.x.x.x
Run Code Online (Sandbox Code Playgroud)
现在我想执行ansible-playbook -i hosts/<env> server.yml,并覆盖hosts: web从server.yml运行这个剧本的[droplets].
我可以直接覆盖一次性的东西,而不server.yml直接编辑吗?
谢谢.
我需要将文件格式机A复制到机器B,而我运行所有安全任务的控制机器是机器C(本地机器)
我尝试过以下方法:
在ansible的shell模块中使用scp命令
hosts: machine2
user: user2
tasks:
- name: Copy file from machine1 to machine2
shell: scp user1@machine1:/path-of-file/file1 /home/user2/file1
Run Code Online (Sandbox Code Playgroud)
这种方法一直持续下去.
使用获取和复制模块
hosts: machine1
user: user1
tasks:
- name: copy file from machine1 to local
fetch: src=/path-of-file/file1 dest=/path-of-file/file1
hosts: machine2
user: user2
tasks:
- name: copy file from local to machine2
copy: src=/path-of-file/file1 dest=/path-of-file/file1
Run Code Online (Sandbox Code Playgroud)
这种方法给我一个错误如下:
error while accessing the file /Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>, error was: [Errno 102] Operation not supported on socket: u'/Users/<myusername>/.ansible/cp/ansible-ssh-machine2-22-<myusername>'
Run Code Online (Sandbox Code Playgroud)
任何的意见都将会有帮助.