[ 英语 | 印度尼西亚语 | 俄语 ]

运行临时 Ansible playbook

熟悉运行临时 Ansible 命令对于操作您的 OpenStack-Ansible 部署很有帮助。为了回顾,我们可以查看以下 Ansible 命令的结构

$ ansible example_group -m shell -a 'hostname'

此命令调用 Ansible 运行 example_group,使用 -m shell 模块,并使用 -a 参数,该参数是 hostname 命令。您可以将 example_group 替换为您可能定义的任何组。例如,如果您在某个组中拥有 compute_hosts,在另一个组中拥有 infra_hosts,则提供任一组名并运行该命令。您还可以使用 * 通配符,如果您只知道组名的第一部分,例如,如果您知道组名以 compute 开头,您将使用 compute_h*-m 参数用于模块。

模块可用于控制系统资源或处理系统命令的执行。有关模块的更多信息,请参阅 模块索引关于模块

如果您需要对组的子集运行特定命令,可以使用 limit 标志 -l。例如,如果 compute_hosts 组包含 compute1compute2compute3compute4,并且您只需要在 compute1compute4 上执行命令,您可以将命令限制如下

$ ansible example_group -m shell -a 'hostname' -l compute1,compute4

注意

每个主机用逗号分隔,没有空格。

注意

openstack-ansible/playbooks 目录运行临时 Ansible 命令。

有关更多信息,请参阅 InventoryPatterns

运行 shell 模块

最常用的两个模块是 shellcopy 模块。 shell 模块接受命令名称,后跟一个由空格分隔的参数列表。它几乎就像 command 模块一样,但通过 shell (/bin/sh) 在远程节点上运行该命令。

例如,您可以使用 shell 模块来检查一组计算主机上的磁盘空间量

$ ansible compute_hosts -m shell -a 'df -h'

要检查您的 Galera 集群的状态

$ ansible galera_container -m shell -a "mariadb \
-e 'show status like \"%wsrep_cluster_%\";'"

当将模块用作临时命令时,有一些参数是不需要的。例如,对于 chdir 命令,在从 CLI 运行 Ansible 时,无需 chdir=/home/user ls

$ ansible compute_hosts -m shell -a 'ls -la /home/user'

有关更多信息,请参阅 shell - 在节点中执行命令

运行 copy 模块

copy 模块将本地机器上的文件复制到远程位置。要将文件从远程位置复制到本地机器,您将使用 fetch 模块。如果您需要在复制的文件中使用变量插值,请使用 template 模块。有关更多信息,请参阅 copy - 将文件复制到远程位置

以下示例显示了如何将文件从您的部署主机移动到一组远程机器上的 /tmp 目录

$ ansible remote_machines -m copy -a 'src=/root/FILE '\
'dest=/tmp/FILE'

fetch 模块从远程机器收集文件,并将文件存储在本地文件树中,按主机名组织。

注意

该模块会传输可能不存在的日志文件,因此缺少远程文件不会导致错误,除非将 fail_on_missing 设置为 true

以下示例显示了从单个计算主机拉取 nova-compute.log 文件

root@libertylab:/opt/rpc-openstack/openstack-ansible/playbooks# ansible compute_hosts -m fetch -a 'src=/var/log/nova/nova-compute.log dest=/tmp'
aio1 | success >> {
    "changed": true,
    "checksum": "865211db6285dca06829eb2215ee6a897416fe02",
    "dest": "/tmp/aio1/var/log/nova/nova-compute.log",
    "md5sum": "dbd52b5fd65ea23cb255d2617e36729c",
    "remote_checksum": "865211db6285dca06829eb2215ee6a897416fe02",
    "remote_md5sum": null
}

root@libertylab:/opt/rpc-openstack/openstack-ansible/playbooks# ls -la /tmp/aio1/var/log/nova/nova-compute.log
-rw-r--r-- 1 root root 2428624 Dec 15 01:23 /tmp/aio1/var/log/nova/nova-compute.log

使用标签

标签类似于 limit 标志,用于组,但标签用于仅运行 playbook 中的特定任务。有关标签的更多信息,请参阅 Tags

Ansible 分叉

OpenSSH Daemon 的默认 MaxSessions 设置为 10。每个 Ansible 分叉都会使用一个会话。默认情况下,Ansible 将分叉数设置为 5。但是,您可以增加用于提高大型环境中的部署性能的分叉数。

超过 10 个分叉会导致任何使用 delegate_tolocal_action 任务的 playbook 出现问题。建议不要在执行控制平面时增加分叉数,因为这是最常使用委托的地方。

在增加 Ansible 分叉数时,尤其是在超过 10 个分叉时,由于默认 sshd 设置 MaxStartups 10:30:100,可能会出现 SSH 连接问题。此设置限制了同时未通过身份验证的 SSH 连接的数量为 10,之后新的连接尝试开始以概率性的方式被丢弃——最初为 30%,随着连接数接近 100 而线性增加到 100%。

可以通过在 .bashrc 文件中包含对 ANSIBLE_FORKS 的适当更改,永久更改使用的分叉数。或者,可以使用 --forks CLI 参数来更改特定 playbook 执行的分叉数。例如,以下内容使用 10 个分叉针对控制平面执行 nova playbook,然后使用 50 个分叉针对计算节点执行。

# openstack-ansible --forks 10 os-nova-install.yml --limit compute_containers
# openstack-ansible --forks 50 os-nova-install.yml --limit compute_hosts

有关分叉的更多信息,请参阅以下参考

  • Ansible forks ansible.cfg 条目