在ansible中提取tar.gz文件时,我最终得到了第一个目录
- name: Extract archive
unarchive: src=file.tar.gz
dest=/foo/bar
Run Code Online (Sandbox Code Playgroud)
这导致/foo/bar/bar-version-someFirstLevelFolder/contentOfArchive
如何防止创建这种额外的层次结构?
Ansible 变量来自各种来源。例如,可以通过在包含清单文件的文件夹中分别命名为host_vars和的子文件夹中创建 YAML 文件来提供 host_vars 和 group_vars group_vars。
如何列出所有的变量Ansible会知道一个剧本内的组或主机?注意:我尝试过ansible -m debug -e 'var=hostvars' host,ansible -m debug -e '- debug: var=hostvars'但无济于事。
提示:ansible <group|host> -m setup是不是正确的答案,因为它并没有包括所有来自其他来源的变量(只包含{ "ansible_facts" : { ... } }在事实上,它甚至不包括通过由动态库存脚本(提供变量。_meta等)。
Ansible 版本:1.9.1。
使用 ansible 创建符号链接的正确语法是什么? 我正在创建一个 Vagrant 虚拟环境并作为我的供应商运行 ansible。一切正常,直到我尝试从启用了站点的站点符号链接到我的站点 nginx 配置文件。这是我尝试过的。
- name: Create symlink to example.com
file:
path: /etc/nginx/sites-enabled/example.com
dest: /etc/nginx/sites-available/example.com
state: link
notify: nginx reload
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我遇到了以下错误。
错误:加载 YAML 脚本时出现语法错误,/Users/username/project/ansible/roles/nginx/tasks/main.yml
注意:错误可能实际出现在这个位置之前:第24行,第1列
- 名称:指向 example.dev.conf 的符号链接
文件:路径=/etc/nginx/sites-enabled/example.dev.conf
状态=链接
^ Ansible 未能成功完成。任何错误输出都应该在上面可见。请修复这些错误,然后重试。
我也试过使用src=/etc/nginx/sites-enabled代替,path但我似乎无法在网上找到一个明确的例子。
眼镜:
我正在编写滚动升级手册,并想打印出当前已升级主机的主机名。
我输入inventory_hostname并输入ansible_hostname了任务名称,但这不起作用
- name: upgrade softare on {{inventory_hostname}}
- name: current host is {{ansible_hostname}}
Run Code Online (Sandbox Code Playgroud)
调试工作正常
- name: Test a variable
debug: var=inventory_hostname
TASK: [Test a variable] *******************************************************
ok: [SERV14] => {
"var": {
"inventory_hostname": "SERV14"
}
}
Run Code Online (Sandbox Code Playgroud)
那么我应该怎么做才能在任务名称描述中使用这些变量。
谢谢
我正在尝试使用 Ansible 任务按名称检索两个组(syslog和utmp)的组 ID 。出于测试目的,我创建了一个剧本来从 Ansible 主机本身检索信息。
---
- name: My playbook
hosts: enabled
sudo: True
connection: local
gather_facts: False
tasks:
- name: Determine GIDs
shell: "getent group {{ item }} | cut -d : -f 3"
register: gid_{{item}}
failed_when: gid_{{item}}.rc != 0
changed_when: false
with_items:
- syslog
- utmp
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在运行剧本时收到以下错误:
fatal: [hostname] => error while evaluating conditional: gid_syslog.rc != 0
Run Code Online (Sandbox Code Playgroud)
如何将这样的任务合并为参数化形式,同时注册单独的变量,每个项目一个,供以后使用?所以目标是拥有基于组名的变量,然后可以在以后的任务中使用。
我正在使用int过滤器,gid_syslog.stdout并gid_utmp.stdout在以后的任务中根据 GID …
如何使用 Yum 或其他方法安装特定版本的 Ansible?
当我尝试安装2.0 版时,它说No package 2.0 available。
我检查了 epel 回购。只有两个 rpm,但没有包含版本 2.0 的 rpm。为什么它们会被移除?有没有办法安装特定版本的ansible,比如2.0?
这已经是一个令人恼火的问题,现在我想我最终会向整个社区询问可能的解决方案是什么。更令人恼火的是,我似乎是唯一遇到此问题的人。
本质上,任何时候在 CentOS 7.x、sshd 配置或 sshd 的任何部分被修改,守护进程在接下来的 3 分钟内在某个“随机点”重新启动/重新加载,ssh 连接全部重置,然后该服务器是通过 ssh 几秒钟无法访问。
这对于 ansible 来说尤其是一个问题,因为它有时需要自己对 sshd 进行这些更改,并且还需要重新加载它(例如在新的 CentOS 7x 服务器构建中)。但是在将来播放时,它只是随机无法连接到 ssh,并且它会炸毁该主机的其余剧本/播放,但未能联系到该主机。这对于大型主机模式尤其不利,因为其中一些会随机完成,但在 sshd 被操纵后,其他的会在剧本的各个阶段失败。值得注意的是,在 CentOS 5x、6x 甚至 Solaris 上都不会发生这种情况。
为了避免这种情况,我能做的最好的事情是在对 sshd 进行任何更改后创建 90 秒的等待时间,即使这也不是完全万无一失的。如果调用 7-8 次,它会使这些剧本需要 20 多分钟才能运行。
以下是有关此环境的一些事实:
所有新安装都来自官方 ISO DVD。每台服务器都是 hyper-v 2012 来宾每台有这个问题的服务器都是 CentOS 7.x
以下是问题的一些实际输出和一些陈腐的解决方案:
失败:
fatal: [voltron]: UNREACHABLE! => {"changed": false, "msg": "All items completed", "results": [{"_ansible_item_result": true, "item": ["rsync", "iotop", "bind-utils", "sysstat.x86_64", "lsof"], "msg": "Failed to connect to the host via ssh: Shared connection to voltron …Run Code Online (Sandbox Code Playgroud) 我正在使用Ansible将MS SQL Server 2017 配置到CentOS 7.4 机器。我首先通过命令行浏览了本指南并且它有效,但我的最终目标是“Ansible-ize”它。但是,当我进入安装命令行工具的步骤时,该-y开关无法接受许可证。
[user@host ~]$ sudo yum install -y mssql-tools unixODBC-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package mssql-tools.x86_64 0:14.0.6.0-1 will be installed
--> Processing Dependency: msodbcsql < 13.2.0.0 for package: mssql-tools-14.0.6.0-1.x86_64
--> Processing Dependency: msodbcsql >= 13.1.0.0 for package: mssql-tools-14.0.6.0-1.x86_64
---> Package unixODBC-devel.x86_64 0:2.3.1-11.el7 will be installed
--> Running transaction check
---> Package msodbcsql.x86_64 0:13.1.9.1-1 …Run Code Online (Sandbox Code Playgroud) 通常,当我想打开由 ansible-vault 加密的文件进行编辑时,我只需运行ansible-vault edit <filename>- 这会将文件解密为临时文件并打开它进行编辑。
但是,我想知道的是如何从 vim 中实现这一点,例如通过使用:! ...command...语法运行 shell 命令。例如,我知道我可以通过在 vim 中打开加密文件来解密文件,然后运行:
:! ansible-vault edit %
Run Code Online (Sandbox Code Playgroud)
但这会在不同的窗口中使用 ansible-vault 打开文件,然后您必须按一个键才能返回 vim。
我想要做的是能够用 vim 打开这个文件,这样我就可以将它与其他常规文件或使用 ansible-vault 加密的文件一起编辑。目前我正在通过打开几个 tmux 窗格来做到这一点,但这有点像 PITA。
我在这里遇到了一个问题,我尝试使用 Ansible 自动进行设置。
某些步骤需要与 交互apt,但有时我会收到错误消息,因为无人值守升级已启动并已锁定。这将使剧本停止。
我已经尝试了很多方法来解决这个问题,最成功的是重复失败的 apt 命令。
但这不能扩展,也不是 100% 可靠并且感觉很糟糕。
我选择apt -y purge unattended-upgrades在剧本的开头发出权利。我也试过apt -y remove unattended-upgrades,但那个似乎还在工作时回来了。清除似乎在退出之前关闭无人值守升级,这就是我想要的。
但事实证明,即使是那个调用也apt -y purge unattended-upgrades可能由于锁定而失败。所以我把它改成了while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done,但偶尔也会失败(我不知道为什么)
我需要一个命令,该命令在执行时会立即终止并隐藏无人值守的升级,无论它是否正在运行,并保证一旦该命令返回它就不会再启动,直到我apt install再次明确表示为止。如果该命令需要一分钟来完成它的工作,那没关系。
此外,系统没有安装 Python,所以 Ansible 只发出raw命令,直到我设法安装 Python,这应该是在成功调用之后apt -y update
我处于可以轻松触发无人值守升级的状态,因为这是一个 VM,一旦我发出date -s更正过时日期的命令,无人值守升级就会启动。启动 VM 后,我有几分钟的时间直到date自动更正,然后开始无人值守升级。
这就是我现在正在做的:
- name: Disable autoupdate …Run Code Online (Sandbox Code Playgroud)