ansible

Ansible 学习

visudo sudo权限
useradd -aG wheel sun 保留原来的组,追加sudo
yum源 /etc/yum.repos.d/base.repo
echo export EDITOR=vim >> /etc/profile.d/env.sh
systemctl is-enabled vsftpd
ss -tln|grep 80 查看端口
hostnamectl set-hostname node1
getent group

1,安装

yum install -y ansible

2,查看

yum -ql ansible | less

3,举例

ansible server -m ping -k :走的是ssh协议

-m 模块 -k 密码

服务器列表放在 /etc/ansible/hosts ,
用all代替全部服务器
用[]分组

加速SSH的方法
服务器上 /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no

服务器和记住的主机 /root/.ssh/known_hosts
/etc/ansible/ansible.cfg中
host_key_checking = False,不用服务器的hostkey
log_path=/var/log/ansible.log 打开日志

建议建议居于key验证
ssh-keygen
ssh-copy-id 192.168.153.101

4,ansible帮助

ansible-doc -l / -a / -s command

5, ansible 命令
ansible server -m 模块 -a 参数 -v 查看详细过程 --list 查看主机列表
-u 用户 -K sudo

ansible 192.168.153.101 -m command -a 'ls -l /root/' -u sun -k -b -K

主机列表,与&,或:,非!alist:blist:&clist:!dlist ,用单引号
正则表达 用双引号 “~(web|db)" 用~开头

6,常见模块 ansible-doc 模块
command 可以不用写,不支持|,;,&,$等
shell 可以执行 ansible serlist -m shell -a 'echo medu|passwd --stdin test1'
script 运行脚本 ansible 192.168.153.101 -m script -a '/root/ansible/host.sh'
copy ansible serlist -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'
fetch 和copy相反
file 模块
hostname
cron
ansible 192.168.153.101 -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'
ansible 192.168.153.101 -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
yum ansible 192.168.153.101 -m yum -a 'name=vsftpd'
service
user ansible webser -m user -a 'name=nginx shell='sbin/nologin system=yes home=/var/nginx groups=root comment="nginx server"'
group

7,galaxy
galaxy.ansible.com查看下载rules (一堆文件的集合)
ansible-galaxy list *****
ansible-galaxy install/remove *****

8.ansible-vault
ansible-vault decrypt *.yml
ansible-vault encrypt *.yml
ansible-vault view *.yml
ansible-vault edit *.yml
ansible-vault reky *.yml

9.ansible-console交互式工具

10,playbook
'''


  • hosts: serlist
    remote_user: root

    tasks:

    • name: test1
      command: hostname
      '''
      列表 -
      K/V k:v {k1: v1,k2: v2}

ansible-playbook -C file.yml 检查语法
--check检查
--list-hosts 列出服务器
--list-tasks 列出任务
--list-tages 列出标签
--limit 主机 只争对特定主机

'''

  • hosts: 192.168.153.101
    remote_user: root

    tasks:

    • name: create new file
      file: name=/data/newfile state=touch
    • name: create new user
      user: name=test1 system=yes shell=/sbin/nologin
    • name: install package
      yum: name=httpd
    • name: copy html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    • name: start service
      service: name=httpd state=started enabled=yes
      '''
      如果命令出错还想继续
      shell: /usr/bin/command || /bin/true
      ignore_errors: True

