标签: ansible-inventory

ansible-inventory --list 主机组命令行

我想(仅)从 ansible-inventory 获取主机组名称列表,但是我必须使用 grep 根据已知的组名称模式来修剪列表 - 例如

  • 干净的输出,但混乱的命令行,需要提前知道组名称模式:

ansible-inventory -i inventory/production --list --yaml | grep webserver_.*:$

  • 干净的命令行,不需要知道组名模式,但输出混乱:

ansible-playbook my-playbook.yml -i inventory/production --list-hosts

有没有一种干净的方法可以从库存中提取组名称?

示例hosts.yml:

# NGINX
webserver_1:
  hosts:
    ws1.public.example.com

webserver_2:
  hosts:
    ws2.public.example.com

webserver_2:
  hosts:
    ws2.public.example.com

# EC2 back-ends
backend_ec2_1:
  hosts:
    be1.internal.example.com

backend_ec2_2:
  hosts:
    be2.internal.example.com

backend_ec2_3:
  hosts:
    be3.internal.example.com
Run Code Online (Sandbox Code Playgroud)

[Ansible v2.9.7]

ansible ansible-inventory

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

使用host_vars的Ansible EC2动态库存

我是Ansible的动态库存新手.

我有一本剧本: hosts: tag_Name_abc

运行此playbook可以在标记的EC2实例上正确执行所需操作.当我尝试使用时,host_vars我得到了fatal: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'test_var' is undefined"}

host_vars/tag_Name_abcplaybook文件目录下有一个包含内容的文件文件test_var: test_value,但它没有获取变量.

发布剧本 ansible-playbook -i ec2.py myplaybook.yml

任何建议都会很棒.谢谢!

ansible ansible-inventory

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

将主机添加到Ansible主机文件

我一直在尝试使用Ansible playbook为我的hosts文件添加主机名.我的Ansible游戏看起来如下,我的主机文件位于/etc/ansible/hosts:

- name: adding host playbook
  hosts: localhost
  connection: local
  tasks:
  - name: add host to ansible host file
    add_host:
      name: myvm.cloud.azure.com
      groups: mymasters
Run Code Online (Sandbox Code Playgroud)

Playbook成功执行,但新主机名未添加到Ansible主机文件中.有人可以帮我这个吗?

ansible ansible-playbook ansible-inventory

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

Ansible:使用带有vars的嵌套组

我有一种情况,我们有3层盒子,在每一层我们应用不同的变量设置(如缓存目录所在的位置),但有一堆默认值.我还需要在每个节点上覆盖,这通常通过主机本身的库存变量来完成.我不确定组织主机的最佳方法是什么,以便优先顺序对我有利.

以下是我尝试过的不同内容.在每种情况下,我在库存文件中都有这样的条目:

[bots-fancy]
fancy-1 

[bots-super-fancy]
super-1

[bots-magical]
magic-1
magic-2 provider=aws
Run Code Online (Sandbox Code Playgroud)

起初,我让每个人都有一长串变量定义.我也有不同的group_var/bots/[bots-magical | bots-super-fancy | bots-fancy].yaml文件.这很快变得难以为继.


尝试1:使用playbook变量在剧本中我有这样的事情:

---
hosts:
  - bots
vars_files:
  - "group_vars/bots/defaults.yml"
  - "group_vars/bots/{{ groups_names[0] }}.yml"
roles:
  - somethign
Run Code Online (Sandbox Code Playgroud)

这工作(虽然是脆弱的)但它不会让我覆盖每个主机.我不得不偶尔在节点上设置不同的东西,但不是整个组.


尝试2:group_vars每个人使用

我补充道

[bots:children]
bots-fancy
bots-super-fancy
bots-magical
Run Code Online (Sandbox Code Playgroud)

