运维自动化之ANSIBLE--- Playbook字典 with_items

Playbook字典 with_items

迭代:当有需要重复性执行的任务时,可以使用迭代机制

> 对迭代项的引用,固定变量名为"item"

> 要在task中使用with_items给定要迭代的元素列表

> 列表格式: 字符串 字典

迭代:with_items

示例: 创建用户

- name: add several users
  user: name={{ item }} state=present groups=wheel   #{{ item }} 系统自定义变量
  with_items:       # 定义{{ item }} 的值和个数
    - testuser1
    - testuser2

上面语句的功能等同于下面的语句:

- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel

with_items中可以使用元素还可为hashes

示例:

- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

ansible的循环机制还有更多的高级功能,具体请参见官方文档http://docs.ansible.com/playbooks_loops.html

示例:将多个文件进行copy到被控端

---
- hosts: testsrv
  remote_user: root
  tasks
  - name: Create rsyncd config
    copy: src={{ item }} dest=/etc/{{ item }}
    with_items:
  - rsyncd.secrets
  - rsyncd.conf

示例:迭代

- hosts: websrvs
  remote_user: root
  tasks:
    - name: copy file
      copy: src={{ item }} dest=/tmp/{{ item }}
      with_items:
    - file1
    - file2
    - file3
- name: yum install httpd
  yum: name={{ item }} state=present
  with_items:
    - apr
    - apr-util
    - httpd
- hosts:websrvs
  remote_user: root
  tasks
    - name: install some packages
      yum: name={{ item }} state=present
      with_items:
        - nginx
        - memcached
        - php-fpm

示例:迭代嵌套子变量

- hosts:websrvs
  remote_user: root
  
  tasks:
    - name: add some groups
      group: name={{ item }} state=present
      with_items:
        - group1
        - group2
        - group3
    - name: add some users
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
        - { name: 'user1', group: 'group1' }
        - { name: 'user2', group: 'group2' }
        - { name: 'user3', group: 'group3' }

with_itmes 嵌套子变量

---
- hosts: testweb
  remote_user: root
  tasks:
    - name: add several users
      user: name={{ item.name }} state=present groups={{ item.groups }}
      with_items:
    - { name: 'testuser1' , groups: 'wheel'}
    - { name: 'testuser2' , groups: 'root'}

Playbook字典 with_items

- name: 使用ufw模块来管理哪些端口需要开启
  ufw:
  rule: “{{ item.rule }}”
  port: “{{ item.port }}”
  proto: “{{ item.proto }}”
  with_items:
    - { rule: 'allow', port: 22, proto: 'tcp' }
    - { rule: 'allow', port: 80, proto: 'tcp' }
    - { rule: 'allow', port: 123, proto: 'udp' }

- name: 配置网络进出方向的默认规则
  ufw:
  direction: "{{ item.direction }}"
  policy: "{{ item.policy }}"
  state: enabled
  with_items:
    - { direction: outgoing, policy: allow }
    - { direction: incoming, policy: deny }

Playbook中template for if when循环

{% for vhost in nginx_vhosts %}

server {    #重复执行server代码
listen {{ vhost.listen | default('80 default_server') }};

{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }};
{% endif %}

{% if vhost.root is defined %}
root {{ vhost.root }};
{% endif %}

{% endfor %}

示例

// temnginx.yml
---
- hosts: testweb
  remote_user: root
  vars:      # 调用变量
    nginx_vhosts:
      - listen: 8080  #列表 键值对


//templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}  
server {
  listen {{ vhost.listen }}
}
{% endfor %}

生成的结果
server {
  listen 8080
}
// temnginx.yml
---
- hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      - web1
      - web2
      - web3
  tasks:
    - name: template config
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

// templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}
server {
    listen {{ vhost }}
}
{% endfor %}

生成的结果:
server {
    listen web1
}
server {
    listen web2
}
server {
    listen web3
}

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 调用 Ansible Playbook 可以通过调用命令行的方式实现,例如使用 ProcessBuilder 类来执行命令行。下面是一个简单的示例代码: ```java public static void runAnsiblePlaybook(String playbookPath, String inventoryPath) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder("ansible-playbook", "-i", inventoryPath, playbookPath); pb.redirectErrorStream(true); Process process = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); } ``` 在这个示例中,我们使用 ProcessBuilder 类来创建一个命令行进程。我们将 Ansible Playbook 命令 `ansible-playbook` 作为参数传递给 ProcessBuilder 构造函数,并使用 `-i` 选项指定主机清单文件的路径,以及使用第二个参数 `playbookPath` 指定要执行的 Playbook 文件的路径。我们还将 `redirectErrorStream` 设置为 true,以便将标准输出和标准错误流合并到一个流中。 接下来,我们使用 `start()` 方法启动进程,并使用 `getInputStream()` 方法获取进程的标准输出流。我们使用 `BufferedReader` 逐行读取输出,并将其打印到控制台上。 最后,我们使用 `waitFor()` 方法等待进程完成执行。 需要注意的是,在实际应用中,我们可能需要为 Ansible Playbook 设置其他参数,例如 `--extra-vars` 或 `--tags` 等。我们可以将这些参数作为命令行参数传递给 ProcessBuilder。同时,我们还需要处理进程的错误输出流,以便及时发现和处理错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值