常见问题解答¶
执行环境¶
什么是执行环境?¶
执行环境是一个充当 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 的配置系统从各种来源提取设置,并按以下顺序分层应用它们(最后应用的更改是最主要的):
- 默认内部值
- 来自设置文件的值
- 来自环境变量的值
- 在命令行上指定的标志和参数
- 在基于文本的用户界面 (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
设置,该设置指示编辑器是否基于控制台/终端。以下是可能有用的备用设置示例
如何使用环境变量定义卷挂载?¶
由于卷挂载的定义可能包含 :
,因此需要用 ;
分隔它们。
$ 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 验证,但在实验室和非生产环境中可能需要这样做。可以在命令行或设置文件中提供拉取策略参数。
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
的用户。
- 为了与使用 OpenSSH 的 SSH 连接兼容,密钥会挂载到执行环境中默认用户的主目录中,如执行环境的
/etc/passwd
文件中用户的条目所指定。当不使用ssh-agent
而使用 OpenSSH 时,将仅使用使用默认名称(id_rsa
、id_dsa
、id_ecdsa
、id_ed25519
和id_xmss
)的密钥。使用ansible_ssh_private_key_file
将启用非默认命名密钥的使用。
-v /home/current_user/.ssh/:/root/.ssh/
(在使用执行环境和 --log-level debug
时在 ansible-navigator
日志文件中看到)
- 为了与使用
paramiko
的 SSH 连接兼容,密钥会挂载到执行环境中默认用户的主目录中,如执行环境中的HOME
环境变量所指定。当不使用ssh-agent
而使用paramiko
时,将仅使用默认名称(id_rsa
、id_dsa
或id_ecdsa
和id_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_prompt
,pause/prompt
或 --ask-pass
时,playbook 会挂起?¶
默认情况下,ansible-navigator
运行 playbook 的方式与 Ansible 控制器和 AWX 运行 playbook 的方式相同。这样做是为了帮助 playbook 开发人员编写可用于生产的 playbook。如果无法避免使用 vars_prompt
,pause\prompt
或 --ask-pass
,请使用 enable-prompts
参数,该参数会禁用 playbook-artifact
的创建,并将模式设置为 stdout
,从而使 ansible-navigator
以与 ansible-playbook
兼容的方式运行 playbook,并允许用户交互。
如何在不本地安装的情况下使用 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
中使用语法检查?¶
要检查 Ansible playbook 中的基本语法错误,可以使用 ansible-navigator run
命令来验证 playbook 的语法。这还允许用户在验证语法时指定 EE。
如果语法验证失败,则会报告语法错误,输出中包含 playbook 中语法问题的大概位置。
如何在 ansible-navigator
中使用 vault 密码?¶
以下选项在使用基于文本的用户界面(TUI)时,为 ansible-navigator
提供 vault 密码。请确保这些选项与您的企业安全标准不冲突。请勿将密码文件添加到源代码控制中。
- 将 vault 密码安全地存储在本地文件系统上
您可以使用您选择的工具(如 gpg、openssl 等)创建一个加密文件。但请注意,gpg 更好,因为您可以利用 gpg-agent,而无需一直输入密码。
然后,创建一个运行解密命令的 shell 脚本,例如
在您的项目中添加一个简单的 shell 脚本
现在,您可以使用该脚本的结果导出 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 中为其他用户显示您的密码。
- 将 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
- 将 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
启用调试日志记录。如果您认为可能发现了错误,请记录一个问题,并在其中包含日志文件中的详细信息。