我用这个剧本创建了一本剧本:
在主机上hypervisors
:
add_host
将所有这些添加到名为的新库存组中guests
我的库存:
[hypervisors]
host1
host2
Run Code Online (Sandbox Code Playgroud)
我的剧本:
- hosts: hypervisors
- shell: virsh list | awk 'NR>2' | awk '{print $2}'
register: result_virsh
- add_host:
name: "{{ item }}"
group: "guests"
with_items: "{{ result_virsh.stdout_lines }}"
Run Code Online (Sandbox Code Playgroud)
模块add_host
绕过播放主机循环,仅对播放中的所有主机运行一次.
然后它被调用一次(对于host1),这是使用这个模块的特殊情况(参见上面的链接),好像该变量run_once
被隐式修复true
.
如何将它用于组中的所有主机hypervisors
?
编辑:仅使用localhost在计算机上重现它的示例
创建文件/ tmp/host1_test以模拟guest虚拟机vm1和vm2的返回:
vm1
vm2
Run Code Online (Sandbox Code Playgroud)
创建文件/ tmp/host2_test以模拟guest虚拟机vm3和vm4的返回:
vm3
vm4
Run Code Online (Sandbox Code Playgroud)
将此清单( …
Ansible v2.2.1.0
我想收集有关在我的inv/remote_hosts
文件中定义的远程主机的 Ansible 事实,如下所示:
[remote-host-0]
10.22.123.234
[remote-host-1]
10.22.234.123
Run Code Online (Sandbox Code Playgroud)
如何运行 setup 命令并告诉它为 remote-host-0 收集事实?
$ ansible ??? -m setup ???
Run Code Online (Sandbox Code Playgroud)
如果我只是这样做:
$ ansible remote-host-0 -m setup
Run Code Online (Sandbox Code Playgroud)
我得到:
错误!尝试将“/path_to_my_ansible_dir/ansible//hosts”读作 YAML:加载 YAML 时出现语法错误。
它正在寻找错误的主机文件,但我收到了 YAML 错误。
我有一个大致如下所示的主机文件:
[kibanamaster]
efk host_ip host user passwd
[elasticnode]
esnode host_ip user passwd
Run Code Online (Sandbox Code Playgroud)
我正在尝试以下风格的东西
- name: get ip address node1
debug: var=hostvars[inventory_host]['esnode']['ansible_default_ipv4']['address']
register: es_node1
Run Code Online (Sandbox Code Playgroud)
但我得到未定义的变量。有没有人可以帮忙?
编辑:如果我这样做
debug: var=hostvars[LOG1]['esnode']['ansible_default_ipv4']['address']
register: node_1
Run Code Online (Sandbox Code Playgroud)
我得到
{"hostvars[LOG1]['ansible_default_ipv4']['address']": "VARIABLE IS NOT DEFINED!"}
我想在我使用group_by模块动态创建的多个主机组上运行包含某些角色的剧本.
我能够像下面的例子那样做(ping替换我的实际角色).
我想知道是否有办法在循环中单独运行每个组而不是列出所有实例ID.我不想为每个实例id创建一个重复的行.
这里的目的是一次部署到每个数据中心的一个实例,而不是使用需要很长时间的低序列运行所有实例.
可能有不同的方法,我不想在清单中为每个instance_id创建静态组.
---
- hosts: tag_type_edgenode
tasks:
- group_by: key=instance_id_{{instance_id}}
register: dyn_groups
- hosts: instance_id_1
tasks:
- ping:
- hosts: instance_id_2
tasks:
- ping:
- hosts: instance_id_3
tasks:
- ping:
- hosts: instance_id_4
tasks:
- ping:
Run Code Online (Sandbox Code Playgroud) 我正在尝试使它仅适用于我的dev和hydra服务器。我有2个主机文件,其中有主机。dev-all主机组是
[dev-all:children]
dev-group1
dev-group2
hydra组仅包含一台服务器,但位于不同的主机文件中。当我运行ansible时,我使用hydra group这样的命令,ansible-playbook -i environments/hydra site.yml
而对于dev组则使用此命令ansible-playbook -i environments/dev site.yml
。
我的问题是,当条件仅在调用hydra时适用于hydra或在调用dev时仅适用于dev-all时,如何获得此信息?这将帮助我避免将此组添加到另一个主机文件中的prod服务器中。dev-all组在dev文件中包含许多dev服务器组,而我基本上是试图从主机文件中包含所有这些服务器组,因此我将dev-all:children组包含在内。
我似乎无法让它们匹配when OR条件。也许有更好的方式编写when语句。
- name: add dev environment sudo user group
group: name=dev_sudo state=present gid=8002
tags:
- groups
- sudo-group
when: (inventory_hostname in groups["dev-all"]) or (inventory_hostname in groups['hydra'])
使用 Ansible,我试图在剧本级别定义某种默认变量 - 让我们称之为剧本默认值- 它优先于角色默认值,但可以被库存清单group_vars/所有变量覆盖。
如何定义某种剧本默认变量,该变量优先于角色默认值,但同时可以被清单(环境)覆盖?
目前 Ansible 2.x 变量优先级如下:
- 角色默认值
- 库存文件或脚本组变量
- 库存组_vars/全部
- 剧本 group_vars/all
我希望实现的目标是:
- 角色默认值
- 剧本默认值
- 库存文件或脚本组变量
- 库存组_vars/全部
- 剧本 group_vars/all
从我之前使用的大多数工具和应用程序来看,在环境级别(开发、测试、QA、产品等)定义的变量优先于“应用程序”变量,而“应用程序”变量本身优先于“外部”组件。那么优先顺序如下:
环境具有最高优先级。但我找不到用 Ansible 重现这种模式的方法。这些事情在 Chef(外部说明书默认值被包装器说明书默认值覆盖)和 Puppet 中很容易,但我找不到使用 Ansible 实现相同目的的方法。
让我们考虑一个由多个与 Web 服务器交互的服务组成的应用程序。这些服务是通用的,并在我组织的其他部分中重复使用,但就我而言,我使用了 apache2。我有这些角色:
这些默认变量:
# roles/apache/defaults/main.yml
apache_listen_port: 80
# roles/green_service/defaults/main.yml
green_service_port: 80
# roles/blue_service/defaults/main.yml
blue_service_port: 80
# roles/red_service/defaults/main.yml
red_service_port: 80
Run Code Online (Sandbox Code Playgroud)
每个服务都必须知道 apache 端口,这在默认值中表示。如果其他应用程序需要 Nginx 或其他网络服务器的绿色服务,则只需包含相关角色即可。
现在,如果我想在一个或多个环境中将端口从 …
我正在尝试在 Ansible Tower 中实现自定义脚本来动态导入库存。自定义脚本基本上是使用 Python 编写的,并与充当域控制器 (DC) 的 Windows 2012 Server 进行交互。当从 Ansible Tower 执行脚本时,它会从 DC 中提取所有工作站并添加到 Ansible 清单中。为此,我必须在 Python 脚本中以纯文本形式传递 DC 的登录凭据,这是不希望的。因此,我们正在寻找是否有一种方法可以在 Ansible Tower 中存储凭证并将其作为 Python 脚本中的变量传递。
在研究这个主题时,基本上发现了Custom Credential in a Custom Inventory Script,它在 Ansible Tower 中的定义如下:
在 Ansible tower 中的自定义凭据下,输入配置:
{
"fields": [{
"id": "username",
"label": "<Username>",
"type": "string",
}, {
"id": "password",
"label": "<Password>",
"type": "string",
"secret": true
}],
}
Run Code Online (Sandbox Code Playgroud)
然后,喷油器配置:
{
"env": {
"SAT_USERNAME": "{{username}}",
"SAT_PASSWORD": "{{password}}"
}
}
Run Code Online (Sandbox Code Playgroud)
将上述内容保存在 Ansible Tower 中后,据我了解,SAT_USERNAME …
我无法使用VMware动态清单文件从Vault中读取机密。
库存:
https : //github.com/ansible/ansible/blob/devel/contrib/inventory/vmware_inventory.ini(在我的Ansible目录结构中将其用作vmware.yml)
https://github.com/ansible/ansible/ Blob /开发/贡献/库存/vmware_inventory.py
更新了动态清单脚本(vmware_inventory.py-#L213)中的几行以读取vars-
'ini_path': os.path.join(os.path.dirname(__file__), '../group_vars/vmware/vmware.yml'),
Run Code Online (Sandbox Code Playgroud)
Ansible目录结构:
ansible/
inventory/
vmware_inventory.py
group_vars/
all_vars.yml
vmware/
vmware.yml
vault.yml
roles/
Run Code Online (Sandbox Code Playgroud)
我可以使用ping通所有主机- ansible all -i vmware_inventory.py -m ping
试用A:使用
加密密码值ansible-vault encrypt_string password123 --name 'password' --ask-vault-pass
。使用加密的密码更新vmware.yml。
猫vmware.yml
server: vcsa.lab
port: 443
username: devuser
password: !vault |
$ANSIBLE_VAULT;1.1;AES256
62616231653730653366633966626531383362323165643034336533356165626166313466396462
3866363332663963366231636230646465363530666366320a346539343366663135353639646234
65363163386136636662356534343430663133313865333731336230373437663230356361373363
3434633132343731370a393139383464306432626638633837333030623539653462343230373562
6433
validate_certs: False
Run Code Online (Sandbox Code Playgroud)
错误:
vmware_inventory.py)执行错误:由于(vim.fault.InvalidLogin){dynamicType =,dynamicProperty =(vmodl.DynamicProperty)[],msg ='由于用户名不正确,无法连接到ESXi服务器或密码。',faultCause =,faultMessage =(vmodl.LocalizableMessage)[]}
试验B:点击此链接,
创建一个ansible保管库文件(ansible-vault创建../group_vars/vmware/vault)并添加为纯文本,然后在vmware.yml中读取该值
猫vmware.yml
server: vcsa.lab
port: 443
username: dev
password: "{{ vault_password}}"
validate_certs: …
Run Code Online (Sandbox Code Playgroud) 我需要根据用户的输入添加主机。现在我尝试使用 ansiblein-memory inventory
模块add_host
并prompt
添加目标主机来执行剩余的任务。这是我的剧本的内容:
部署.yml
Run Code Online (Sandbox Code Playgroud)- name: Adding the host server hosts: localhost - vars_prompt: - name: "Server IP" prompt: "Server" private: no - name: "Username (default: Ubuntu)" prompt: "User" default: "Ubuntu" private: no - name: "Password" prompt: "Passwd" private: yes encrypt: "sha512_crypt" - name: "Identity file path" prompt: "IdFile" private: no when: Passwd is undefined tasks: - name: Add host server add_host: name: "{{ Server }}" ansible_ssh_user: "{{ User }}" ansible_ssh_private_key_file: "{{ IdFile }}" …
Ansible AWX 要求以 yaml 或 json 格式输入库存。
当您开始学习 ansible 时,您可以选择从 ini 格式的库存开始。
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
可以在格式之间转换吗?