ansible总结
灰度发布与检测
1.语法检测
在编写完playbook或者role之后一定要养成进行语法检测的习惯,直接使用ansible-playbook命令的 --syntax-check参数即可。
2.测试运行
ansible-playbook -C /path/to/playbook.yaml
--list-hosts
--list-tasks
--list-tags
ansible-playbook –check /path/to/playbook.yaml
远程节点的系统变量(facts)
ansible 通过 module setup 收集主机的系统信息,这些收集到的系统信息叫做 facts,这些facts可以直接以变量的形式使用。
哪些 facts 变量可以引用的?通过如下命令行调用setup module 可以查看:
ansible all -m setup -u root
可以看到它输出的变量信息有很多!
复杂的facts变量的使用可以用如下两种形式:
{{ ansible_ens3["ipv4"]["address"] }}
{{ ansible_ens3.ipv4.address }}
好用的一些 facts 变量#
ansible_hostname 指定的 host 名称
ansible_default_ipv4.address 主机真实的 ipv4 地址,小网IP
ansible_os_family 查看系统类型的变量
---
- hosts: all
user: root
tasks:
- name: echo system
shell: echo {{ ansible_os_family }}
- name install ntp on Debian linux
apt: name=git state=installed
when: ansible_os_family == "Debian"
- name install ntp on redhat linux
yum: name=git state=present
when: ansible_os_family == "RedHat"
关闭 facts
在 playbook 中,如果不收集系统信息,那么上面的变量就不能再 playbook 中使用了,但是有时候关闭会加快执行的效率:
- hosts: all
gather_facts: no
命令行传递变量 --extra-vars
---
- hosts: "{{hosts}}"
remote_user: "{{user}}"
tasks:
- debug: msg="{{hosts}}"
命令输入变量
ansible-playbook extra_learn.yml --extra-vars "{'hosts':'x86','user':'michael'}"
# or
ansible-playbook extra_learn.yml --extra-vars "hosts=x86 user=michael"
注册变量 register
将某个 task 执行的结果「注册」为一个变量。后面的 action 就可以使用它
---
- hosts: centos
tasks:
- name: ls /tmp
shell: ls -l /tmp
register: result
ignore_errors: True
- name: echo result when rc==5
shell: echo "{{result}}"
when: result.rc == 5
- name: debug show stdout
debug:
msg: "{{result.stdout}}"
playbook 中的逻辑控制语句
when:条件判断,类似编程语言中的 if
loop:循环,类似编程语言中的 while
block:将几个 task 组成一块代码,便于针对一组操作进行异常处理等
条件语句 when
例如,在某个特定版本的系统上装包,或者只在磁盘空间满了的文件系统上执行清理操作。这些操作在Playbook中用when语句实现。
主机为Debian Linux立刻关机
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"
根据action的执行结果,来决定接下来执行的action。
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
远程中的系统变量facts变量作为when的条件,用“|int”还可以转换返回值的类型:
---
- hosts: web
tasks:
- debug: msg="only on Red Hat 7, derivatives, and later"
when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6
循环语句 loop#
---
- hosts: merge
gather_facts: False
tasks:
- name: debug loops
shell: cat /root/test.txt
register: host
until: host.stdout.startswith("test")
retries: 5
delay: 5
5秒执行一次 cat /root/test.txt将结果register给host,然后判断host.stdout.startwith的内容是不是test字符串开头,如果条件成立,此task运行完成,如果条件不成立,5秒以后重试,5此后还不满足条件,此task运行失败。
其他的循环还有:散列loops、文件匹配loops、随机选择loops、文件优先匹配loops、register loops
标准循环 with_items#
使用 with_items 用于迭代的条目类型不仅仅支持简单的字符串列表.如果你有一个哈希列表,那么你可以用以下方式来引用子项:
- name: add several users
user: name="{{ item.name }}" state=present groups="{{ item.groups }}"
with_items:
- { name: 'michael', groups: 'wheel' }
- { name: 'qq', groups: 'root' }
对哈希表使用循环 with_dict
---
- hosts: centos
vars:
users:
michael:
name: michael xiang
phone: 123
qq:
name: qq huang
phone: 456
rpms:
- httpd
- lrzsz
- vim
- git
tasks:
- name: print phone records
debug: msg="User {{item.key }} is {{ item.value.name }} {{item.value.phone}}"
with_dict: "{{ users }}"
- name: install rpms
yum: name="{{item}}" state=installed
with_items: "{{rpms}}"
对文件列表使用循环 with_filegloab
with_fileglob 可以以非递归的方式来模式匹配单个目录中的文件.如下面所示:
tasks:
# first ensure our target directory exists
- file: dest=/etc/fooapp state=directory
# copy each file over that matches the given pattern
- copy: src=\{\{ item \}\} dest=/etc/fooapp/ owner=root mode=600
with_fileglob:
- /playbooks/files/fooapp/*
块语句
多个action组装成块,可以根据不同条件执行一段语句 :
tasks:
- block:
- yum: name=\{\{ item \}\} state=installed
with_items:
- httpd
- memcached
- template: src=templates/src.j2 dest=/etc/foo.conf
- service: name=bar state=started enabled=True
when: ansible_distribution == 'CentOS'
become: true
become_user: root
本文地址:https://blog.csdn.net/xiaozhiit/article/details/107323588