到hosts文件.vars_files从剧本中删除任何内容并group_vars为每个组创建.我添加了默认/共享设置group_vars/bots.yaml.当我运行playbook时,它只会加载bots它看起来的group_vars.理想情况下,我希望它加载bots,然后用它覆盖它bots-fancy.然后最后来自hosts文件的值.

我不确定构建这些组的最佳方法,所以任何输入都会非常有用!

ansible ansible-inventory

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

Playbook目录和Inventory目录

这里 有一句话:

提示:在Ansible 1.2或更高版本中,group_vars /和host_vars /目录可以存在于playbook目录或inventory目录中.如果两个路径都存在,则playbook目录中的变量将覆盖inventory目录中设置的变量.

我该如何定义:

  • 剧本目录
  • 库存目录

我不知道这个配置,似乎在我的Ansible游戏中,我总是有一个目录,它同时是playbook目录和库存目录,但这样的分离可能很有用.

ansible ansible-inventory

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

在顶级剧本中选择group_var变量文件

我已经定义了所有变量group_vars/all/vars_file.yml,我的剧本如下:

---
# Top level play site.yml
- hosts: webclient

  roles:
    - common
    - nginx
    - nvm
    - deploy_web_client

- hosts: appserver
  roles:
    - common
    - gradle
    - tomcat
    - deploy_sb_war
Run Code Online (Sandbox Code Playgroud)

现在我有3个环境dev / staging / production。根据环境的不同,我曾经在group_vars下更改vars_file.yml,然后运行ansible-play。

有什么办法可以保留3个文件,例如“ group_vars / dev”,“ group_vars / staging”,“ group_vars / production”,并在我的主站点中指定它。yml

我有3个清单文件,如下所示,并根据环境在播放环境中指定清单文件名

[webclient]
10.20.30.40

[appserver]
10.20.30.41
Run Code Online (Sandbox Code Playgroud)

ansible ansible-2.x ansible-inventory

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

Ansible - 将变量从group_vars和host_vars一起放入列表中

我试图从库存组中获取IP地址列表而不是主机名.这些IP地址已经在我的hostvars中,但我不能使它们与组名称中的列表匹配.

这是我原来的剧本:

- name: Install Kafka
  hosts: kafka
  roles: 
    - role: kafka
      kafka_hosts: "{{ groups['kafka'] | list }}"
      kafka_zookeeper_hosts: "{{ groups['zookeeper'] | list }}"
Run Code Online (Sandbox Code Playgroud)

如您所见,kafka_hostskafka_zookeeper_hosts是列表.这个剧本对我的服务器配置的结果是正确的:

/etc/kafka/consumer.properties:zookeeper.connect=opo-4:2181,opo-5:2181,opo-6:2181
/etc/kafka/producer.properties:metadata.broker.list=opo-1:9092,opo-2:9092,opo-3:9092
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于DNS问题,此配置对我的所有服务器都不起作用.我需要一个IP地址列表而不是主机名.

如果我手动设置我的Playbook中的IP地址,我的配置工作,不幸的是不动态:

  kafka_hosts: 
    - 192.168.48.1
    - 192.168.48.2
    - 192.168.48.3
  kafka_zookeeper_hosts: 
    - 192.168.48.4
    - 192.168.48.5
    - 192.168.48.6
Run Code Online (Sandbox Code Playgroud)

我的服务器上的结果使它工作:

/etc/kafka/consumer.properties:zookeeper.connect=192.168.48.4:2181,192.168.48.5:2181,192.168.48.6:2181
/etc/kafka/producer.properties:metadata.broker.list=192.168.48.1:9092,192.168.48.2:9092,192.168.48.3:9092
Run Code Online (Sandbox Code Playgroud)

在这种配置中,我必须使用相同的信息手动维护我的组我的剧本.所以我想从组kafkazookeeper获得hostvars.

以下是主库存文件中定义的主机和组:

[opo]
opo-1 ansible_host=192.168.48.1
opo-2 ansible_host=192.168.48.2
...
opo-6 ansible_host=192.168.48.6

