我想(仅)从 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的动态库存新手.
我有一本剧本:
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 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主机文件中.有人可以帮我这个吗?
我有一种情况,我们有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 1.2或更高版本中,group_vars /和host_vars /目录可以存在于playbook目录或inventory目录中.如果两个路径都存在,则playbook目录中的变量将覆盖inventory目录中设置的变量.
我该如何定义:
我不知道这个配置,似乎在我的Ansible游戏中,我总是有一个目录,它同时是playbook目录和库存目录,但这样的分离可能很有用.
我已经定义了所有变量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) 我试图从库存组中获取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_hosts和kafka_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)
在这种配置中,我必须使用相同的信息手动维护我的组和我的剧本.所以我想从组kafka和zookeeper获得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) 这是我的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 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在主机上运行它工作正常,但是当我从控制机器运行时,我得到: …
我正在尝试使用提供的 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库存文件错了还是我说错了?帮助会很好