Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 迭代Ansible设置命令_Linux_Bash_Ansible - Fatal编程技术网

Linux 迭代Ansible设置命令

Linux 迭代Ansible设置命令,linux,bash,ansible,Linux,Bash,Ansible,我想使用ansible安装模块来检索主机规格,并尝试使用bash for循环 Ansible版本:2.4 我的主机清单是在一组我称之为rhelmachines的机器中定义的 我想收集以下名为spec的变量列表 declare -a specs=("ansible_all_ipv4_addresses" "ansible_processor" "ansible_processor_cores" "ansible_uptime_seconds") 然后,我尝试在for bash循环中包含ansib

我想使用ansible安装模块来检索主机规格,并尝试使用bash for循环

Ansible版本:2.4

我的主机清单是在一组我称之为rhelmachines的机器中定义的

我想收集以下名为spec的变量列表

declare -a specs=("ansible_all_ipv4_addresses" "ansible_processor" "ansible_processor_cores" "ansible_uptime_seconds")
然后,我尝试在for bash循环中包含ansible命令:

for i in "${specs[@]}"
do
    ansible rhelmachines -m setup -a 'filter='$i'
done
如何仅在一个连接中连接多个筛选器

谢谢

specs=( "ansible_all_ipv4_addresses"
        "ansible_processor"
        "ansible_processor_cores"
        "ansible_uptime_seconds" )
args=( )
for spec in "${specs[@]}"; do args+=( -a "$spec" ); done
ansible rhelmachines -m setup "${args[@]}"
…将导致您的最终命令等效于:

ansible rhelmachines -m setup \
  -a ansible_all_ipv4_addresses \
  -a ansible_processor \
  -a ansible_processor_cores \
  -a ansible_uptime_seconds

作为可能的解决方案之一,我利用Ansible事实实现了一个Ansible代码。我首先收集了可靠的事实来实施它。然后,我使用了一个局部动作和一个循环。循环指数是几个可解释的事实。对于每一个事实,我都在写一行文件。通过这种方式,我得到了一个由我在rhelmachines循环中声明的所有可解释事实组成的文件

通过一些sed黑客技术将ansible的输出转换为JSON,您可以使用jq仅提取您需要的片段:

ansible -m setup localhost | sed -e 's/^[[:alpha:]].*[|].* [>][>] {$/{/' | jq -n '
[inputs |
 .ansible_facts as $facts |
 $facts.ansible_hostname as $hostname |
 {($hostname): {
    "ipv4_addresses":  $facts.ansible_all_ipv4_addresses,
    "processor": $facts.ansible_processor[0],
    "cores": $facts.ansible_processor_cores,
    "uptime": $facts.ansible_uptime_seconds}}] | add'
…生成表单的输出:

{
  "my-current-hostname": {
    "ipv4_addresses": [
      "192.168.119.129"
    ],
    "processor": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz",
    "cores": 1,
    "uptime": null
  }
}

使用ansible 1.4.5运行,它不会产生正常运行时间。

我使用了@Luigi Sambolino answer并使其更好。他的答案是,清单中不止一台主机出现故障。他建议使用Lineinfle,在这种情况下,它有一个缺点——所有与其他机器相同的事实都被忽略了。另一个缺点是结果并没有分类,所有的结果都是混合的

我需要了解一些关于系统的基本信息,比如IP、操作系统版本等等。这是我的剧本:

- hosts: all
  gather_facts: true
  ignore_unreachable: true
  tasks:
  - name: get the facts
    setup:
      gather_subset=all
    register: facts
  - name: remove file
    local_action:
      module: file
      path: results
      state: absent
  - name: save results in file
    local_action:
      module: shell
      cmd: echo "{{ item }}" >> results
    with_together:
      - "{{ facts.ansible_facts.ansible_default_ipv4.address }}"
      - "{{ facts.ansible_facts.ansible_architecture }}"
      - "{{ facts.ansible_facts.ansible_distribution }}"
      - "{{ facts.ansible_facts.ansible_distribution_version }}"
      - "{{ facts.ansible_facts.ansible_hostname }}"
      - "{{ facts.ansible_facts.ansible_kernel }}"
现在,结果如下所示:

...
['10.200.1.21', 'x86_64', 'Ubuntu', '18.04', 'bacula', '4.15.18-7-pve']
['10.200.2.53', 'x86_64', 'Ubuntu', '18.04', 'webserver', '4.15.18-27-pve']
...

例如,sed可以删除方括号,我们有一个很好的CSV文件,可以用于任何电子表格。

那么,如果数组包含foo和bar,您是否希望最后的命令行为ansible rhelmachines-m setup-a filter=foo-a filter=bar?或者-一个foo,酒吧?还是别的什么?请明确说明它们应该如何连接。顺便说一句,您的原始代码根本不会运行-引号不平衡。也许你想要-a filter=$i?我想避免循环的需要。所以,是的,一行中有多个过滤器。如何在一行中-a仅一次,在分隔规格列表后的参数中使用逗号或空格?每种规格一个?还有别的吗?如果显示要生成的命令行的实际示例,则当将多个规范传递为猜测以外的内容时,将允许不知道ansible希望其filter=参数采用何种格式的人编写答案。可设计的输出为ansible rhelmachines-m setup \-a ansible_all_ipv4 \-aansible_processor \-ansible_processor_cores \-如Charles建议的ansible_正常运行时间\-秒,但ansible目前似乎不支持同一设置命令中的多个筛选器:-目前无法尝试此操作。如果有效,这就是解决方案:-对我来说不起作用。事实上,错误是:错误!此任务“设置”有额外的参数,仅在以下模块中允许:command、win_command、shell、win_shell、script、include、include_vars、include_tasks、include_role、import_tasks、import_role、add_host、group_by、set_fact、raw、Meta如果您先运行set-x,日志上会说代码正在运行什么?请参阅上运行的这个。有一个thinko需要修复,但作为一个简单的变量名不匹配,希望读者能明白这一点。我想说的是ansible setup命令不支持多个筛选器:-没关系,但是如果清单中有多个主机,并且有几个事实相同,那么它们将被忽略。并且内容是混合的
...
['10.200.1.21', 'x86_64', 'Ubuntu', '18.04', 'bacula', '4.15.18-7-pve']
['10.200.2.53', 'x86_64', 'Ubuntu', '18.04', 'webserver', '4.15.18-27-pve']
...