[zookeeper]
opo-1
opo-2
opo-3

[kafka]
opo-4 …
Run Code Online (Sandbox Code Playgroud)

ansible ansible-2.x ansible-inventory

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

即使使用标签,Ansible也会运行所有任务

这是我的2个标签的任务

- name: Set custom iptables rules
  iptables_raw:
    name: 'iptables_custom_rules'
    rules: '{{ iptables_custom_rules }}'
  tags: 'commonrules'


- name: Set XXX iptable rules
  iptables_raw:
    name: 'iptables_wsg_rules'
    rules: '{{ iptables_wsg_rules }}'
  tags: 'wsgrules'
Run Code Online (Sandbox Code Playgroud)

在iptable.yml文件中,我包含了带标记的角色

- hosts: iptables
  roles:
    - { role: "Iptables", tags: "commonrules" }
Run Code Online (Sandbox Code Playgroud)

它应该只运行带有commonrules的标签,但是当我运行playbook时它会运行所有任务.

ansible ansible-2.x ansible-facts ansible-inventory

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

Ansible - 在主机上启动tomcat

我一直在使用ansible playbook来下载并在主机中启动tomcat.

这是我的库存主机文件:

[group1]
machine1 ansible_host=10.40.0.168
Run Code Online (Sandbox Code Playgroud)

我的group_vars中有group1.yml文件:

---
ansible_ssh_user: user
ansible_ssh_pass: pass
ansible_sudo_pass: passp
Run Code Online (Sandbox Code Playgroud)

我的剧本是:

---
- hosts: group1
  sudo: yes
  tasks:

 - name: Update all packages to the latest version
   apt:
     upgrade: dist

- name: Download tomcat
  get_url: url=http://mirrors.up.pt/pub/apache/tomcat/tomcat-9/v9.0.1/bin/apache-tomcat-9.0.1-fulldocs.tar.gz dest=/opt/apache-tomcat-9.0.1.tar.gz

- name: Unarchive a file that is already on the remote machine
  unarchive:
   src: /opt/apache-tomcat-9.0.1.tar.gz
   dest: /opt/
   remote_src: yes

- name: Run Tomcat
  shell: ./startup.sh
  args:
    chdir: /opt/apache-tomcat-9.0.1/bin
Run Code Online (Sandbox Code Playgroud)

我尝试./startup.sh/opt/apache-tomcat-9.0.1/bin文件夹中运行以启动tomcat.

我运行以下命令:

ansible-playbook playbookname.yml
Run Code Online (Sandbox Code Playgroud)

如果我./startup.sh在主机上运行它工作正常,但是当我从控制机器运行时,我得到: …

ansible ansible-inventory

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

如何使用公共 ssh 密钥运行 Ansible Playbook

我正在尝试使用提供的 ssh 密钥在远程服务器上运行我的 Ansible playbook。

我已将以下配置添加到我的库存文件中:

all:
  hosts:
    server1:
      ansible_host: sample.server@noname.com
      dest_dir: /root
      sample_tree: sample_tree.txt
      private_key_file: ../config/id_rsa_tf
Run Code Online (Sandbox Code Playgroud)

我在我的剧本中使用以下内容引用了它:

- name: "Nightly Deploy"
  hosts: server1
  remote_user: sysuser
  tasks:
    - name: Copy test from local to remote
      tags:
        - copy
        - all
      copy:
        src: "test.tgz"
        dest: "{{ dest_dir }}/test.tgz"

Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令运行剧本:

ansible-playbook --tags="copy" -v -i inventories/nightly-build.yaml playbooks/nightly-build.yaml

我得到的错误如下:

致命:[server1]:无法访问!=> {"changed": false, "msg": "无法
通过 ssh 连接到主机:权限被拒绝 (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}

是我的private_key_file库存文件错了还是我说错了?帮助会很好

ansible ansible-inventory

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