所以在我的代码中我有一个任务
- name: cool task
shell: 'touch iamnotcool.txt'
when: me.cool is not defined
Run Code Online (Sandbox Code Playgroud)
我的 vars 看起来像
---
me:
stumped: yes
Run Code Online (Sandbox Code Playgroud)
因此,当我运行任务时,它会返回以下错误
{"failed": true, "msg": "The conditional check 'me.cool' failed. The error was: error while evaluating conditional (me.cool): 'dict object' has no attribute 'cool'.
Run Code Online (Sandbox Code Playgroud) 我正在编写几个 Ansible 剧本来启动一个新的服务器实例。我需要按特定顺序运行大约 15 个不同的剧本才能成功启动服务器。
我最初的想法是编写一个 shell 脚本,该脚本执行ansible-playbook playbook_name.yml并为我需要运行的每个剧本复制一个条目。
有没有更聪明/更好的方法来使用主剧本来做到这一点,如果是这样,它会是什么样子(示例值得赞赏)。
我可以编写一个完整的剧本来完成所有工作,但有些剧本首先以 root 身份运行,然后以 sudo 用户身份运行。
我写了一个剧本,为每个用户安装和配置 Google Authenticator。
我想要catgoogle_authenticator 配置文件的剧本的最后一步。
使用“调试”模块,我能够将数据显示在屏幕上,但只能作为调试消息:
TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
"details.stdout_lines": [
"ZKMFTE2ADYA2OYCH",
"\"RATE_LIMIT 3 30",
"\" DISALLOW_REUSE",
"\" TOTP_AUTH",
"12920994",
"88224784",
"69464205",
"38144121",
"45634120"
]
}
Run Code Online (Sandbox Code Playgroud)
我在网上读到我可以做这样的事情:
- name: Print to screen google authenticator details
command: /bin/cat {{ google_authenticator_secret_file_location }}
register: details
tags: google_2fa_user
- debug: msg="{{ details.stdout_lines }}"
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时出现错误:
TASK: [Print to screen google authenticator details] **************************
changed: [localhost]
TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 在游戏层面,我们必须serial: 1允许我们一次一个主机运行整个游戏。但是我还没有找到一种简单的方法来在单个任务上做到这一点。如果有问题的任务没有执行正确的锁定(无论出于何种原因),这尤其重要。
一个明显的答案是将任务放在自己的游戏中。但这对角色没有帮助。(不得不serial: 1使用这个角色来演戏并不是很直观。)
有没有办法销毁 Ansible 中的变量?
实际上,我在各个包的所有角色中都使用了一个 {{version}} 变量。当我运行多个角色时,一个角色的版本值会传递给另一个角色 - 这是因为对于某些角色,我没有提供版本值,以便它可以安装可用于相应 m/c 的该软件包的默认版本,例如 ubuntu/红帽等
这是我的角色模板。来自 mysql 的 {{version}} 值被传递给 rabbitmq。
roles:
- { role: mysql }
- { role: rabbitmq}
Run Code Online (Sandbox Code Playgroud)
如果我可以在每个角色中销毁/删除版本的值,我相信它应该可以解决问题。
由于各种原因/限制,我无法在清单文件中创建新组,并且需要使用--limit/-l它来指定主机。
我被告知要做类似的事情:
ansible-playbook -i /path/to/my/inventory/file.ini -l server.1.com server.2.com my-playbook.yml --check --diff
这引发了一个错误:
ERROR! the playbook: server.2.com could not be found
从有关此主题的Ansible 文档中,我发现您可以使用单独的文件来列出您想要限制的所有主机。就像是:
ansible-playbook -i /path/to/my/inventory/file.ini -l @list-to-limit.txt my-playbook.yml
但是,我需要内联完成这一切,而不创建额外的文件。
我正在学习 ansible 并编写了简单的剧本,但我不明白或者我做错了什么处理程序不起作用!请帮我。
我的剧本:
- hosts: HA
gather_facts: False
tasks:
- name: Installs pacemaker
yum: pkg=pacemaker,pcs,resource-agents state=latest
notify:
- pcsd start
handlers:
- name: pcsd start
systemd: name=pcsd state=started
Run Code Online (Sandbox Code Playgroud)
他跳过通知:
PLAY [HA] **********************************************************************
TASK [Installs pacemaker] ******************************************************
ok: [test-ha2]
ok: [test-ha1]
PLAY RECAP *********************************************************************
test-ha1 : ok=1 changed=0 unreachable=0 failed=0
test-ha2 : ok=1 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud) 我正在尝试遵循参数/示例,但在执行 Ansible'playbook 时遇到以下警告消息:
TASK [apt (pre)] ********************************************************************************************
[WARNING]: The value True (type bool) in a string field was converted to u'True' (type string). If this does
not look like what you expect, quote the entire value to ensure it does not change.
Run Code Online (Sandbox Code Playgroud)
剧本的相关部分:
- name: apt (pre)
apt:
update_cache: yes
upgrade: yes
Run Code Online (Sandbox Code Playgroud)
请指教。
我们开始研究 Ansible 来替换旧的 cfengine2 安装。我有一个简单的剧本:
该剧本需要超过 4 分钟的挂钟时间才能在 97 台机器上运行(全部通过快速 1gig 或 10gig 网络连接,LAN 延迟低于 1 毫秒),并且在我使用 2 核 4G 内存 VM 时消耗了超过 50% 的 CPU运行它。
在单台机器上运行大约需要 11 秒,消耗了大约 4 秒的用户+系统 CPU 时间,对于所涉及的工作量来说,TBH 似乎仍然有点过分。
明显的位:
这种性能水平是正常的还是我的设置有问题?如果是这样,我该如何确定什么?
编辑:截至 2017 年 8 月,我们仍然看到这个问题。Ansible 版本是 2.2.1,现在剧本的大小已经增加。最新数字:
ansible -m ping all 实际需要 4.6 …我在 Ansible 任务中有以下条件:
when: ec2_tag_Name == 'testhost01'
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是我想在ec2_tag_Name场上匹配通配符。
所以像这样
when: ec2_tag_Name == 'testhost*'
Run Code Online (Sandbox Code Playgroud)
目标是匹配诸如testhostx testhost12 testhostABCetc 之类的任何内容testhost,仅匹配字符串开头的任何内容。
这可能吗?似乎无法让它工作。