主配置文件:/etc/ansible/ansible.cfg
主机清单文件:/etc/ansible/hosts
主机清单格式示例:
[test] # 定义一个test的主机组
10.20.120.[1:255] ansible_ssh_user='root' ansible_ssh_pass='123456' ansible_ssh-port=2222 # 单条定义变量比主机组变量优先级高
[test:vars] # 为test组定义主机组变量
ansible_ssh_user='root'
ansible_ssh_pass='123456'
[server:children] # 定义一个组合组,将两个主机组组合到一个大组里
test1
test2
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts  # 信任主机清单
#library = /usr/share/my_modules/  # 模块存放路径
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp  # 远程存放临时脚本文件的目录
#local_tmp = ~/.ansible/tmp  # 本地存放临时脚本文件的目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5  # 并发数
#poll_interval = 15
#sudo_user = root  # sudo提权到root身份
#ask_sudo_pass = True  # 每次执行提权命令是否询问ssh密码
#ask_pass = True  # 每次执行ansible命令是否询问ssh密码
#transport = smart
#remote_port = 22  # 远程服务器ssh端口
#module_lang = C
#module_set_locale = False
log_path = /var/log/ansible.log  # 开启操作日志
host_key_checking = False  # 关闭主机key验证
modele_name = shell  # 修改默认模块为shell模块
常用命令:
ansible-doc -l  # 列出所有模块
ansible-doc [模块名称] # 查看模块说明
ansible all --list-hosts # 列出主机清单中的全部主机
ansible [主机类名] -m [模块名称] -k -o # 执行模块
-k表示使用密码登陆,不使用key。
-o简洁输出,输出信息都在同一行
-v表示列出执行过程,v越多越详细
-i表示链接使用外部主机清单文件。
主机类名:
可以为all,表示对主机清单所有主机执行模块。
可以使用通配符,例如10.20.120.*
可以使用逻辑或关系,例如[主机清单1]:[主机清单2],两个清单内的主机都会执行
可以使用逻辑与关系,例如[主机清单1]:&[主机清单2],同时在两个清单内的主机会执行。
可以使用逻辑非关系,例如[主机清单1]:![主机清单2],在主机清单1里,但不在主机清单2里的主机会执行,其实就是排除主机清单2内的主机。
可以将以上逻辑综合使用,例如test1:test2:&test3:!test4。
可以使用正则表达式,例如~test1|test2。
ansible-valut encrypt xxx.yml # 加密一个playbook文件
ansible-valut decrypt xxx.yml # 解密一个playbook文件
ansible-valut view xxx.yml # 查看一个加密的playbook文件
ansible-console控制台命令:
提示符格式:
执行用户@当前操作的主机组 (当前主机组内主机数量)[f:并发数]$
root@all (5)[f:5]$ list  # 列出当前主机组主机列表
10.20.120.231
10.20.120.240
10.20.120.242
10.20.120.220
10.20.120.237
root@all (5)[f:5]$ cd test  # 切换主机组
root@test (5)[f:5]$ forks 10  # 设置并发数为10
ansible-galaxy list # 列出所有已安装的galaxy
ansible-galaxy install geerlingguy.mysql # 安装galaxy
ansible-galaxy remove geerlingguy.mysql # 删除galaxy
ansible常用模块:
1.command模块
例:ansible all -m command -a 'chdir=/home/ ls -a'
默认模块,可以执行常见的linux命令,但有一定的局限性,不能输入带标点符号的命令,如:输入重定向、输出重定向、管道符、变量。
2.shell模块
例:ansible all -m shell -a 'creates=/data/1.txt mkdir /data/ touch /data/1.txt' # 如果1.txt文件存在就不执行命令,不存在则执行
ansible all -m shell -a 'chdir=/' # 切换当前位置到根目录
shell模块可以执行带标点符号的命令,但也不能太过复杂。
3.script模块
ansible all -m script -a 'test.sh'
把脚本传送到主机,再执行。
4.copy模块
ansible all -m copy -a 'src=/root/test.sh dest=/root/test.sh owner=root mode=600 backup=yes' # 复制文件,并设置属主,权限。backup:目标主机有同文件名但不同内容的文件自动备份
ansible all -m copy -a 'src=/etc/ dest=/root' # 复制etc目录下的所有文件到远程主机,但不复制整个目录
ansible all -m copy -a "content='1234' dest=/root/1.txt" # 指定内容,直接生成目标文件。
将ansible主控端复制文件至远程主机。可以复制整个目录。
5.fetch模块
ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/'
将远程主机的文件拷贝到本机,不支持拷贝目录。src必须是文件,dest必须是目录。
5.user模块
echo '123456' | openssl passwd -1 -stdin # 获取密文经过MD5加密后的值
ansible all -m user -a 'name=ma password=[MD5密文] state=present' # 创建新用户,并设置密码
ansible all -m user -a 'name=ma shell=/bin/nologin append=true' # 修改用户的登陆shell,append表示覆盖属性
ansible all -m user -a 'name=ma state=absent remove=true' # 删除用户,remove表示删除用户家目录
6.yum模块
absible all -m yum -a 'name="*" state=absent' # 升级系统中的所有软件包
ansible all -m yum -a 'name=httpd state=present' # 使用yum安装httpd软件包
ansible all -m yum -a 'name=httpd state=absent' # 使用yum卸载httpd软件包
7.service模块
ansible all -m service -a 'name=httpd state=started enabled=yes' # 启动httpd服务并设置开机自启动
使用systemd对程序进行生命周期管理,state支持started、stopped、restarted。
8.file模块
ansible all -m file -a 'path=/root/1.txt state=touch' # 创建文件
对文件或目录进行操作,支持的state有touch、directory、absent等
9.setup模块
ansible all -m setup -a 'filter=ansible_all_ipv4_addresses' # 对系统的信息进行收集,并按照key值过滤出一部分。
10.unarchive模块
ansible all -m unarchive -a 'src=xxx.tar.gz dest=/usr/local/ copy=yes'
当copy为yes时,将ansible主控机中的压缩包拷贝到远程主机进行解压
当copy为no时,读取远程主机src中的路径进行解压。
11.template模块
ansible all -m template -a 'src=test.j2 dest=/usr/local/'
与copy模块功能类似,不同的是template模块会按照模板中的语法进行拷贝。
template模块默认会在当前执行目录templates目录下读取src指定的文件。
PlayBook文件示例:
- hosts: [主机清单名] remote_user: root # 可选,操作的用户身份 gather_facts: no # 可选,关闭收集主机信息,可加快执行速度 vars: - variable: 123 vars_files: - var.yaml tasks: - name: install nginx # 任务名称 yum: name=nginx state=present # model: parmeter tags: - install # 命令行-t指定tag可单独执行该模块 - name: start nginx service and enable power on service: name=nginx state=started enabled=yes when: ansible_hostname == "hostname" # 当远程主机名满足条件则执行该模块 - name: copy config copy: src=123.conf dest=/etc/nginx/conf.d/{{ variable }}.conf notify: - stop nginx # 定义一个触发器,模块执行结果为change则触发下方定义的handlers handlers: - name: stop nginx service: name=nginx state=stopped
ansible中使用变量:
1.直接在yaml中使用vars定义变量,使用{{ xxx }}引用
2.直接在yaml文件中引用setup模块定义的变量:{{ ansible_system }},需要gather_facts=yes
3.执行命令时定义变量,例如ansible-playbook -e key=value,调用方法同上。
4.创建一个yaml变量文件,格式为key: value一行一个。然后在剧本yaml中引用变量文件,使用vars_files参数。
5.在主机清单中定义变量。
ansible使用jianjia2模板:
四则运算:
{{ ansible_processor_vcpus ** 2 }}
{{ ansible_processor_vcpus + 4 }}
流程控制:
①使用列表
vim templates/test.j2
{% for i in list %}
server {{ i }}
{% endfor %}
vim playbook.yaml
- hosts: test vars: list: # 定义一个变量为一个列表 - a - b - c tasks: - name: copy config template: src=nginx.j2 dest=/etc/nginx/nginx.conf # template模块默认会在当前执行目录templates目录下读取src指定的文件。
②使用字典
vim templates/test.j2
{% for i in dict %}
server {{ i }}
{% endfor %}
vim playbook.yaml
- hosts: test vars: dict: # 定义一个变量,列表中的元素为字典 - name: a - name: b - name: c tasks: - name: copy config template: src=nginx.j2 dest=/etc/nginx/nginx.conf
③使用if判断
vim templates/test.j2
{% for i in list %}
server {{ i.name }}
{% if i.number is defind %}  # 如果字典中number键存在,则执行
number {{ i.number }}
{% endif %}
{% endfor %}
vim playbook.yaml
- hosts: test vars: dict: - name: a - name: b number: 2 - name: c number: 3 tasks: - name: copy config template: src=nginx.j2 dest=/etc/nginx/nginx.conf
playbook使用迭代:
- hosts: test remote_user: root tasks: - name: create group group: name={{ item }} state=present # item是对列表中元素的引用 with_items: # 根据列表的元素数量,重复执行当前模块 - majiajun1 - majiajun2 - majiajun3 - name: create user user: name={{ item.name }} group={{ item.group }} state=present # 对列表中字典的引用 with_items: - name: majiajun1 group: majiajun1 - name: majiajun2 group: majiajun2 - name: majiajun3 group: majiajun3
role编写实例:
目录结构:


vi userconf.yaml # 与roles在同级目录,用于指定操作主机和变量的输入
- hosts: [主机清单] roles: - git - user
vi git/tasks/main.yaml
- include: create_dir.yaml - include: git_checkout.yaml - include: static_git_pull.yaml
vi git/tasks/create_dir.yaml
- name: test task
  shell: echo test
vi git/vars/main.yaml
test1: 1 test2: 2
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号