handlers当资源触发时执行
nofify通知
’''


  • hosts: 192.168.153.101
    remote_user: root

    tasks:

    • name: install httpd package
      yum: name=httpd
    • name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart service
    • name: start service
      service: name=httpd state=started enabled=yes
      tages: rshttpd

    handlers:

    • name: restart service
      service: name=httpd state=restarted
      '''
      ansible-playbook -t rshttpd http.yml 指定标签执行
      ansible 192.168.153.101 -m setup | less 查看服务器信息
      ansible 192.168.153.101 -m setup -a 'filter=ansible_×'

使用变量
ansible-playbook -e 'pkname=vsftpd' app.yml
'''


  • hosts: 192.168.153.101
    remote_user: root

    tasks:

    • name: install package
      yum: name={{ pkname }}
    • name: start service
      service: name={{ pkname }} state=started enabled=yes
      '''
      程序里使用变量
  • hosts: 192.168.153.101
    remote_user: root
    vars:

    • pkname1: httpd
    • pkname2: vsftpd
      可以在/etc/ansible/hosts中定义
      server1 var=l1
      [webserver:vars]
      var1=z1
      var2=z2
      直接文件里写入变量 eg vars.yml
  • hosts: 192.168.153.101
    remote_user: root
    vars_files:

    • vars.yml
      使用模板
      放到templates目录 file.j2
    • name: create some file
      template: src=file2.j2 dest=/data/x.conf
      when语句
    • name: install package
      yum: name={{ pkname }}
      when: ansible_os_family == "RedHat"
      循环建文件
    • name: create some file
      file: name=/data/{{ item }} state=touch
      with_items:
      -file1:
      -file2:
      -file3:
      嵌套变量
    • name: create some users
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
      -{name:'user1',group:'g01'}
      -{name:'user2',group:'g02'}
      -{name:'user3',group:'g03'}
      循环判断
      {% for a in all %} dosomthing {% endfor %}
      {% if %} {% endif %}
      {{ a.listion | default('80 default_server') }}

在有的时候play的结果依赖于变量、fact或者是前一个任务的执行结果,从而需要使用到条件语句。
一、when
有的时候在特定的主机需要跳过特定的步骤,例如在安装包的时候,需要指定主机的操作系统类型,或者是当操作系统的硬盘满了之后,需要清空文件等,可以使用when语句来做判断 。when关键字后面跟着的是python的表达式,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务
1、基本用法,示例:


  • name: Install VIM
    hosts: all tasks:

    • name:Install VIM via yum
      yum: name=vim-enhanced state=installed
      when: ansible_os_family =="RedHat"
    • name:Install VIM via apt
      apt: name=vim state=installed
      when: ansible_os_family =="Debian"
    • name: Unexpected OS family
      debug: msg="OS Family {{ ansible_os_family }} is not supported" fail=yes
      when: not ansible_os_family =="RedHat" or ansible_os_family =="Debian"
      条件语句还有一种用法,它还可以让你当达到一定的条件的时候暂停下来,等待你的输入确认。一般情况下,当ansible遭遇到error时,它会直接结束运行。那其实你可以当遭遇到不是预期的情况的时候给使用pause模块,这样可以让用户自己决定是否继续运行任务:
  • name: pause for unexpected conditions
    pause: prompt="Unexpected OS"
    when: ansible_os_family !="RedHat"
    2、在when中使用jinja2的语法,示例:
    tasks:

    • command: /bin/false
      register: result #将命令执行的结果传递给result变量
      ignore_errors: True #忽略错误
    • command: /bin/something
      when: result|failed #如果注册变量的值 是任务failed则返回true
    • command: /bin/something_else
      when: result|success #如果注册变量的值是任务success则返回true
    • command: /bin/still/something_else
      when: result|skipped #如果注册变量的值是任务skipped则返回true
    • command: /bin/foo
      when: result|changed #如果注册变量的值是任务changed则返回true
  • hosts: all
    user: root
    vars:
    epic: true
    tasks: - shell: echo "This certainly is epic!" when: epic

    • shell: echo "This certainly is not epic!"
      when: not epic
      4、如果变量不存在,则可以通过jinja2的'defined'命令跳过,示例:
      tasks:
    • shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined
    • fail: msg="Bailing out. this play requires 'bar'"
      when: bar is not defined
      5、when在循环语句中的使用方法,示例:
      tasks:
    • command: echo {{ item }}
      with_items: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 56、在include和roles中使用when:
      在include中使用的示例:- include: tasks/sometasks.yml
      when: "'reticulating splines' in output"
      在roles中使用的示例:- hosts: webservers
      roles:
    • { role: debian_stock_config, when: ansible_os_family == 'Debian' }
      二、条件导入
      有些时候,你也许想在一个Playbook中以不同的方式做事,比如说在debian和centos上安装apache,apache的包名不同,除了when语句,还可以使用下面的示例来解决:

  • hosts: all
    remote_user: root
    vars_files:
    • "vars/common.yml"
    • [ "vars/{{ ansible_os_family }}.yml", "vars/os_defaults.yml" ]
      tasks:
    • name: make sure apache is running
      service: name={{ apache }} state=running很多不同的yml文件只是包含键和值,如下:

for vars/CentOS.yml

apache: httpd
somethingelse: 42
如果操作系统是’CentOS’, Ansible导入的第一个文件将是’vars/CentOS.yml’,紧接着 是’/var/os_defaults.yml’,如果这个文件不存在。而且在列表中没有找到,就会报错。 在Debian系统中,最先查看的将是’vars/Debian.yml’而不是’vars/CentOS.yml’, 如果没找到,则寻找默认文件’vars/os_defaults.yml’。

三、with_first_found
有些时候,我们想基于不同的操作系统,选择不同的配置文件,及配置文件的存放路径,可以借助with_first_found来解决:

  • name: template a file
    template: src={{ item }} dest=/etc/myapp/foo.conf
    with_first_found:

    • files:
      • {{ ansible_distribution }}.conf
      • default.conf
        paths:
      • search_location_one/somedir/
      • /opt/other_location/somedir/
        四、failed_when
        failed_when其实是ansible的一种错误处理机制,是由fail模块使用了when条件语句的组合效果。示例如下:
  • name: this command prints FAILED when it fails
    command: /usr/bin/example-command -x -y -z
    register: command_result
    failed_when: "'FAILED' in command_result.stderr"我们也可以直接通过fail模块和when条件语句,写成如下:

  • name: this command prints FAILED when it fails
    command: /usr/bin/example-command -x -y -z
    register: command_result
    ignore_errors: True

  • name: fail the play if the previous command did not succeed
    fail: msg="the command failed"
    when: "'FAILED' in command_result.stderr"五、changed_when
    当我们控制一些远程主机执行某些任务时,当任务在远程主机上成功执行,状态发生更改时,会返回changed状态响应,状态未发生更改时,会返回OK状态响应,当任务被跳过时,会返回skipped状态响应。我们可以通过changed_when来手动更改changed响应状态。示例如下:

    • shell: /usr/bin/billybass --mode="take me to the river"
      register: bass_result
      changed_when: "bass_result.rc != 2" #只有该条task执行以后,bass_result.rc的值不为2时,才会返回changed状态

    this will never report 'changed' status

    • shell: wall 'beep'
      changed_when: False #当changed_when为false时,该条task在执行以后,永远不会返回changed状态
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容