我有一组vm2-prod通过命名的主机vm14-prod。这些在 Ansible 主机清单中分组为vmware_hosts。我想排除这样的主机子集:
- name: testing play
hosts: vmware_hosts:!vm[8-10]-prod
Run Code Online (Sandbox Code Playgroud)
根据 Ansible 文档,这似乎应该排除vm7-prod通过vm9-prod. 但是,我得到“无法匹配主机模式,忽略 vm[8-10]-prod”,就像它读取文字主机名“vm[8-10]-prod”而不是数组一样。
我也尝试过vm[8:10]-prod,但它给出了同样的错误。
怎么了?
我使用 ansible 通过本地机器上的 kubectl 命令将作业/配置发送到我的 k8s 集群。我有我的清单文件设置,所以每个集群都是它自己的组,每个集群基本上是到 localhost 的连接。
# Inventory File
#
[east.k.example.com]
localhost ansible_connection=local
[east2.k.example.com]
localhost ansible_connection=local
Run Code Online (Sandbox Code Playgroud)
然后在我的 group_vars 目录中,我有一个不同的文件,我的组名来自我的清单文件,该文件包含每个集群的所有不同变量。
我使用 limit 选项将运行限制为仅针对一个集群:
ansible-playbook -vv create.yaml -l east2.k.example.com --tags ingress-generate-only
问题是,当我尝试在模板中使用变量时,我会从其他组中获取变量。我在想是因为每个组都包含本地主机。
有没有更好的方法来解决这个问题?我可以设置一个标志,以便组只包含 group_var 文件中的变量吗?
谢谢,
我有一个清单文件,如:
[my_domain]
255.255.255.255
[production:children]
my_domain
[load_balancer:children]
my_domain
[webservers:children]
my_domain
Run Code Online (Sandbox Code Playgroud)
我有一个playbook.yml喜欢:
---
- hosts: webservers
gather_facts: no
tasks:
- debug:
msg: Hello webservers
- hosts: load_balancer
gather_facts: no
tasks:
- debug:
msg: Hello load_balancer
Run Code Online (Sandbox Code Playgroud)
运行以下命令时,它会运行剧本中的两个剧本,即打印“Hello webservers”和“Hello load_balancer”:
ansible-playbook ./playbook.yml --limit "webservers:&production"
Run Code Online (Sandbox Code Playgroud)
我可以通过向它添加标签并tags在命令行上使用来让它只运行网络服务器播放,例如:
...
- hosts: webservers
tags: ['webservers']
# or if using roles then:
# roles:
# - { role: provision_webserver, tags: [ 'provision_webservers' ] }
...
Run Code Online (Sandbox Code Playgroud)
并使用:
ansible-playbook ./playbook.yml --limit "webservers:&production" --tags "webservers"
Run Code Online (Sandbox Code Playgroud)
我希望limitarg …
使用个人用户帐户 (userx),我在所有指定的主机上运行 ansible playbook。在 ansible.cfg 中,要使用的远程用户(可以成为 root)是:
remote_user = ansible
Run Code Online (Sandbox Code Playgroud)
对于远程主机,这一切正常。它以用户 Ansible 的身份连接,并根据需要执行所有任务,同时更改/etc/ssh/sshd_config需要 root 权限的信息(如)。
但现在我也想在 Ansible 主机上执行剧本。我将以下内容放入我的库存文件中:
localhost ansible_connection=local
Run Code Online (Sandbox Code Playgroud)
现在确实在本地主机上执行。但是作为userx,这会导致它需要执行的某些任务“拒绝访问”。
这当然在某种程度上是预料之中的,因为 remote_user 讲述了一些关于remote 的信息,而不是本地用户。但是,我仍然希望剧本也能--become在本地以 root 身份执行任务(例如sudo su -)。似乎没有这样做。
运行剧本--become -vvv告诉我
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: userx
Run Code Online (Sandbox Code Playgroud)
并且似乎不会尝试使用 sudo 执行任务。如果不使用 sudo,任务就会失败。
我如何告诉 ansible 在本地连接上也使用 sudo / become ?
我正在使用这种类型的 Ansible 清单编写自动化:
[nodes]
<publicIp1> privateIp=<privateIp1>
<publicIp2> privateIp=<privateIp2>
Run Code Online (Sandbox Code Playgroud)
我这样做是因为有时主机具有不同的公共 IP 与私有 IP(例如,AWS)。
现在,在配置任何主机时,我需要在模板模块的 jinja2 文件中获取一个类似于“privateIp1,privateIp2”的 csv。
最好,我什至不想提及组名“节点”,而只是要求“给我当前主机组的所有成员的所有‘privateIp’库存变量的列表”。<< 假设我的主人只是一个组的成员。
如果不可能,有没有办法引用组名并执行此操作?
我在这个角色中有一个简单的 ansible 角色和几个基本任务。所有任务都定义为local_action(或delegate_to: localhost)。剧本中定义的主机也是localhost.
现在,当我运行这个剧本时,它首先尝试在执行角色/任务之前测试 ssh 连接。这不是问题,但我发现在运行明确定位localhost为主机的 playbook 之前没有必要建立或测试 ssh 连接。以下是我的剧本 ( playbook.yml) 的样子:
- hosts: db-servers
roles:
- role: test
Run Code Online (Sandbox Code Playgroud)
角色定义 ( roles/test/tasks/main.yml) 如下所示:
---
- name: Resolve and copy test configuration
template:
src: "roles/test/templates/temp.conf"
dest: "roles/test/files/temp-4.2.0/temp.conf"
delegate_to: 127.0.0.1
become: no
- name: Run test job
delegate_to: 127.0.0.1
command: roles/test/files/test-4.2.0/test.sh
become: no
Run Code Online (Sandbox Code Playgroud)
以下是我的库存文件inv/test:
[db-servers]
localhost
Run Code Online (Sandbox Code Playgroud)
我正在使用这个命令来运行我的剧本:
ansible-playbook -i inv/test playbook.yml -vvv
Run Code Online (Sandbox Code Playgroud)
无论如何,我是否可以阻止此 ssh 连接检查?
当我执行这个剧本时,我遇到了一些问题:
- hosts: all
connection: local
tasks:
- template: src=/etc/ansible/{{group_names}}/common.j2 dest=/etc/ansible/configs/{{inventory_hostname}}.txt
name: create common config snippets
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
fatal: [R1]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to find '/etc/ansible/[u'ios']/common.j2' in expected paths."}
fatal: [R2]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to find '/etc/ansible/[u'ios1']/common.j2' in expected paths."}
Run Code Online (Sandbox Code Playgroud)
这是我的小组:
/etc/ansible# cat hosts | grep ios
[ios]
[ios1]
Run Code Online (Sandbox Code Playgroud)
这是我的common.j2文件:
/etc/ansible# ls ios1/
common.j2
/etc/ansible# ls ios/
common.j2
Run Code Online (Sandbox Code Playgroud)
有人可以详细说明为什么group_names退货[u'group_names]吗?
考虑以下 Ansiblehosts文件:
[webservers]
server1.example.com ansible_ssh_pass=1234567
server2.example.com ansible_ssh_pass=2345678
server3.example.com ansible_ssh_pass=3456789
Run Code Online (Sandbox Code Playgroud)
我想从保管库文件中包含这些密码值,并有一个hosts类似的文件(我的意图是有一个ini库存格式):
[webservers]
server1.example.com ansible_ssh_pass={{ ssh_pass }}
server2.example.com ansible_ssh_pass={{ ssh_pass }}
server3.example.com ansible_ssh_pass={{ ssh_pass }}
Run Code Online (Sandbox Code Playgroud)
其中sss_pass变量来自文件host_vars夹中定义的拱形文件。
相关的 ansible 文件夹结构如下所示:
playbook.yml
inventories/
atlanta/
group_vars/
hosts
host_vars/
server1.example.com
server2.example.com
server3.example.com
Run Code Online (Sandbox Code Playgroud)
但 ansible 正在抱怨:
[WARNING]: * Failed to parse /root/hsm-ansible-deploy/inventories/atlanta/hosts with ini plugin: /root/hsm-ansible-deploy/inventories/atlanta/hosts:18: Expected key=value host variable assignment, got: ssh_pass
Run Code Online (Sandbox Code Playgroud)
hosts文件?正如主题所说,我的问题是是否可以向清单中描述的主机添加标签?
我的目标是能够在具有该特定标签的特定主机/主机组上运行 ansible-playbook,例如仅在带有标签“Env=test 和 Type=test”的服务器上运行
例如,当我运行剧本时:
ansible-playbook -i hosts test.yml --extra-vars "Env=${test} Type=${test}"
Run Code Online (Sandbox Code Playgroud)
我将在命令中传递标签,它只会在过滤后的主机上运行。
非常感谢!
更新:
或者,也许在动态库存中做类似的事情?https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html#developing-inventory
[tag_Name_staging_foo]
[tag_Name_staging_bar]
[staging:children]
tag_Name_staging_foo
tag_Name_staging_bar
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取本地版本并将其用作其他远程主机中的 var
在ansible中使用set_fact模块
在本地
- name: Set code version
shell: wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
register: shell_output
- name: set version
set_fact:
code_version: "{{ shell_output.stdout }}"
debug: var=code_version
run_once: true
Run Code Online (Sandbox Code Playgroud)
远程操作
- name: test code version
debug:
msg: code version is " {{ code_version }} "
Run Code Online (Sandbox Code Playgroud)
出现以下错误:The task includes an option with an undefined variable. The error was: 'code_version'
如果有什么方法可以实现这一点?