标签: ansible-inventory

Ansible:如何为播放的所有主机调用模块`add_host`

我用这个剧本创建了一本剧本:

在主机上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虚拟机vm1vm2的返回:

vm1
vm2
Run Code Online (Sandbox Code Playgroud)

创建文件/ tmp/host2_test以模拟guest虚拟机vm3vm4的返回:

vm3
vm4
Run Code Online (Sandbox Code Playgroud)

将此清单( …

ansible ansible-inventory

5
推荐指数
1
解决办法
6664
查看次数

如何将清单文件用于 Ansible 临时命令?

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 错误。

ansible-2.x ansible-inventory ansible-ad-hoc

5
推荐指数
1
解决办法
6884
查看次数

使用 ansible 获取特定主机名的 ip

我有一个大致如下所示的主机文件:

[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!"}

ansible ansible-2.x ansible-inventory

5
推荐指数
2
解决办法
2万
查看次数

一次在一个主机组上运行一个剧本

我想在我使用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)

ansible ansible-2.x ansible-inventory

5
推荐指数
1
解决办法
2万
查看次数

Ansible-使用逻辑OR匹配主机组

我正在尝试使它仅适用于我的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 ansible-inventory

5
推荐指数
1
解决办法
6018
查看次数

Ansible:定义剧本“默认”变量,优先于角色,但在清单中可覆盖

TL; DR

使用 Ansible,我试图在剧本级别定义某种默认变量 - 让我们称之为剧本默认值- 它优先于角色默认值,但可以被库存清单group_vars/所有变量覆盖。

如何定义某种剧本默认变量,该变量优先于角色默认值,但同时可以被清单(环境)覆盖?


目前 Ansible 2.x 变量优先级如下:

  • 角色默认值
  • 库存文件或脚本组变量
  • 库存组_vars/全部
  • 剧本 group_vars/all

我希望实现的目标是:

  • 角色默认值
  • 剧本默认值
  • 库存文件或脚本组变量
  • 库存组_vars/全部
  • 剧本 group_vars/all

从我之前使用的大多数工具和应用程序来看,在环境级别(开发、测试、QA、产品等)定义的变量优先于“应用程序”变量,而“应用程序”变量本身优先于“外部”组件。那么优先顺序如下:

  • “外部”组件变量(来自 Galaxy 的角色)
  • “应用程序”变量(剧本变量)
  • “环境”变量(开发、测试等)

环境具有最高优先级。但我找不到用 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 ansible-2.x ansible-inventory

5
推荐指数
1
解决办法
1万
查看次数

使用自定义 Python 脚本在 Ansible Tower 中自定义凭据

我正在尝试在 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 …

python ansible ansible-tower ansible-inventory

5
推荐指数
1
解决办法
1847
查看次数

无法在Ansible中检索文件库机密

我无法使用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)

ansible ansible-inventory

5
推荐指数
0
解决办法
354
查看次数

如何在 ansible playbook 中根据用户输入添加主机?

我需要根据用户的输入添加主机。现在我尝试使用 ansiblein-memory inventory模块add_hostprompt添加目标主机来执行剩余的任务。这是我的剧本的内容:

部署.yml

- 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 }}" …
Run Code Online (Sandbox Code Playgroud)

ansible ansible-2.x ansible-inventory

5
推荐指数
1
解决办法
6146
查看次数

你如何将 ansible ini 清单转换为 json 或 yaml

Ansible AWX 要求以 yaml 或 json 格式输入库存。

当您开始学习 ansible 时,您可以选择从 ini 格式的库存开始。

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

可以在格式之间转换吗?

ansible ansible-awx ansible-inventory

5
推荐指数
1
解决办法
6926
查看次数