跳到内容

常见问题解答

执行环境

什么是执行环境?

执行环境是一个充当 Ansible 控制节点的容器镜像。

有关详细信息,请参阅执行环境入门指南

ansible.cfg 文件

使用执行环境时,ansible.cfg 文件应该放在哪里?

最简单的做法是将 ansible.cfg 放在与 playbook 相邻的项目目录中。playbook 目录会自动挂载到执行环境中,并且会找到 ansible.cfg 文件。如果 ansible.cfg 文件位于另一个目录中,则需要设置 ANSIBLE_CONFIG 变量,并将该目录指定为自定义卷挂载。(请参阅设置指南了解 execution-environment-volume-mounts

不使用执行环境时,ansible.cfg 文件应该放在哪里?

当不使用执行环境时,Ansible 将在典型位置查找 ansible.cfg。(有关可能性,请参阅 Ansible 文档)

Ansible 集合的放置

使用执行环境时,Ansible 集合应该放在哪里?

最简单的做法是将 Ansible 集合放在项目目录中,在与 playbook 相邻的集合目录中。(例如 ansible-galaxy collection install ansible.utils -p ./collections)。playbook 目录会自动挂载到执行环境中,并且应找到集合。另一种选择是使用 ansible builder 将集合构建到执行环境中。这样做是为了帮助 playbook 开发人员编写生产就绪的 playbook,因为 Ansible Controller 和 AWX 都支持与 playbook 相邻的集合目录。如果集合位于另一个目录中,则需要设置 ANSIBLE_COLLECTIONS_PATHS 变量,并将该目录指定为自定义卷挂载。(请参阅设置指南了解 execution-environment-volume-mounts

不使用执行环境时,Ansible 集合应该放在哪里?

当不使用执行环境时,Ansible 将在默认位置查找集合。有关这些的更多信息,请查看集合指南

ansible-navigator 设置

配置设置的应用顺序是什么?

ansible-navigator 的配置系统从各种来源提取设置,并按以下顺序分层应用它们(最后应用的更改是最主要的):

  1. 默认内部值
  2. 来自设置文件的值
  3. 来自环境变量的值
  4. 在命令行上指定的标志和参数
  5. 在基于文本的用户界面 (TUI) 中发出 : 命令时

为什么 ansible-navigator 会更改终端颜色或看起来很糟糕?

ansible-navigator 查询终端的 OSC4 兼容性。OSC4、10、11、104、110、111 表示终端支持颜色更改和还原。终端可能错误地表示其能力。可以通过设置 --osc4 false 来禁用 OSC4 检测。(请参阅设置指南,了解如何使用环境变量或在设置文件中处理此问题)

如何更改 ansible-navigator 使用的颜色

完整的主题支持应该会在以后的版本中推出,现在,请尝试 --osc4 false。这将导致 ansible-navigator 使用终端定义的颜色。(请参阅设置指南,了解如何使用环境变量或在设置文件中处理此问题)

在 playbook 目录中,所有这些 site-artifact-2021-06-02T16:02:33.911259+00:00.json 文件是什么?

ansible-navigator 为每次 playbook 运行创建一个 playbook 工件。这些工件有助于在自动化完成后审查结果、与同事共享和排除故障,或为合规性或变更控制目的保留。playbook 工件文件包含有关每个 play 和任务的详细信息,以及来自 playbook 运行的 stdout。可以使用 ansible-navigator replay <filename> 或在 ansible-navigator 会话中使用 :replay <filename> 来审查 playbook 工件。可以使用 --mode stdout--mode interactive 来审查所有 playbook 工件,具体取决于所需的视图。可以禁用 playbook 工件的写入,也可以更改默认的文件命名约定。(请参阅设置指南了解更多信息)

当我使用 :open 时,为什么会打开 vi

ansible-navigator 将在默认编辑器中打开终端中显示的任何内容。默认值设置为 vi +{line_number} {filename}EDITOR 环境变量的当前值。与此相关的是 editor-console 设置,该设置指示编辑器是否基于控制台/终端。以下是可能有用的备用设置示例

# emacs
ansible-navigator:
  editor:
    command: emacs -nw +{line_number} {filename}
    console: true
# vscode
ansible-navigator:
  editor:
    command: code -g {filename}:{line_number}
    console: false
#pycharm
ansible-navigator:
  editor:
    command: charm --line {line_number} {filename}
    console: false

如何使用环境变量定义卷挂载?

由于卷挂载的定义可能包含 :,因此需要用 ; 分隔它们。

$ export ANSIBLE_NAVIGATOR_EXECUTION_ENVIRONMENT_VOLUME_MOUNTS /tmp/1:/tmp/1\;/tmp/2:/tmp/2:Z
$ ansible-navigator exec
bash-4.4# ls /tmp/1
file.txt

在拉取执行环境镜像时,如何禁用 tls-verify

虽然不建议禁用 TLS 验证,但在实验室和非生产环境中可能需要这样做。可以在命令行或设置文件中提供拉取策略参数。

$ ansible-navigator --pull-arguments=--tls-verify=false
ansible-navigator:
  execution-environment:
    pull:
      arguments:
        - "--tls-verify=false"

SSH 密钥

如何在执行环境中使用我的 SSH 密钥?

在执行环境中使用 SSH 密钥的最简单方法是使用 ssh-agent 并使用默认密钥名称。如果密钥未使用默认密钥名称之一,请根据需要注册密钥。(~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/id_ecdsa~/.ssh/id_ed25519~/.ssh/identity。(例如 ssh-add ~/.ssh/my_key)。ansible-navigator 将通过卷挂载 SSH 身份验证套接字路径并设置 SSH_AUTH_SOCK 环境变量来自动设置并在执行环境中启用 ssh-agent 的使用。(例如

-v /run/user/1000/keyring/:/run/user/1000/keyring/ -e SSH_AUTH_SOCK=/run/user/1000/keyring/ssh (在使用执行环境和 --log-level debug 时在 ansible-navigator 日志文件中看到)

使用 ssh-agent 可以简化配置,并消除在使用 ansible-navigator 与执行环境时 SSH 密钥密码的问题。

此外,ansible-navigator 会自动将用户的 SSH 密钥以两种不同的方式挂载到执行环境中,以帮助未运行 ssh-agent 的用户。

  1. 为了与使用 OpenSSH 的 SSH 连接兼容,密钥会挂载到执行环境中默认用户的主目录中,如执行环境的 /etc/passwd 文件中用户的条目所指定。当不使用 ssh-agent 而使用 OpenSSH 时,将仅使用使用默认名称(id_rsaid_dsaid_ecdsaid_ed25519id_xmss)的密钥。使用 ansible_ssh_private_key_file 将启用非默认命名密钥的使用。

-v /home/current_user/.ssh/:/root/.ssh/(在使用执行环境和 --log-level debug 时在 ansible-navigator 日志文件中看到)

  1. 为了与使用 paramiko 的 SSH 连接兼容,密钥会挂载到执行环境中默认用户的主目录中,如执行环境中的 HOME 环境变量所指定。当不使用 ssh-agent 而使用 paramiko 时,将仅使用默认名称(id_rsaid_dsaid_ecdsaid_ed25519)的密钥。使用 ansible_ssh_private_key_file 将启用非默认命名密钥的使用。

-v /home/current_user/.ssh/:/home/runner/.ssh/(在使用执行环境和 --log-level debug 时在 ansible-navigator 日志文件中看到)

注意:当将 ansible_ssh_private_key_file 与执行环境一起使用时,密钥的路径需要引用其在被卷挂载到执行环境后的位置。(例如 /home/runner/.ssh/key_name/root/.ssh/key_name)。 将密钥路径指定为 ~/.ssh/key_name 可能很方便,无论是否使用执行环境,它都将解析为用户的主目录。

ansible-* 工具的兼容性

为什么当使用 vars_promptpause/prompt--ask-pass 时,playbook 会挂起?

默认情况下,ansible-navigator 运行 playbook 的方式与 Ansible 控制器和 AWX 运行 playbook 的方式相同。这样做是为了帮助 playbook 开发人员编写可用于生产的 playbook。如果无法避免使用 vars_promptpause\prompt--ask-pass,请使用 enable-prompts 参数,该参数会禁用 playbook-artifact 的创建,并将模式设置为 stdout,从而使 ansible-navigator 以与 ansible-playbook 兼容的方式运行 playbook,并允许用户交互。

$ ansible-navigator run site.yml --enable-prompts --ask-pass

如何在不本地安装的情况下使用 ansible-test

可以使用 exec 子命令从执行环境中使用 ansible-test 工具。

$ cd  ./collections/ansible_collections/ansible/utils/
$ ansible-navigator exec -- ansible-test sanity --python 3.10

如何使用 ansible-playbook 参数,如 --forks 15

所有未被 ansible-navigator 直接使用的参数都将传递给 ansible-playbook 命令。这些参数可以在 ansible-navigator 参数之后内联提供,也可以用 -- 分隔。

$ ansible-navigator run site.yml --forks 15
$ ansible-navigator run site.yml -- --forks 15

如何在 ansible-navigator 中使用语法检查?

要检查 Ansible playbook 中的基本语法错误,可以使用 ansible-navigator run 命令来验证 playbook 的语法。这还允许用户在验证语法时指定 EE。

$ ansible-navigator run site.yml -m stdout --syntax-check

如果语法验证失败,则会报告语法错误,输出中包含 playbook 中语法问题的大概位置。

如何在 ansible-navigator 中使用 vault 密码?

以下选项在使用基于文本的用户界面(TUI)时,为 ansible-navigator 提供 vault 密码。请确保这些选项与您的企业安全标准不冲突。请勿将密码文件添加到源代码控制中。

  1. 将 vault 密码安全地存储在本地文件系统上

您可以使用您选择的工具(如 gpg、openssl 等)创建一个加密文件。但请注意,gpg 更好,因为您可以利用 gpg-agent,而无需一直输入密码。

然后,创建一个运行解密命令的 shell 脚本,例如

cat <<EOF > ~/bin/vault.sh
#!/bin/sh

gpg -d /path/to/encrypted_file.asc
EOF
chmod +x ~/bin/vault.sh

在您的项目中添加一个简单的 shell 脚本

cat <<EOF > vault.sh
#!/bin/sh

echo $ANSIBLE_VAULT_PASSWORD
EOF
chmod +x vault.sh

现在,您可以使用该脚本的结果导出 ANSIBLE_VAULT_PASSWORD,并在运行 ansible-navigator 时将 ANSIBLE_VAULT_PASSWORD_FILE 设置为该脚本。

ANSIBLE_VAULT_PASSWORD="$( ~/bin/vault.sh )" ansible-navigator run --senv=ANSIBLE_VAULT_PASSWORD_FILE=vault.sh --penv=ANSIBLE_VAULT_PASSWORD (...)

它甚至不会在 ps 中为其他用户显示您的密码。

  1. 将 vault 密码(明文,不安全地)存储在本地文件系统上
$ touch ~/.vault_password
$ chmod 600 ~/.vault_password
# The leading space here is necessary to keep the command out of the command history
$  echo my_password >> ~/.vault_password
# Link the password file into the current working directory
$ ln ~/.vault_password .
# Set the environment variable to the location of the file
$ export ANSIBLE_VAULT_PASSWORD_FILE=.vault_password
# Pass the variable into the execution-environment
$ ansible-navigator run --pass-environment-variable ANSIBLE_VAULT_PASSWORD_FILE site.yml
  1. 将 vault 密码存储在环境变量中

这是第一个选项的不太安全的版本。

您的环境很可能禁止将密码以明文形式保存在磁盘上。如果您受此类规则约束,那么显然也包括 shell 保存到磁盘的任何命令历史记录文件。

如果您使用 bash,则可以利用 HISTCONTROL 和一个 环境变量,如下例所示。

$ touch ~/.vault_password.sh
$ chmod 700 ~/.vault_password.sh
$ echo -e '#!/bin/sh\necho ${ANSIBLE_VAULT_PASSWORD}' >> ~/.vault_password.sh
# Link the password file into the current working directory
$ ln ~/.vault_password.sh .
# The leading space here is necessary to keep the command out of the command history
# by using an environment variable prefixed with ANSIBLE it will automatically get passed
# into the execution environment
$ HISTCONTROL=ignorespace
$  export ANSIBLE_VAULT_PASSWORD=my_password
# Set the environment variable to the location of the file when executing ansible-navigator
$ ANSIBLE_VAULT_PASSWORD_FILE=.vault_password.sh ansible-navigator run site.yml

有关 ansible-vault 的其他信息,请参阅 此处

其他

如何在执行环境中运行复杂的命令?

将复杂命令传递给执行环境的最简单方法是使用 -- 分隔符。 -- 之后的所有内容都将传递到执行环境中。

$ ansible-navigator exec -- ansible --version | head -n 1 | awk -F '\\[|\\]|\\s' '{print $4}'
2.12.4rc1.post0

为什么我会收到有关 /dev/mqueue 缺失的错误?

虽然 /dev/mqueue 目录不被 ansible-navigator 使用,但在使用 podman 时当前是必需的。并非所有操作系统默认都具有 /dev/mqueue 目录。

请参阅您的操作系统关于 POSIX 消息队列的文档,或者直接创建该目录。

某些功能无法正常工作,如何进行故障排除?

ansible-navigator 具有合理的日志消息,可以使用 --log-level debug 启用调试日志记录。如果您认为可能发现了错误,请记录一个问题,并在其中包含日志文件中的详细信息。