标签: ansible-inventory

排除 Ansible 清单中的主机子集

我有一组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 ansible-inventory

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

如果库存仅为本地主机,则与多个组共享 ansible 变量

我使用 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 文件中的变量吗?

谢谢,

ansible kubernetes ansible-inventory

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

通过“主机”来限制 ansible playbook

我有一个清单文件,如:

[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 …

ansible ansible-inventory

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

使用 --become for ansible_connection=local

使用个人用户帐户 (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 ansible-inventory

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

(Ansible) 如何获取一组主机的所有库存变量作为模板/Jinja2 中的列表?

我正在使用这种类型的 Ansible 清单编写自动化:

[nodes]
<publicIp1>  privateIp=<privateIp1>
<publicIp2>  privateIp=<privateIp2>
Run Code Online (Sandbox Code Playgroud)

我这样做是因为有时主机具有不同的公共 IP 与私有 IP(例如,AWS)。

现在,在配置任何主机时,我需要在模板模块的 jinja2 文件中获取一个类似于“privateIp1,privateIp2”的 csv。

最好,我什至不想提及组名“节点”,而只是要求“给我当前主机组的所有成员的所有‘privateIp’库存变量的列表”。<< 假设我的主人只是一个组的成员。

如果不可能,有没有办法引用组名并执行此操作?

jinja2 ansible ansible-template ansible-inventory

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

Ansible delegate_to 任务尝试 ssh

我在这个角色中有一个简单的 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 连接检查?

ansible ansible-inventory

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

ansible中的group_names变量

当我执行这个剧本时,我遇到了一些问题:

- 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]吗?

ansible ansible-inventory

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

如何使用 vault 在 ansible 中为一组主机提供 SSH 用户密码

考虑以下 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 ansible-vault ansible-inventory

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

Ansible - 是否可以向库存内的主机添加标签?

正如主题所说,我的问题是是否可以向清单中描述的主机添加标签?

我的目标是能够在具有该特定标签的特定主机/主机组上运行 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)

ansible ansible-2.x ansible-inventory

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

Ansible set_fact 本地并在远程主机上使用

我正在尝试获取本地版本并将其用作其他远程主机中的 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'

如果有什么方法可以实现这一点?

ansible ansible-facts ansible-inventory

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