标签: ansible-playbook

有没有办法检查 ansible 任务中未定义字典键?

所以在我的代码中我有一个任务

- 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)

conditional ansible ansible-playbook

31
推荐指数
2
解决办法
6万
查看次数

如何使用 Ansible 按顺序运行多个剧本?

我正在编写几个 Ansible 剧本来启动一个新的服务器实例。我需要按特定顺序运行大约 15 个不同的剧本才能成功启动服务器。

我最初的想法是编写一个 shell 脚本,该脚本执行ansible-playbook playbook_name.yml并为我需要运行的每个剧本复制一个条目。

有没有更聪明/更好的方法来使用主剧本来做到这一点,如果是这样,它会是什么样子(示例值得赞赏)。

我可以编写一个完整的剧本来完成所有工作,但有些剧本首先以 root 身份运行,然后以 sudo 用户身份运行。

ansible ansible-playbook

27
推荐指数
3
解决办法
5万
查看次数

Ansible:是否可以在播放剧本而不是调试时“cat 文件”并将其输出导出到屏幕?

我写了一个剧本,为每个用户安装和配置 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)

debug ansible ansible-playbook

24
推荐指数
2
解决办法
6万
查看次数

Ansible:如何按主机运行一个任务主机?

在游戏层面,我们必须serial: 1允许我们一次一个主机运行整个游戏。但是我还没有找到一种简单的方法来在单个任务上做到这一点。如果有问题的任务没有执行正确的锁定(无论出于何种原因),这尤其重要。

一个明显的答案是将任务放在自己的游戏中。但这对角色没有帮助。(不得不serial: 1使用这个角色来演戏并不是很直观。)

task ansible ansible-playbook

23
推荐指数
3
解决办法
5万
查看次数

如何在 Ansible 中销毁/删除/取消设置变量值?

有没有办法销毁 Ansible 中的变量?

实际上,我在各个包的所有角色中都使用了一个 {{version}} 变量。当我运行多个角色时,一个角色的版本值会传递给另一个角色 - 这是因为对于某些角色,我没有提供版本值,以便它可以安装可用于相应 m/c 的该软件包的默认版本,例如 ubuntu/红帽等

这是我的角色模板。来自 mysql 的 {{version}} 值被传递给 rabbitmq。

    roles:
- { role: mysql }
- { role: rabbitmq}
Run Code Online (Sandbox Code Playgroud)

如果我可以在每个角色中销毁/删除版本的值,我相信它应该可以解决问题。

ansible ansible-playbook

15
推荐指数
4
解决办法
3万
查看次数

ansible-playbook --限制超过一台主机?

由于各种原因/限制,我无法在清单文件中创建新组,并且需要使用--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 ansible-playbook

15
推荐指数
3
解决办法
7万
查看次数

为什么 ansible notify 不起作用?

我正在学习 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 ansible-playbook

14
推荐指数
1
解决办法
1万
查看次数

字符串字段中的值 True(类型 bool)被转换为 u'True'(类型字符串)

我正在尝试遵循参数/示例,但在执行 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 ansible-playbook

14
推荐指数
1
解决办法
4788
查看次数

一个简单的 Ansible playbook 针对大约 100 个主机的合理性能是多少?

我们开始研究 Ansible 来替换旧的 cfengine2 安装。我有一个简单的剧本:

  • 复制 sudoers 文件
  • 复制模板化的 resolv.conf(输入 group_vars 和 host_vars 数据)
  • 检查几个服务正在运行
  • 检查本地用户的存在

该剧本需要超过 4 分钟的挂钟时间才能在 97 台机器上运行(全部通过快速 1gig 或 10gig 网络连接,LAN 延迟低于 1 毫秒),并且在我使用 2 核 4G 内存 VM 时消耗了超过 50% 的 CPU运行它。

在单台机器上运行大约需要 11 秒,消耗了大约 4 秒的用户+系统 CPU 时间,对于所涉及的工作量来说,TBH 似乎仍然有点过分。

明显的位:

  • 我在 playbook-dir local ansible.cfg 中明确启用了流水线
  • 我启用了对 jsonfile 的事实缓存,相同的本地 ansible.cfg
  • 我将叉设置为 50,相同(我尝试过其他值)
  • 我确信 Ansible 使用的是 SSH 而不是 Paramiko,它使用的是持久控制套接字——我可以看到 SSH 进程正在启动并在运行期间持续存在。

这种性能水平是正常的还是我的设置有问题?如果是这样,我该如何确定什么?

编辑:截至 2017 年 8 月,我们仍然看到这个问题。Ansible 版本是 2.2.1,现在剧本的大小已经增加。最新数字:

  • 98台主机
  • ansible -m ping all 实际需要 4.6 …

ansible ansible-playbook

11
推荐指数
1
解决办法
1384
查看次数

Ansible 条件 - 通配符匹配字符串

我在 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,仅匹配字符串开头的任何内容。

这可能吗?似乎无法让它工作。

ansible ansible-playbook

11
推荐指数
2
解决办法
2万
查看次数

标签 统计

ansible ×10

ansible-playbook ×10

conditional ×1

debug ×1

task ×1